diff --git a/.gn b/.gn index 5f02752..b7734ea 100644 --- a/.gn +++ b/.gn
@@ -75,26 +75,9 @@ "//chrome/test:*", # 2682 errors "//clank/third_party/gvr_shim:*", # 1 error - "//extensions/browser/api/alarms:*", # 2 errors - "//extensions/browser/api/app_current_window_internal:*", # 3 errors - "//extensions/browser/api/app_runtime:*", # 3 errors - "//extensions/browser/api/app_window:*", # 5 errors - "//extensions/browser/api/automation_internal:*", # 37 errors - "//extensions/browser/api/bluetooth_low_energy:*", # 22 errors - "//extensions/browser/api/bluetooth_socket:*", # 12 errors - "//extensions/browser/api/cast_channel:*", # 3 errors "//extensions/browser/api/declarative:*", # 20 errors "//extensions/browser/api/declarative_net_request:*", # 18 errors "//extensions/browser/api/declarative_webrequest:*", # 29 errors - "//extensions/browser/api/dns:*", # 3 errors - "//extensions/browser/api/document_scan:*", # 2 errors - "//extensions/browser/api/feedback_private:*", # 2 errors - "//extensions/browser/api/file_handlers:*", # 3 errors - "//extensions/browser/api/file_system:*", # 1 error - "//extensions/browser/api/hid:*", # 12 errors - "//extensions/browser/api/idle:*", # 4 errors - "//extensions/browser/api/test:*", # 1 error - "//extensions/browser/api/usb:*", # 12 errors "//extensions/browser/api/web_request:*", # 37 errors "//extensions/browser/api:*", # 7 errors "//extensions/browser:*", # 20 errors
diff --git a/DEPS b/DEPS index 8b654e3..4b86c444 100644 --- a/DEPS +++ b/DEPS
@@ -199,11 +199,11 @@ # 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': '863497b7fea493d66adb5559a4e24d2a7168b837', + 'skia_revision': '7f942e46fda2b45a095a15e372b51b1dadb41560', # 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': 'c369eee9f5827733bc6784843744c4ac8a9bea0b', + 'v8_revision': '980c42831556b1dad5936edd3dabe6286a7bfc04', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -211,15 +211,15 @@ # 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': '41a1920e352051b7134d1087ac08b4125d5a5dc2', + 'angle_revision': '80308e20a5612bc107fa164fa0f848905e3a1bf1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': 'aba242b50921817e2575589bc95206e2c3f4bd33', + 'swiftshader_revision': '673a7fe5c3ff6686c98951cafb24a93ca5bd1303', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '031723f7a72c33fd107a1d51d6f6bce88a4ee77d', + 'pdfium_revision': '749f2f7e7e181616c364c16350d09d16aa06248a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -246,7 +246,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling NaCl # and whatever else without interference from each other. - 'nacl_revision': '8db20f20316f13d8886a2732099f5bb880568663', + 'nacl_revision': '4de55da44c4b511989359381e8b7a88a01fe0634', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -270,7 +270,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': 'cabcb01f6f2e197d68e2692182e877871ff6993d', + 'catapult_revision': 'b013189435214678a03efbccd9f191217917a8b4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -278,7 +278,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': '1c0c108e0e8150bb0c4b4b404f6eeb78f391d18e', + 'devtools_frontend_revision': 'd4ba153d118dae7a3ce095635d4700bf9c7324b9', # 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. @@ -318,7 +318,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': '2831f0584028114a8896059ce00e7bddaf3bba1f', + 'dawn_revision': '02fd17c75403a399672c65aa98e577c7c2ae9010', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -346,7 +346,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling nearby # and whatever else without interference from each other. - 'nearby_revision': 'f02498f17e4903d913b08c33bde0dc800d3eced9', + 'nearby_revision': '7069c5710741dab014060f677a10d4e89db68a77', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling securemessage # and whatever else without interference from each other. @@ -357,7 +357,7 @@ 'ukey2_revision': '0275885d8e6038c39b8a8ca55e75d1d4d1727f47', # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'tint_revision': 'a2fa690cda4658bef40528d866296e3033542e2d', + 'tint_revision': '7b7d69854d8d33c97b48795ec350d783dd09dd6a', # TODO(crbug.com/941824): The values below need to be kept in sync # between //DEPS and //buildtools/DEPS, so if you're updating one, @@ -905,7 +905,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '6b6e48934806244f023e90939bcde2163a6b0c6c', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '399c5918bf47ff1fe8477f27b57fa0e8c67e438d', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1270,7 +1270,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '6a605833d9b393d20d9fee45830dd3997599c2be', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f69ae0481064617cba71c34be1570fa56b49d076', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1348,7 +1348,7 @@ 'packages': [ { 'package': 'fuchsia/third_party/aemu/linux-amd64', - 'version': 'BJKsuvEy1d1R4k1qe_4WGn47cAA9BDUVDaMnfbyiH-cC' + 'version': 'fgqPh4vMT-6GD9uD_448v5P_p2YQvRYC0cUROIslzakC' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -1479,7 +1479,7 @@ 'src/third_party/usrsctp/usrsctplib': Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + 'a6647318b57c0a05d590c8c21fc22aba87f08749', - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@760f29e0ac1fe62c0f94b9a77cf32c8a8390d395', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@4dc6ccfad74a3ebb2623bceefff002243d595048', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'b1d65a2b3373fe12c622eaab65e5cf21b906d178', @@ -1506,7 +1506,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '66460536ee975a3e98931b7b40a661a63fd9cd57', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '54ea85c2cd3a2cb1b8f440a71aa9676a9b88135c', + Var('webrtc_git') + '/src.git' + '@' + '028d5be9c72cbeddce8236f68ed177a512bc67d8', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1544,7 +1544,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/linux-amd64', - 'version': 'RCW4v6H43n2nkU3V54jWsXz5Q1h_OZaV_DcRQNXMV4sC', + 'version': 'lenVc-lo77pTtOxFWjwWnArJLXKHftA-J-nOq_0W8EMC', }, ], 'dep_type': 'cipd', @@ -1554,7 +1554,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/windows-amd64', - 'version': 'XMdzQyfm6ZBS1E6dZSblabBo-_I49Cf38UhKjkyukC8C', + 'version': 'Evb_hYwKX21F3mSBdnoPa1gPiJlejpLrfECXIpdrrqgC', }, ], 'dep_type': 'cipd', @@ -1564,7 +1564,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/mac-amd64', - 'version': 'hwxykGQN8q1I4nBPA93MSwNqdynaW_gYQ3CJwZJLyngC', + 'version': 'n5BYBVoiLzVMumXdheNmsUhTHYTpm2CAcb9W2KcPZA8C', }, ], 'dep_type': 'cipd', @@ -1578,7 +1578,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@c215bbd55fd0fc26a9534a174efd9cf086bc70fa', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@580696a876233dccc6abd3eea0acec46f8da1ced', 'condition': 'checkout_src_internal', },
diff --git a/PRESUBMIT.py b/PRESUBMIT.py index e699075..5aca119 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py
@@ -352,8 +352,6 @@ "^docs/ui/learn/bestpractices/layout\\.md", '^extensions/browser/', '^extensions/renderer/', - '^media/blink/webmediaplayer_impl.cc', - '^media/blink/webmediaplayer_impl.h', '^ppapi/proxy/', '^third_party/blink/PRESUBMIT_test.py', # Intentional. '^third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py' # Intentional pylint: disable=line-too-long
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 6d41a817..35cafd95 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -2239,6 +2239,7 @@ "system/message_center/ash_message_popup_collection_unittest.cc", "system/message_center/inactive_user_notification_blocker_unittest.cc", "system/message_center/message_center_ui_controller_unittest.cc", + "system/message_center/message_center_utils_unittest.cc", "system/message_center/notification_swipe_control_view_unittest.cc", "system/message_center/notifier_settings_view_unittest.cc", "system/message_center/session_state_notification_blocker_unittest.cc",
diff --git a/ash/accelerometer/accelerometer_file_reader.h b/ash/accelerometer/accelerometer_file_reader.h index 4f6503e6..d915ccb 100644 --- a/ash/accelerometer/accelerometer_file_reader.h +++ b/ash/accelerometer/accelerometer_file_reader.h
@@ -15,6 +15,8 @@ namespace ash { +enum class State { INITIALIZING, SUCCESS, FAILED }; + // Work that runs on a base::TaskRunner. It determines the accelerometer // configuration, and reads the data. Upon a successful read it will notify // all observers. @@ -115,6 +117,9 @@ void EnableAccelerometerReading(); void DisableAccelerometerReading(); + // The current initialization state of reader. + State initialization_state_ = State::INITIALIZING; + // Attempts to read the accelerometer data in |blocking_task_runner_|. Upon a // success, converts the raw reading to an AccelerometerUpdate and notifies // observers.
diff --git a/ash/accelerometer/accelerometer_provider_mojo.cc b/ash/accelerometer/accelerometer_provider_mojo.cc index 912c0d4..934fe434 100644 --- a/ash/accelerometer/accelerometer_provider_mojo.cc +++ b/ash/accelerometer/accelerometer_provider_mojo.cc
@@ -26,6 +26,10 @@ constexpr base::TimeDelta kDelayReconnect = base::TimeDelta::FromMilliseconds(1000); +// Timeout for the late-present devices: 10 seconds. +constexpr base::TimeDelta kNewDevicesTimeout = + base::TimeDelta::FromMilliseconds(10000); + } // namespace AccelerometerProviderMojo::AccelerometerProviderMojo() = default; @@ -60,6 +64,8 @@ sensor_service_remote_.Bind(std::move(pending_remote)); sensor_service_remote_.set_disconnect_handler(base::BindOnce( &AccelerometerProviderMojo::OnSensorServiceDisconnect, this)); + SetNewDevicesObserver(); + if (GetECLidAngleDriverStatus() == ECLidAngleDriverStatus::UNKNOWN) { sensor_service_remote_->GetDeviceIds( chromeos::sensors::mojom::DeviceType::ANGL, @@ -73,7 +79,30 @@ this)); } -State AccelerometerProviderMojo::GetInitializationStateForTesting() const { +void AccelerometerProviderMojo::OnNewDeviceAdded( + int32_t iio_device_id, + const std::vector<chromeos::sensors::mojom::DeviceType>& types) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK_NE(initialization_state_, MojoState::ANGL_LID); + + for (const auto& type : types) { + if (type == chromeos::sensors::mojom::DeviceType::ACCEL) { + if (initialization_state_ == MojoState::LID_BASE) { + // Don't need a new accelerometer. + continue; + } + + if (accelerometers_.find(iio_device_id) != accelerometers_.end()) + continue; + + RegisterAccelerometerWithId(iio_device_id); + } else if (type == chromeos::sensors::mojom::DeviceType::ANGL) { + SetECLidAngleDriverSupported(); + } + } +} + +MojoState AccelerometerProviderMojo::GetInitializationStateForTesting() const { return initialization_state_; } @@ -135,34 +164,222 @@ accelerometer.second.remote.reset(); accelerometer.second.samples_observer.reset(); } + + new_devices_observer_.reset(); sensor_service_remote_.reset(); } -void AccelerometerProviderMojo::GetLidAngleIdsCallback( - const std::vector<int32_t>& lid_angle_ids) { +void AccelerometerProviderMojo::SetECLidAngleDriverSupported() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_EQ(GetECLidAngleDriverStatus(), ECLidAngleDriverStatus::UNKNOWN); - if (!lid_angle_ids.empty()) { - SetECLidAngleDriverStatus(ECLidAngleDriverStatus::SUPPORTED); - } else { - SetECLidAngleDriverStatus(ECLidAngleDriverStatus::NOT_SUPPORTED); - EnableAccelerometerReading(); + if (GetECLidAngleDriverStatus() == ECLidAngleDriverStatus::SUPPORTED) + return; + + DCHECK_NE(initialization_state_, MojoState::ANGL); + DCHECK_NE(initialization_state_, MojoState::ANGL_LID); + + if (GetECLidAngleDriverStatus() == ECLidAngleDriverStatus::NOT_SUPPORTED) { + // |GetECLidAngleDriverStatus()| will be set to NOT_SUPPORTED when waiting + // for new devices is timed out. However, this function may still be called + // after the timeout and when that happens, we'll need to overwrite the + // status and revert some changes. + LOG(WARNING) << "Overwriting ECLidAngleDriverStatus from NOT_SUPPORTED " + "to SUPPORTED"; + + // Restarts to listen to TabletPhysicalStateChanged from + // TabletModeController. Allows the enabled samples when setting + // ECLidAngleDriverStatus to SUPPORTED. + StartListenToTabletModeController(); } + SetECLidAngleDriverStatus(ECLidAngleDriverStatus::SUPPORTED); + + if (pending_on_tablet_physical_state_changed_) + OnTabletPhysicalStateChanged(); + + UpdateStateWithECLidAngleDriverSupported(); +} + +void AccelerometerProviderMojo::UpdateStateWithECLidAngleDriverSupported() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + switch (initialization_state_) { + case MojoState::INITIALIZING: + initialization_state_ = MojoState::ANGL; + break; + + case MojoState::BASE: { + initialization_state_ = MojoState::ANGL; + + // Ignores the base-accelerometer as it's no longer needed for the only + // use case: calculating the angle between the lid and the base, which is + // substituted by the driver. + auto it = location_to_accelerometer_id_.find( + ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD); + DCHECK(it != location_to_accelerometer_id_.end()); + IgnoreAccelerometer(it->second); + break; + } + + case MojoState::LID: + initialization_state_ = MojoState::ANGL_LID; + break; + + case MojoState::LID_BASE: { + initialization_state_ = MojoState::ANGL_LID; + + // Ignores the base-accelerometer as it's no longer needed for the only + // use case: calculating the angle between the lid and the base, which is + // substituted by the driver. + auto it = location_to_accelerometer_id_.find( + ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD); + DCHECK(it != location_to_accelerometer_id_.end()); + IgnoreAccelerometer(it->second); + break; + } + + default: + LOG(FATAL) << "Unexpected state: " + << static_cast<int32_t>(initialization_state_); + break; + } + + if (initialization_state_ == MojoState::ANGL_LID) + new_devices_observer_.reset(); +} + +void AccelerometerProviderMojo::UpdateStateWithLidAccelerometer() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + switch (initialization_state_) { + case MojoState::INITIALIZING: + initialization_state_ = MojoState::LID; + break; + + case MojoState::BASE: { + initialization_state_ = MojoState::LID_BASE; + + auto it = location_to_accelerometer_id_.find( + ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD); + DCHECK(it != location_to_accelerometer_id_.end()); + if (accelerometers_[it->second].samples_observer.get()) + accelerometers_[it->second].samples_observer->SetEnabled(true); + + break; + } + + case MojoState::ANGL: + initialization_state_ = MojoState::ANGL_LID; + new_devices_observer_.reset(); + break; + + default: + LOG(FATAL) << "Unexpected state: " + << static_cast<int32_t>(initialization_state_); + break; + } +} + +void AccelerometerProviderMojo::UpdateStateWithBaseAccelerometer() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + switch (initialization_state_) { + case MojoState::INITIALIZING: + initialization_state_ = MojoState::BASE; + break; + + case MojoState::LID: + initialization_state_ = MojoState::LID_BASE; + break; + + case MojoState::ANGL: + case MojoState::ANGL_LID: { + // Ignores the base-accelerometer as it's no longer needed for the only + // use case: calculating the angle between the lid and the base, which is + // substituted by the driver. + auto it = location_to_accelerometer_id_.find( + ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD); + DCHECK(it != location_to_accelerometer_id_.end()); + IgnoreAccelerometer(it->second); + break; + } + + default: + LOG(FATAL) << "Unexpected state: " + << static_cast<int32_t>(initialization_state_); + break; + } +} + +void AccelerometerProviderMojo::SetNewDevicesObserver() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(sensor_service_remote_.is_bound()); + DCHECK(!new_devices_observer_.is_bound()); + + if (initialization_state_ == MojoState::ANGL_LID) { + // Don't need any further devices. + return; + } + + sensor_service_remote_->RegisterNewDevicesObserver( + new_devices_observer_.BindNewPipeAndPassRemote()); + new_devices_observer_.set_disconnect_handler(base::BindOnce( + &AccelerometerProviderMojo::OnNewDevicesObserverDisconnect, this)); + + ui_task_runner_->PostDelayedTask( + FROM_HERE, + base::BindOnce(&AccelerometerProviderMojo::OnNewDevicesTimeout, this), + kNewDevicesTimeout); +} + +void AccelerometerProviderMojo::AccelerometerProviderMojo:: + OnNewDevicesObserverDisconnect() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + LOG(ERROR) + << "OnNewDevicesObserverDisconnect, resetting SensorService as IIO " + "Service should be destructed and waiting for the relaunch of it."; + ResetSensorService(); +} + +void AccelerometerProviderMojo::OnNewDevicesTimeout() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + if (!sensor_service_remote_.is_bound()) { + // Skips and waits for the next timeout for the case that IIO Service + // disconnects after the first connection. + return; + } + + if (GetECLidAngleDriverStatus() != ECLidAngleDriverStatus::UNKNOWN) + return; + + if (initialization_state_ == MojoState::INITIALIZING || + initialization_state_ == MojoState::BASE || + initialization_state_ == MojoState::ANGL) { + LOG(ERROR) << "Unfinished initialization after timeout: " + << static_cast<int32_t>(initialization_state_); + } + + SetECLidAngleDriverStatus(ECLidAngleDriverStatus::NOT_SUPPORTED); + EnableAccelerometerReading(); + if (pending_on_tablet_physical_state_changed_) OnTabletPhysicalStateChanged(); } +void AccelerometerProviderMojo::GetLidAngleIdsCallback( + const std::vector<int32_t>& lid_angle_ids) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + if (!lid_angle_ids.empty()) + SetECLidAngleDriverSupported(); +} + void AccelerometerProviderMojo::GetAccelerometerIdsCallback( const std::vector<int32_t>& accelerometer_ids) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (accelerometer_ids.empty()) { - FailedToInitialize(); - return; - } - for (int32_t id : accelerometer_ids) RegisterAccelerometerWithId(id); } @@ -198,16 +415,24 @@ if (!accelerometer.scale.has_value()) attr_names.push_back(chromeos::sensors::mojom::kScale); - if (!attr_names.empty()) { - accelerometer.remote->GetAttributes( - attr_names, - base::BindOnce(&AccelerometerProviderMojo::GetAttributesCallback, this, - id)); - } else { + if (attr_names.empty()) { // Create the observer directly if the attributes have already been // retrieved. CreateAccelerometerSamplesObserver(id); + + return; } + + if (initialization_state_ == MojoState::ANGL_LID || + initialization_state_ == MojoState::LID_BASE) { + // No need of new accelerometers. + return; + } + + accelerometer.remote->GetAttributes( + attr_names, + base::BindOnce(&AccelerometerProviderMojo::GetAttributesCallback, this, + id)); } void AccelerometerProviderMojo::OnAccelerometerRemoteDisconnect(int32_t id) { @@ -256,10 +481,10 @@ if (location_to_accelerometer_id_.find(source) != location_to_accelerometer_id_.end()) { - LOG(ERROR) << "Duplicated location source " << source - << " of accel id: " << id - << ", and accel id: " << location_to_accelerometer_id_[source]; - FailedToInitialize(); + LOG(WARNING) << "Duplicated location source " << source + << " of accel id: " << id << ", and accel id: " + << location_to_accelerometer_id_[source]; + IgnoreAccelerometer(id); return; } @@ -287,7 +512,18 @@ ++index; } - CheckInitialization(); + if (accelerometer.location == ACCELEROMETER_SOURCE_SCREEN) { + UpdateStateWithLidAccelerometer(); + } else { + DCHECK_EQ(accelerometer.location.value(), + ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD); + UpdateStateWithBaseAccelerometer(); + } + + if (accelerometer.ignored) { + // base-accelerometer is not needed if EC Lid Angle Driver is supported. + return; + } CreateAccelerometerSamplesObserver(id); } @@ -300,54 +536,7 @@ LOG(WARNING) << "Ignoring accel with id: " << id; accelerometer.ignored = true; accelerometer.remote.reset(); - - CheckInitialization(); -} - -void AccelerometerProviderMojo::CheckInitialization() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_NE(GetECLidAngleDriverStatus(), ECLidAngleDriverStatus::UNKNOWN); - - if (initialization_state_ != State::INITIALIZING) - return; - - bool has_accelerometer_lid = false; - for (const auto& accelerometer : accelerometers_) { - if (accelerometer.second.ignored) { - if (!accelerometer.second.location.has_value()) - continue; - - if (accelerometer.second.location == ACCELEROMETER_SOURCE_SCREEN || - GetECLidAngleDriverStatus() == - ECLidAngleDriverStatus::NOT_SUPPORTED) { - // This ignored accelerometer is essential. - FailedToInitialize(); - return; - } - - continue; - } - - if (!accelerometer.second.scale.has_value() || - !accelerometer.second.location.has_value()) - return; - - if (accelerometer.second.location == ACCELEROMETER_SOURCE_SCREEN) - has_accelerometer_lid = true; - else - has_accelerometer_base_ = true; - } - - if (has_accelerometer_lid) { - if (!has_accelerometer_base_) { - LOG(WARNING) - << "Initialization succeeded without an accelerometer on the base"; - } - - initialization_state_ = State::SUCCESS; - } else { - FailedToInitialize(); - } + accelerometer.samples_observer.reset(); } void AccelerometerProviderMojo::CreateAccelerometerSamplesObserver(int32_t id) { @@ -372,6 +561,13 @@ base::BindRepeating( &AccelerometerProviderMojo::OnSampleUpdatedCallback, this)); + if (initialization_state_ == MojoState::BASE) { + DCHECK_EQ(accelerometer.location.value(), + ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD); + // Don't need base-accelerometer's samples without lid-accelerometer. + return; + } + if (accelerometer_read_on_) accelerometer.samples_observer->SetEnabled(true); } @@ -383,6 +579,12 @@ return; accelerometer_read_on_ = true; + + if (initialization_state_ == MojoState::BASE) { + // Don't need base-accelerometer's samples without lid-accelerometer. + return; + } + for (auto& accelerometer : accelerometers_) { if (!accelerometer.second.samples_observer.get()) continue; @@ -415,10 +617,8 @@ auto& accelerometer = accelerometers_[iio_device_id]; DCHECK(accelerometer.location.has_value()); - - bool need_two_accelerometers = - (GetECLidAngleDriverStatus() == ECLidAngleDriverStatus::NOT_SUPPORTED && - has_accelerometer_base_); + DCHECK(accelerometer.location == ACCELEROMETER_SOURCE_SCREEN || + initialization_state_ == MojoState::LID_BASE); if (!accelerometer_read_on_) { // This sample is not needed. @@ -428,10 +628,10 @@ update_.Set(accelerometers_[iio_device_id].location.value(), sample[0], sample[1], sample[2]); - if (need_two_accelerometers && + if (initialization_state_ == MojoState::LID_BASE && (!update_.has(ACCELEROMETER_SOURCE_SCREEN) || !update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD))) { - // Wait for the other accel to be updated. + // Wait for the other accelerometer to be updated. return; } @@ -439,16 +639,4 @@ update_.Reset(); } -void AccelerometerProviderMojo::FailedToInitialize() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_NE(initialization_state_, State::SUCCESS); - - LOG(ERROR) << "Failed to initialize for accelerometer read."; - initialization_state_ = State::FAILED; - - accelerometers_.clear(); - ResetSensorService(); - sensor_hal_client_.reset(); -} - } // namespace ash
diff --git a/ash/accelerometer/accelerometer_provider_mojo.h b/ash/accelerometer/accelerometer_provider_mojo.h index 3767075..262ce14 100644 --- a/ash/accelerometer/accelerometer_provider_mojo.h +++ b/ash/accelerometer/accelerometer_provider_mojo.h
@@ -22,13 +22,30 @@ namespace ash { +// As devices may be late-present, the state and available devices cannot be +// determined within any given time or requests. This MojoState helps +// AccelerometerProviderMojo determine the current available devices and +// provides a clear finite state machine. States that should provide samples: +// LID, LID_BASE, ANGL_LID. +enum class MojoState { + INITIALIZING, // No devices available yet. + LID, // Only lid-accelerometer is available. + BASE, // Only base-accelerometer is available. + LID_BASE, // Both accelerometers are available. + ANGL, // Only lid-angle driver is available. + ANGL_LID, // Both lid-angle driver and lid-accelerometer are available. +}; + +class AccelerometerProviderMojoTest; + // Work that runs on the UI thread. As a sensor client, it communicates with IIO // Service, determines the accelerometers' configuration, and waits for the // accelerometers' samples. Upon receiving a sample, it will notify all // observers. class ASH_EXPORT AccelerometerProviderMojo : public AccelerometerProviderInterface, - public chromeos::sensors::mojom::SensorHalClient { + public chromeos::sensors::mojom::SensorHalClient, + public chromeos::sensors::mojom::SensorServiceNewDevicesObserver { public: AccelerometerProviderMojo(); AccelerometerProviderMojo(const AccelerometerProviderMojo&) = delete; @@ -44,13 +61,20 @@ void SetUpChannel(mojo::PendingRemote<chromeos::sensors::mojom::SensorService> pending_remote) override; - State GetInitializationStateForTesting() const; + // chromeos::sensors::mojom::SensorServiceNewDevicesObserver + void OnNewDeviceAdded( + int32_t iio_device_id, + const std::vector<chromeos::sensors::mojom::DeviceType>& types) override; + + MojoState GetInitializationStateForTesting() const; protected: // AccelerometerProviderInterface: bool ShouldDelayOnTabletPhysicalStateChanged() override; private: + friend AccelerometerProviderMojoTest; + struct AccelerometerData { AccelerometerData(); ~AccelerometerData(); @@ -75,6 +99,43 @@ void OnSensorServiceDisconnect(); void ResetSensorService(); + void SetECLidAngleDriverSupported(); + + // Update |initialization_state_| upon new devices' arrival. + + // MojoState (|initialization_state_|) transition: + // INITIALIZING -> ANGL + // LID -> ANGL_LID + // BASE -> ANGL + // ANGL Shouldn't happen + // ANGL_LID Shouldn't happen + void UpdateStateWithECLidAngleDriverSupported(); + + // MojoState (|initialization_state_|) transition: + // INITIALIZING -> LID + // LID Shouldn't happen + // BASE -> LID_BASE + // ANGL -> ANGL_LID + // ANGL_LID Shouldn't happen + void UpdateStateWithLidAccelerometer(); + + // MojoState (|initialization_state_|) transition: + // INITIALIZING -> BASE + // LID -> LID_BASE + // BASE Shouldn't happen + // ANGL -> ANGL + // ANGL_LID -> ANGL_LID + void UpdateStateWithBaseAccelerometer(); + + void SetNewDevicesObserver(); + void OnNewDevicesObserverDisconnect(); + // Timeout of new devices. If lid-angle driver is still not present, assumes + // it not supported and notifies observers. + // This class still listens to new devices after the timeout to catch the + // really late-present devices and avoid those issues, as the current use + // cases/observers allow that. + void OnNewDevicesTimeout(); + // Callback of GetDeviceIds(ANGL), containing the lid-angle device's id if it // exists. void GetLidAngleIdsCallback(const std::vector<int32_t>& lid_angle_ids); @@ -95,8 +156,6 @@ // Ignores the accelerometer as the attributes are not expected. void IgnoreAccelerometer(int32_t id); - // Checks and sets |initialization_state_| if all information is retrieved. - void CheckInitialization(); // Creates the AccelerometerSamplesObserver for the accelerometer with |id|. void CreateAccelerometerSamplesObserver(int32_t id); @@ -109,8 +168,9 @@ // |accelerometers_| map, containing a sample of the accelerometer. void OnSampleUpdatedCallback(int iio_device_id, std::vector<float> sample); - // Sets FAILED to |initialization_state_| due to an error. - void FailedToInitialize(); + // The state that contains the information of devices we have now. Used for + // late-present devices. + MojoState initialization_state_ = MojoState::INITIALIZING; // The Mojo channel connecting to Sensor Hal Dispatcher. mojo::Receiver<chromeos::sensors::mojom::SensorHalClient> sensor_hal_client_{ @@ -119,8 +179,9 @@ // The Mojo channel to query and request for devices. mojo::Remote<chromeos::sensors::mojom::SensorService> sensor_service_remote_; - // The existence of the accelerometer on the base. - bool has_accelerometer_base_ = false; + // The Mojo channel to get notified when new devices are added to IIO Service. + mojo::Receiver<chromeos::sensors::mojom::SensorServiceNewDevicesObserver> + new_devices_observer_{this}; // First is the accelerometer's iio device id, second is it's data, mojo // remote and samples observer.
diff --git a/ash/accelerometer/accelerometer_provider_mojo_unittest.cc b/ash/accelerometer/accelerometer_provider_mojo_unittest.cc index 46e39740..9022807 100644 --- a/ash/accelerometer/accelerometer_provider_mojo_unittest.cc +++ b/ash/accelerometer/accelerometer_provider_mojo_unittest.cc
@@ -9,6 +9,7 @@ #include "ash/accelerometer/accelerometer_constants.h" #include "ash/accelerometer/accelerometer_reader.h" +#include "ash/test/ash_test_helper.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" @@ -33,7 +34,6 @@ class FakeObserver : public AccelerometerReader::Observer { public: void OnECLidAngleDriverStatusChanged(bool is_supported) override { - CHECK(!is_supported_.has_value()); is_supported_ = is_supported; } void OnAccelerometerUpdated(const AccelerometerUpdate& update) override { @@ -54,9 +54,15 @@ AccelerometerUpdate update_; }; +} // namespace + class AccelerometerProviderMojoTest : public ::testing::Test { protected: void SetUp() override { + ash::AshTestHelper::InitParams init_params; + init_params.start_session = false; + ash_test_helper_.SetUp(std::move(init_params)); + sensor_hal_server_ = std::make_unique<chromeos::sensors::FakeSensorHalServer>(); provider_ = new AccelerometerProviderMojo(); @@ -64,11 +70,6 @@ chromeos::sensors::SensorHalDispatcher::Initialize(); provider_->PrepareAndInitialize(); provider_->AddObserver(&observer_); - - AddDevice(kFakeLidAccelerometerId, - chromeos::sensors::mojom::DeviceType::ACCEL, - base::NumberToString(kFakeScaleValue), - kLocationStrings[ACCELEROMETER_SOURCE_SCREEN]); } void TearDown() override { @@ -104,15 +105,46 @@ iio_device_id, std::move(types), std::move(sensor_device)); } + void AddLidAccelerometer() { + AddDevice(kFakeLidAccelerometerId, + chromeos::sensors::mojom::DeviceType::ACCEL, + base::NumberToString(kFakeScaleValue), + kLocationStrings[ACCELEROMETER_SOURCE_SCREEN]); + } + + void TriggerNewDevicesTimeout() { + provider_->OnNewDevicesTimeout(); + + // Wait until task |OnECLidAngleDriverStatusChanged| arrives at |observer_|. + base::RunLoop().RunUntilIdle(); + } + + void TriggerSamples() { + // Simulate a disconnection of IIO Service. + sensor_hal_server_->GetSensorService()->ClearReceivers(); + sensor_hal_server_->OnServerDisconnect(); + + // Wait until the disconnect arrives at the dispatcher. + base::RunLoop().RunUntilIdle(); + + chromeos::sensors::SensorHalDispatcher::GetInstance()->RegisterServer( + sensor_hal_server_->PassRemote()); + + // Wait until a sample is received. + base::RunLoop().RunUntilIdle(); + } + FakeObserver observer_; std::unique_ptr<chromeos::sensors::FakeSensorHalServer> sensor_hal_server_; scoped_refptr<AccelerometerProviderMojo> provider_; - base::test::SingleThreadTaskEnvironment task_environment{ + base::test::TaskEnvironment task_environment{ base::test::TaskEnvironment::MainThreadType::UI}; + ash::AshTestHelper ash_test_helper_; }; TEST_F(AccelerometerProviderMojoTest, CheckNoScale) { + AddLidAccelerometer(); AddDevice(kFakeBaseAccelerometerId, chromeos::sensors::mojom::DeviceType::ACCEL, base::nullopt, kLocationStrings[ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD]); @@ -120,15 +152,19 @@ chromeos::sensors::SensorHalDispatcher::GetInstance()->RegisterServer( sensor_hal_server_->PassRemote()); - // Wait until initialization failed. + // Wait until all tasks done and no samples updated. base::RunLoop().RunUntilIdle(); + // Simulate timeout to check |ec_lid_angle_driver_status_|. + TriggerNewDevicesTimeout(); + EXPECT_TRUE(observer_.is_supported_.has_value()); EXPECT_FALSE(observer_.is_supported_.value()); - EXPECT_EQ(provider_->GetInitializationStateForTesting(), State::FAILED); + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::LID); } TEST_F(AccelerometerProviderMojoTest, CheckNoLocation) { + AddLidAccelerometer(); AddDevice(kFakeBaseAccelerometerId, chromeos::sensors::mojom::DeviceType::ACCEL, base::NumberToString(kFakeScaleValue), base::nullopt); @@ -136,30 +172,38 @@ chromeos::sensors::SensorHalDispatcher::GetInstance()->RegisterServer( sensor_hal_server_->PassRemote()); - // Wait until initialization failed. + // Wait until all tasks done and no samples updated. base::RunLoop().RunUntilIdle(); + // Simulate timeout to check |ec_lid_angle_driver_status_|. + TriggerNewDevicesTimeout(); + EXPECT_TRUE(observer_.is_supported_.has_value()); EXPECT_FALSE(observer_.is_supported_.value()); - EXPECT_EQ(provider_->GetInitializationStateForTesting(), State::SUCCESS); + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::LID); } TEST_F(AccelerometerProviderMojoTest, GetSamplesOfOneAccel) { + AddLidAccelerometer(); chromeos::sensors::SensorHalDispatcher::GetInstance()->RegisterServer( sensor_hal_server_->PassRemote()); // Wait until a sample is received. base::RunLoop().RunUntilIdle(); + // Simulate timeout to check |ec_lid_angle_driver_status_|. + TriggerNewDevicesTimeout(); + EXPECT_TRUE(observer_.is_supported_.has_value()); EXPECT_FALSE(observer_.is_supported_.value()); - EXPECT_EQ(provider_->GetInitializationStateForTesting(), State::SUCCESS); + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::LID); EXPECT_TRUE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); } TEST_F(AccelerometerProviderMojoTest, GetSamplesWithNoLidAngle) { + AddLidAccelerometer(); AddDevice(kFakeBaseAccelerometerId, chromeos::sensors::mojom::DeviceType::ACCEL, base::NumberToString(kFakeScaleValue), @@ -171,9 +215,12 @@ // Wait until samples are received. base::RunLoop().RunUntilIdle(); + // Simulate timeout to check |ec_lid_angle_driver_status_|. + TriggerNewDevicesTimeout(); + EXPECT_TRUE(observer_.is_supported_.has_value()); EXPECT_FALSE(observer_.is_supported_.value()); - EXPECT_EQ(provider_->GetInitializationStateForTesting(), State::SUCCESS); + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::LID_BASE); EXPECT_TRUE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); EXPECT_TRUE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); @@ -182,18 +229,16 @@ // Simulate a disconnection of the accelerometer's mojo channel in IIO // Service. - AddDevice(kFakeLidAccelerometerId, - chromeos::sensors::mojom::DeviceType::ACCEL, - base::NumberToString(kFakeScaleValue), - kLocationStrings[ACCELEROMETER_SOURCE_SCREEN]); + AddLidAccelerometer(); // Wait until the disconnection is done. base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(sensor_hal_server_->GetSensorService()->is_bound()); + EXPECT_FALSE(sensor_hal_server_->GetSensorService()->HasReceivers()); } TEST_F(AccelerometerProviderMojoTest, GetSamplesWithLidAngle) { + AddLidAccelerometer(); AddDevice(kFakeBaseAccelerometerId, chromeos::sensors::mojom::DeviceType::ACCEL, base::NumberToString(kFakeScaleValue), @@ -209,7 +254,7 @@ EXPECT_TRUE(observer_.is_supported_.has_value()); EXPECT_TRUE(observer_.is_supported_.value()); - EXPECT_EQ(provider_->GetInitializationStateForTesting(), State::SUCCESS); + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::ANGL_LID); EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); @@ -226,7 +271,7 @@ observer_.update_.Reset(); // Simulate a disconnection of IIO Service. - sensor_hal_server_->GetSensorService()->OnServiceDisconnect(); + sensor_hal_server_->GetSensorService()->ClearReceivers(); sensor_hal_server_->OnServerDisconnect(); // Wait until the disconnect arrives at the dispatcher. @@ -242,6 +287,157 @@ EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); } -} // namespace +TEST_F(AccelerometerProviderMojoTest, GetSamplesOfNewDevices) { + // New device: lid-accelerometer. + AddLidAccelerometer(); + chromeos::sensors::SensorHalDispatcher::GetInstance()->RegisterServer( + sensor_hal_server_->PassRemote()); + + // Wait until a sample is received. + base::RunLoop().RunUntilIdle(); + + // Simulate timeout to check |ec_lid_angle_driver_status_|. + TriggerNewDevicesTimeout(); + + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::LID); + + EXPECT_TRUE(observer_.is_supported_.has_value()); + EXPECT_FALSE(observer_.is_supported_.value()); + + EXPECT_TRUE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); + EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); + + observer_.update_.Reset(); + + // New device: base-accelerometer. + AddDevice(kFakeBaseAccelerometerId, + chromeos::sensors::mojom::DeviceType::ACCEL, + base::NumberToString(kFakeScaleValue), + kLocationStrings[ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD]); + + TriggerSamples(); + + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::LID_BASE); + + EXPECT_TRUE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); + EXPECT_TRUE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); + + observer_.update_.Reset(); + + // New device: EC Lid Angle Driver. + AddDevice(kFakeLidAngleId, chromeos::sensors::mojom::DeviceType::ANGL, + base::nullopt, base::nullopt); + + TriggerSamples(); + + EXPECT_TRUE(observer_.is_supported_.value()); + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::ANGL_LID); + + EXPECT_TRUE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); + EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); +} + +TEST_F(AccelerometerProviderMojoTest, NoSamplesFromBaseOnly) { + chromeos::sensors::SensorHalDispatcher::GetInstance()->RegisterServer( + sensor_hal_server_->PassRemote()); + + // Wait until a sample is received. + base::RunLoop().RunUntilIdle(); + + EXPECT_EQ(provider_->GetInitializationStateForTesting(), + MojoState::INITIALIZING); + + EXPECT_FALSE(observer_.is_supported_.has_value()); + EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); + EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); + + // New device: base-accelerometer. + AddDevice(kFakeBaseAccelerometerId, + chromeos::sensors::mojom::DeviceType::ACCEL, + base::NumberToString(kFakeScaleValue), + kLocationStrings[ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD]); + + // Wait until all setups are finished and no samples updated. + base::RunLoop().RunUntilIdle(); + + // Simulate timeout to check |ec_lid_angle_driver_status_|. + TriggerNewDevicesTimeout(); + + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::BASE); + + EXPECT_TRUE(observer_.is_supported_.has_value()); + EXPECT_FALSE(observer_.is_supported_.value()); + EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); + EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); + + // New device: lid-accelerometer. + AddLidAccelerometer(); + + TriggerSamples(); + + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::LID_BASE); + + EXPECT_TRUE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); + EXPECT_TRUE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); + + observer_.update_.Reset(); + + // New device: EC Lid Angle Driver. + AddDevice(kFakeLidAngleId, chromeos::sensors::mojom::DeviceType::ANGL, + base::nullopt, base::nullopt); + + TriggerSamples(); + + EXPECT_TRUE(observer_.is_supported_.value()); + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::ANGL_LID); + + EXPECT_TRUE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); + EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); +} + +TEST_F(AccelerometerProviderMojoTest, NoSamplesFromLidAngle) { + // New device: EC Lid Angle Driver. + AddDevice(kFakeLidAngleId, chromeos::sensors::mojom::DeviceType::ANGL, + base::nullopt, base::nullopt); + + chromeos::sensors::SensorHalDispatcher::GetInstance()->RegisterServer( + sensor_hal_server_->PassRemote()); + + // Wait until all setups are finished and no samples updated. + base::RunLoop().RunUntilIdle(); + + provider_->TriggerRead(); + + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::ANGL); + + EXPECT_TRUE(observer_.is_supported_.has_value()); + EXPECT_TRUE(observer_.is_supported_.value()); + EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); + EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); + + // New device: base-accelerometer. + AddDevice(kFakeBaseAccelerometerId, + chromeos::sensors::mojom::DeviceType::ACCEL, + base::NumberToString(kFakeScaleValue), + kLocationStrings[ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD]); + + // Wait until all setups are finished and no samples updated. + base::RunLoop().RunUntilIdle(); + + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::ANGL); + + EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); + EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); + + // New device: lid-accelerometer. + AddLidAccelerometer(); + + TriggerSamples(); + + EXPECT_EQ(provider_->GetInitializationStateForTesting(), MojoState::ANGL_LID); + + EXPECT_TRUE(observer_.update_.has(ACCELEROMETER_SOURCE_SCREEN)); + EXPECT_FALSE(observer_.update_.has(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)); +} } // namespace ash
diff --git a/ash/accelerometer/accelerometer_reader.h b/ash/accelerometer/accelerometer_reader.h index 3c3be67..ad19703c 100644 --- a/ash/accelerometer/accelerometer_reader.h +++ b/ash/accelerometer/accelerometer_reader.h
@@ -21,8 +21,6 @@ namespace ash { -enum class State { INITIALIZING, SUCCESS, FAILED }; - enum class ECLidAngleDriverStatus { UNKNOWN, SUPPORTED, NOT_SUPPORTED }; class AccelerometerProviderInterface; @@ -41,10 +39,12 @@ // An interface to receive data from the AccelerometerReader. class Observer { public: - // Called only once, when + // Normally called only once, when // |AcceleromterProviderInterface::ec_lid_angle_driver_status_| is set to - // either SUPPORTED or NOT_SUPPORTED. - // It's also guaranteed to be called before |OnAccelerometerUpdated|. + // either SUPPORTED or NOT_SUPPORTED, unless the lid angle driver is + // late-present after timed out, which will be called twice with + // |is_supported| being false and true respectively. + // It's guaranteed to be called before |OnAccelerometerUpdated|. virtual void OnECLidAngleDriverStatusChanged(bool is_supported) = 0; virtual void OnAccelerometerUpdated(const AccelerometerUpdate& update) = 0; @@ -137,9 +137,6 @@ // Set in the constructor. scoped_refptr<base::SequencedTaskRunner> ui_task_runner_; - // The current initialization state of reader. - State initialization_state_ = State::INITIALIZING; - private: // State of ChromeOS EC lid angle driver, if SUPPORTED, it means EC can handle // lid angle calculation.
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index cca5ec1..d70e0e1 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -433,6 +433,9 @@ =1 {1 notification} other {# notifications}} </message> + <message name="IDS_ASH_STATUS_TRAY_HIDDEN_NOTIFICATION_COUNT_LABEL" desc="The label for the number of hidden notifications."> + +<ph name="COUNT">$1<ex>2</ex></ph> + </message> <message name="IDS_ASH_STATUS_TRAY_BLUETOOTH" desc="The label used as the header in the bluetooth popup. [CHAR_LIMIT=14]"> Bluetooth
diff --git a/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_HIDDEN_NOTIFICATION_COUNT_LABEL.png.sha1 b/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_HIDDEN_NOTIFICATION_COUNT_LABEL.png.sha1 new file mode 100644 index 0000000..55fb7c01fa --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_STATUS_TRAY_HIDDEN_NOTIFICATION_COUNT_LABEL.png.sha1
@@ -0,0 +1 @@ +3e74c9c2d78c09c2255dd22e5c25c8cd44964642 \ No newline at end of file
diff --git a/ash/clipboard/clipboard_history_controller_impl.cc b/ash/clipboard/clipboard_history_controller_impl.cc index 6f98fff..a2502041 100644 --- a/ash/clipboard/clipboard_history_controller_impl.cc +++ b/ash/clipboard/clipboard_history_controller_impl.cc
@@ -531,8 +531,9 @@ // If necessary, replace the clipboard's |original_data| temporarily so that // we can paste the selected history item. ui::DataTransferEndpoint data_dst(ui::EndpointType::kClipboardHistory); - if (paste_plain_text || - item.data() != *clipboard->GetClipboardData(&data_dst)) { + const auto* current_clipboard_data = clipboard->GetClipboardData(&data_dst); + if (paste_plain_text || !current_clipboard_data || + *current_clipboard_data != item.data()) { std::unique_ptr<ui::ClipboardData> temp_data; if (paste_plain_text) { // When the shift key is pressed, we only paste plain text.
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 45fcfecd..8054648 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -187,7 +187,7 @@ // Enables or disables using the new Connectivity Diagnostics WebUI app. const base::Feature kConnectivityDiagnosticsWebUi{ - "ConnectivityDiagnosticsWebUi", base::FEATURE_DISABLED_BY_DEFAULT}; + "ConnectivityDiagnosticsWebUi", base::FEATURE_ENABLED_BY_DEFAULT}; // If enabled, options page for each input method will be opened in ChromeOS // settings. Otherwise it will be opened in a new web page in Chrome browser. @@ -213,12 +213,12 @@ // Use DLC instead of component updater for managing the Termina image if set // (and component updater instead of DLC if not). const base::Feature kCrostiniUseDlc{"CrostiniUseDlc", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // DLC Service is available for use on the board, prerequisite for the UseDlc // flag. const base::Feature kCrostiniEnableDlc{"CrostiniEnableDlc", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Enables or disables using Cryptauth's GetDevicesActivityStatus API. const base::Feature kCryptAuthV2DeviceActivityStatus{
diff --git a/ash/dbus/url_handler_service_provider.cc b/ash/dbus/url_handler_service_provider.cc index 488d4f8..589358d 100644 --- a/ash/dbus/url_handler_service_provider.cc +++ b/ash/dbus/url_handler_service_provider.cc
@@ -66,14 +66,19 @@ return; } + VLOG(1) << "Got request to open url"; + const GURL gurl(url); if (!UrlAllowed(gurl)) { + VLOG(1) << "Url is not allowed"; std::move(response_sender) .Run(dbus::ErrorResponse::FromMethodCall(method_call, DBUS_ERROR_FAILED, "Invalid URL")); return; } + VLOG(1) << "Opening url now"; + NewWindowDelegate::GetInstance()->NewTabWithUrl( gurl, false /* from_user_interaction */); std::move(response_sender).Run(dbus::Response::FromMethodCall(method_call));
diff --git a/ash/public/cpp/holding_space/holding_space_constants.h b/ash/public/cpp/holding_space/holding_space_constants.h index 703f2a1d..141c190 100644 --- a/ash/public/cpp/holding_space/holding_space_constants.h +++ b/ash/public/cpp/holding_space/holding_space_constants.h
@@ -50,7 +50,8 @@ constexpr int kHoldingSpaceRecentFilesBubbleId = 4; constexpr int kHoldingSpaceScreenCapturePlayIconId = 5; constexpr int kHoldingSpaceTrayDefaultIconId = 6; -constexpr int kHoldingSpaceTrayPreviewsIconId = 7; +constexpr int kHoldingSpaceTrayDropTargetOverlayId = 7; +constexpr int kHoldingSpaceTrayPreviewsIconId = 8; // The maximum allowed age for files restored into the holding space model. // Note that this is not enforced for pinned items.
diff --git a/ash/public/cpp/holding_space/holding_space_test_api.h b/ash/public/cpp/holding_space/holding_space_test_api.h index b699e841..f560ba8 100644 --- a/ash/public/cpp/holding_space/holding_space_test_api.h +++ b/ash/public/cpp/holding_space/holding_space_test_api.h
@@ -61,6 +61,10 @@ // Returns the holding space tray in the shelf. views::View* GetTray(); + // Returns the view drawn on top of the holding space tray to indicate that + // it is a drop target capable of handling the current drag payload. + views::View* GetTrayDropTargetOverlay(); + // Returns the holding space tray icon view for the default, non content // forward icon. views::View* GetDefaultTrayIcon();
diff --git a/ash/shelf/back_button.cc b/ash/shelf/back_button.cc index 245fefa..6a6c0cc1 100644 --- a/ash/shelf/back_button.cc +++ b/ash/shelf/back_button.cc
@@ -10,8 +10,6 @@ #include "ash/shelf/shelf_focus_cycler.h" #include "ash/strings/grit/ash_strings.h" #include "ash/style/ash_color_provider.h" -#include "ash/style/default_color_constants.h" -#include "ash/style/default_colors.h" #include "ash/wm/window_state.h" #include "ash/wm/window_util.h" #include "base/metrics/user_metrics.h" @@ -44,9 +42,9 @@ // Use PaintButtonContents instead of SetImage so the icon gets drawn at // |GetCenterPoint| coordinates instead of always in the center. gfx::ImageSkia img = CreateVectorIcon( - kShelfBackIcon, DeprecatedGetContentLayerColor( - AshColorProvider::ContentLayerType::kButtonIconColor, - kShelfButtonColor)); + kShelfBackIcon, + AshColorProvider::Get()->GetContentLayerColor( + AshColorProvider::ContentLayerType::kButtonIconColor)); canvas->DrawImageInt(img, GetCenterPoint().x() - img.width() / 2, GetCenterPoint().y() - img.height() / 2); }
diff --git a/ash/shelf/home_button.cc b/ash/shelf/home_button.cc index b75fed3..4820e79fd 100644 --- a/ash/shelf/home_button.cc +++ b/ash/shelf/home_button.cc
@@ -14,8 +14,6 @@ #include "ash/shelf/shelf_navigation_widget.h" #include "ash/shell.h" #include "ash/style/ash_color_provider.h" -#include "ash/style/default_color_constants.h" -#include "ash/style/default_colors.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "base/check_op.h" #include "base/metrics/user_metrics.h" @@ -143,9 +141,8 @@ cc::PaintFlags fg_flags; fg_flags.setAntiAlias(true); fg_flags.setStyle(cc::PaintFlags::kStroke_Style); - fg_flags.setColor(DeprecatedGetContentLayerColor( - AshColorProvider::ContentLayerType::kButtonIconColor, - kShelfButtonColor)); + fg_flags.setColor(AshColorProvider::Get()->GetContentLayerColor( + AshColorProvider::ContentLayerType::kButtonIconColor)); if (controller_.IsAssistantAvailable()) { // active: 100% alpha, inactive: 54% alpha
diff --git a/ash/shelf/shelf_app_button.cc b/ash/shelf/shelf_app_button.cc index d4e872e..3a63a145 100644 --- a/ash/shelf/shelf_app_button.cc +++ b/ash/shelf/shelf_app_button.cc
@@ -219,11 +219,8 @@ gfx::PointF center = gfx::RectF(GetLocalBounds()).CenterPoint(); cc::PaintFlags flags; // Active and running indicators look a little different in the new UI. - flags.setColor(DeprecatedGetContentLayerColor( - active_ ? AshColorProvider::ContentLayerType::kAppStateIndicatorColor - : AshColorProvider::ContentLayerType:: - kAppStateIndicatorColorInactive, - active_ ? kIndicatorColorActive : kIndicatorColorRunning)); + flags.setColor(AshColorProvider::Get()->GetContentLayerColor( + AshColorProvider::ContentLayerType::kAppStateIndicatorColor)); flags.setAntiAlias(true); flags.setStrokeCap(cc::PaintFlags::Cap::kRound_Cap); flags.setStrokeJoin(cc::PaintFlags::Join::kRound_Join);
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_az.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_az.xtb index 918268a..ff72cb1 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_az.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_az.xtb
@@ -47,6 +47,7 @@ <translation id="2480851840841871861">Google Assistenti açın</translation> <translation id="2488661730534396940">Solda masanı aktiv edin</translation> <translation id="2515586267016047495">Alt</translation> +<translation id="2516999188535378855">Diaqnostika Tətbiqini açın</translation> <translation id="2530339807289914946">Veb səhifədə aşağı sürüşdürün</translation> <translation id="2530896289327917474">Klaviatura ilə baxışı aktiv və ya deaktiv edin</translation> <translation id="2574014812750545982">Səhifənin miqyas səviyyəsini sıfırlayın</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_bn.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_bn.xtb index 925a6c11..98f245fe 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_bn.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_bn.xtb
@@ -47,6 +47,7 @@ <translation id="2480851840841871861">Google অ্যাসিস্ট্যান্ট খুলুন</translation> <translation id="2488661730534396940">বাঁদিকের ডেস্কটি চালু করুন</translation> <translation id="2515586267016047495">Alt</translation> +<translation id="2516999188535378855">'ডায়াগনস্টিকস অ্যাপ' খুলুন</translation> <translation id="2530339807289914946">ওয়েব পৃষ্ঠাটিকে স্ক্রল করে নিচে নিয়ে আসুন</translation> <translation id="2530896289327917474">ক্যারেট ব্রাউজিং চালু বা বন্ধ করুন</translation> <translation id="2574014812750545982">পৃষ্ঠায় জুম লেভেল রিসেট করুন</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_es-419.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_es-419.xtb index 9702c70..b1ac14a 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_es-419.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_es-419.xtb
@@ -47,6 +47,7 @@ <translation id="2480851840841871861">Abrir el Asistente de Google</translation> <translation id="2488661730534396940">Activar el escritorio de la izquierda</translation> <translation id="2515586267016047495">Alt</translation> +<translation id="2516999188535378855">Abrir app de Diagnóstico</translation> <translation id="2530339807289914946">Desplazarse hacia abajo por la página web</translation> <translation id="2530896289327917474">Activar o desactivar la navegación por cursor de texto</translation> <translation id="2574014812750545982">Restablecer el nivel de zoom en la página</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_lv.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_lv.xtb index 4956c74..e09172c 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_lv.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_lv.xtb
@@ -47,6 +47,7 @@ <translation id="2480851840841871861">Atvērt Google asistentu</translation> <translation id="2488661730534396940">Aktivizēt darbvietu kreisajā pusē</translation> <translation id="2515586267016047495">Alt</translation> +<translation id="2516999188535378855">Atvērt lietotni Diagnostics</translation> <translation id="2530339807289914946">Ritināt tīmekļa lapu uz leju</translation> <translation id="2530896289327917474">Taustiņpārlūkošanas ieslēgšana vai izslēgšana</translation> <translation id="2574014812750545982">Atiestatīt lapas tālummaiņas līmeni</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ml.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ml.xtb index 0716942..20dc0bf 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ml.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ml.xtb
@@ -47,6 +47,7 @@ <translation id="2480851840841871861">Google അസിസ്റ്റന്റ് തുറക്കുക</translation> <translation id="2488661730534396940">ഇടതുവശത്ത് ഡെസ്ക് സജീവമാക്കുക</translation> <translation id="2515586267016047495">Alt</translation> +<translation id="2516999188535378855">Diagnostics ആപ്പ് തുറക്കുക</translation> <translation id="2530339807289914946">വെബ് പേജ് താഴേയ്ക്ക് സ്ക്രോൾ ചെയ്യുക</translation> <translation id="2530896289327917474">ക്രമീകരണത്തിൽ കാരറ്റ് ബ്രൗസ് ചെയ്യൽ ഓണാക്കാനോ ഓഫാക്കാനോ കഴിയും</translation> <translation id="2574014812750545982">പേജിൽ സൂം നില പുനഃസജ്ജീകരിക്കുക</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ne.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ne.xtb index 3ef6787..fbaabb7 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ne.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ne.xtb
@@ -47,6 +47,7 @@ <translation id="2480851840841871861">Google सहायक खोल्नुहोस्</translation> <translation id="2488661730534396940">बायाँतिरको डेस्क सक्रिय गर्नुहोस्</translation> <translation id="2515586267016047495">Alt</translation> +<translation id="2516999188535378855">Diagnostics एप खोल्नुहोस्</translation> <translation id="2530339807289914946">वेब पृष्ठमा तलतिर स्क्रोल गर्नुहोस्</translation> <translation id="2530896289327917474">क्यारेट ब्राउजिङ अन वा अफ गर्नुहोस्</translation> <translation id="2574014812750545982">पृष्ठमा जुमको स्तर रिसेट गर्नुहोस्</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pa.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pa.xtb index c7ff508..51b561e 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pa.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pa.xtb
@@ -47,6 +47,7 @@ <translation id="2480851840841871861">'Google ਅਸਿਸਟੈਂਟ' ਖੋਲ੍ਹੋ</translation> <translation id="2488661730534396940">ਡੈਸਕ ਨੂੰ ਖੱਬੇ ਪਾਸੇ ਕਿਰਿਆਸ਼ੀਲ ਕਰੋ</translation> <translation id="2515586267016047495">Alt</translation> +<translation id="2516999188535378855">ਤਸ਼ਖੀਸੀ ਐਪ ਖੋਲ੍ਹੋ</translation> <translation id="2530339807289914946">ਵੈੱਬ ਪੰਨੇ ਨੂੰ ਹੇਠਾਂ ਵੱਲ ਸਕ੍ਰੋਲ ਕਰੋ</translation> <translation id="2530896289327917474">ਕੈਰਟ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਚਾਲੂ ਜਾਂ ਬੰਦ ਕਰੋ</translation> <translation id="2574014812750545982">ਪੰਨੇ 'ਤੇ ਜ਼ੂਮ ਪੱਧਰ ਨੂੰ ਰੀਸੈੱਟ ਕਰੋ</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ta.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ta.xtb index 1d244e9..2f22eea7 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ta.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ta.xtb
@@ -47,6 +47,7 @@ <translation id="2480851840841871861">Google அசிஸ்டண்ட்டைத் திறக்கும்</translation> <translation id="2488661730534396940">இடதுபுறத்தில் உள்ள டெஸ்க்கை செயல்படுத்தும்</translation> <translation id="2515586267016047495">Alt</translation> +<translation id="2516999188535378855">Diagnostics ஆப்ஸைத் திறக்கும்</translation> <translation id="2530339807289914946">இணையப் பக்கத்தில் கீழே செல்லும்</translation> <translation id="2530896289327917474">சுட்டி உலாவலை இயக்க/முடக்க</translation> <translation id="2574014812750545982">பக்கத்தில், இயல்பான அளவிற்குக் காட்சியை மீட்டமைக்கும்</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_te.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_te.xtb index 20dc1f3e..13aafa61 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_te.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_te.xtb
@@ -47,6 +47,7 @@ <translation id="2480851840841871861">Google అసిస్టెంట్ను తెరవండి</translation> <translation id="2488661730534396940">ఎడమవైపు గల డెస్క్ను యాక్టివేట్ చేస్తుంది</translation> <translation id="2515586267016047495">Alt</translation> +<translation id="2516999188535378855">Diagnostics యాప్ను తెరవండి</translation> <translation id="2530339807289914946">వెబ్ పేజీని దిగువకు స్క్రోల్ చేయండి</translation> <translation id="2530896289327917474">క్యారెట్ బ్రౌజింగ్ను ఆన్ లేదా ఆఫ్ చేస్తుంది</translation> <translation id="2574014812750545982">పేజీలోని జూమ్ స్థాయిని రీసెట్ చేస్తుంది</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ur.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ur.xtb index a0b17c8..c287026 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ur.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ur.xtb
@@ -47,6 +47,7 @@ <translation id="2480851840841871861">Google اسسٹنٹ کھولیں</translation> <translation id="2488661730534396940">بائیں طرف ڈیسک کو فعال کریں</translation> <translation id="2515586267016047495">Alt</translation> +<translation id="2516999188535378855">Diagnostics ایپ کھولیں</translation> <translation id="2530339807289914946">ویب صفحہ کو نیچے اسکرال کریں</translation> <translation id="2530896289327917474">کیرٹ براؤزنگ کو آن یا آف کریں</translation> <translation id="2574014812750545982">صفحہ پر زوم کی سطح کو دوبارہ سیٹ کریں</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index b0ad9d16..a06b2ca 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -695,6 +695,7 @@ <translation id="7029814467594812963">Sessiyadan çıxın</translation> <translation id="703425375924687388"><ph name="QUERY_NAME" />, Google Assistent</translation> <translation id="7042322267639375032">Status sahəsini yığcamlaşdırın</translation> +<translation id="7055910611768509537">Qələm bir həftədən çoxdur ki, istifadə edilməyib</translation> <translation id="7066646422045619941">Bu şəbəkə administratorunuz tərəfindən deaktiv edilib.</translation> <translation id="7067196344162293536">Avtodönüş</translation> <translation id="7068360136237591149">Faylları açın</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index b004044..859804d8 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -695,6 +695,7 @@ <translation id="7029814467594812963">সেশন থেকে প্রস্থান</translation> <translation id="703425375924687388"><ph name="QUERY_NAME" />, Google Assistant</translation> <translation id="7042322267639375032">স্ট্যাটাস এরিয়া আড়াল করুন</translation> +<translation id="7055910611768509537">এক সপ্তাহের বেশি সময় ধরে স্টাইলাস ব্যবহার করা হয়নি</translation> <translation id="7066646422045619941">এই নেটওয়ার্কটি আপনার প্রশাসকের দ্বারা অক্ষম করা হয়েছে৷</translation> <translation id="7067196344162293536">স্বতঃ ঘূর্ণন</translation> <translation id="7068360136237591149">ফাইল খুলুন</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index acd6b4e..c70ab8d 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -696,6 +696,7 @@ <translation id="7029814467594812963">Salir de la sesión</translation> <translation id="703425375924687388"><ph name="QUERY_NAME" />, Asistente de Google</translation> <translation id="7042322267639375032">Contraer el área de estado</translation> +<translation id="7055910611768509537">No se usó la pluma stylus en más de una semana</translation> <translation id="7066646422045619941">El administrador inhabilitó esta red.</translation> <translation id="7067196344162293536">Rotación automática</translation> <translation id="7068360136237591149">Abrir archivos</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index fad15ca..0a626d7 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -52,7 +52,7 @@ <translation id="1302880136325416935">Bluetooth の設定を表示します。<ph name="STATE_TEXT" /></translation> <translation id="1312604459020188865">信号強度 <ph name="SIGNAL_STRENGTH" /></translation> <translation id="1316069254387866896">シェルフを常に表示</translation> -<translation id="1316811122439383437">Tote: 最近撮影した画面キャプチャや、最近ダウンロードまたは固定したファイル</translation> +<translation id="1316811122439383437">トート: 最近撮影した画面キャプチャや、最近ダウンロードまたは固定したファイル</translation> <translation id="1333308631814936910"><ph name="DISPLAY_NAME" />を接続しました</translation> <translation id="1341651618736211726">オーバーフロー</translation> <translation id="1346748346194534595">右</translation> @@ -792,7 +792,7 @@ <translation id="7886169021410746335">プライバシー設定を調整する</translation> <translation id="7886277072580235377">ログアウトするとインターネット セッションは終了します。<ph name="LEARN_MORE" /></translation> <translation id="788781083998633524">メールを送って</translation> -<translation id="7895348134893321514">Tote</translation> +<translation id="7895348134893321514">トート</translation> <translation id="7897375687985782769">画面回転のキーボード ショートカットを押しました。画面を回転しますか?</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">指紋認証センサーをタップ</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 6c1c5f8e..2d3df3b 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -695,6 +695,7 @@ <translation id="7029814467594812963">Iziet no sesijas</translation> <translation id="703425375924687388"><ph name="QUERY_NAME" />, Google asistents</translation> <translation id="7042322267639375032">Sakļaut statusa apgabalu</translation> +<translation id="7055910611768509537">Skārienekrāna pildspalva nav izmantota vairāk nekā nedēļu.</translation> <translation id="7066646422045619941">Jūsu administrators atspējoja šo tīklu.</translation> <translation id="7067196344162293536">Pagriezt automātiski</translation> <translation id="7068360136237591149">Atvērt failus</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index ab01d2b..eeb1a61 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -693,6 +693,7 @@ <translation id="7029814467594812963">സെഷൻ എക്സിറ്റ്</translation> <translation id="703425375924687388"><ph name="QUERY_NAME" />, Google അസിസ്റ്റന്റ്</translation> <translation id="7042322267639375032">സ്റ്റാറ്റസ് ഏരിയ ചുരുക്കുക</translation> +<translation id="7055910611768509537">ഒരാഴ്ചയിലധികമായി സ്റ്റൈലസ് ഉപയോഗിച്ചിട്ടില്ല</translation> <translation id="7066646422045619941">നിങ്ങളുടെ അഡ്മിൻ ഈ നെറ്റ്വർക്ക് പ്രവർത്തനരഹിതമാക്കി.</translation> <translation id="7067196344162293536">സ്വയമേവ തിരിക്കുക</translation> <translation id="7068360136237591149">ഫയലുകൾ തുറക്കുക</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index ef239f76..01b8cd66 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -695,6 +695,7 @@ <translation id="7029814467594812963">सत्रबाट निस्कनु…</translation> <translation id="703425375924687388"><ph name="QUERY_NAME" />, Google सहायक</translation> <translation id="7042322267639375032">वस्तुस्थिति देखाउने क्षेत्र संक्षिप्त गर्नुहोस्</translation> +<translation id="7055910611768509537">स्टाइलस प्रयोग नगरेको एक हप्ताभन्दा बढी भइसकेको छ</translation> <translation id="7066646422045619941">यस नेटवर्कलाई तपाईंको प्रशासकद्वारा असक्षम गरिएको छ।</translation> <translation id="7067196344162293536">स्वतः घुमाउनुहोस्</translation> <translation id="7068360136237591149">फाइलहरू खोल्नुहोस्</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index 40fa1ad9..1e6612a 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -693,6 +693,7 @@ <translation id="7029814467594812963">ਸੈਸ਼ਨ ਤੋਂ ਬਾਹਰ ਜਾਓ</translation> <translation id="703425375924687388"><ph name="QUERY_NAME" />, 'Google ਅਸਿਸਟੈਂਟ'</translation> <translation id="7042322267639375032">ਸਥਿਤੀ ਖੇਤਰ ਸਮੇਟੋ</translation> +<translation id="7055910611768509537">ਸਟਾਈਲਸ ਨੂੰ ਇੱਕ ਹਫ਼ਤੇ ਤੋਂ ਵੱਧ ਸਮੇਂ ਤੋਂ ਵਰਤਿਆ ਨਹੀਂ ਗਿਆ</translation> <translation id="7066646422045619941">ਇਹ ਨੈੱਟਵਰਕ ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।</translation> <translation id="7067196344162293536">ਸਵੈ ਘੁੰਮਾਓ</translation> <translation id="7068360136237591149">ਫ਼ਾਈਲਾਂ ਖੋਲ੍ਹੋ</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 4a56c4e..7ee5334a 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -695,6 +695,7 @@ <translation id="7029814467594812963">அமர்விலிருந்து வெளியேறவும்</translation> <translation id="703425375924687388"><ph name="QUERY_NAME" />, Google அசிஸ்டண்ட்</translation> <translation id="7042322267639375032">நிலைப் பகுதியை சுருக்கும்</translation> +<translation id="7055910611768509537">ஒரு வாரத்திற்கும் மேலாக ஸ்டைலஸ் பயன்படுத்தப்படவில்லை</translation> <translation id="7066646422045619941">இந்த நெட்வொர்க் உங்கள் நிர்வாகியால் முடக்கப்பட்டுள்ளது.</translation> <translation id="7067196344162293536">தானியங்கு சுழற்றல்</translation> <translation id="7068360136237591149">கோப்புகளைத் திற</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index de630e6..d41dc16 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -696,6 +696,7 @@ <translation id="7029814467594812963">సెషన్ నిష్క్రమించు</translation> <translation id="703425375924687388"><ph name="QUERY_NAME" />, Google అసిస్టెంట్</translation> <translation id="7042322267639375032">స్టేటస్ ప్రాంతాన్ని కుదించండి</translation> +<translation id="7055910611768509537">ఒక వారం నుండి స్టైలస్ ఉపయోగించబడలేదు</translation> <translation id="7066646422045619941">ఈ నెట్వర్క్ను మీ నిర్వాహకుడు నిలిపివేశారు.</translation> <translation id="7067196344162293536">స్వయంచాలకంగా తిప్పు</translation> <translation id="7068360136237591149">ఫైల్లు తెరువు</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index c212260..55ab4c0 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -695,6 +695,7 @@ <translation id="7029814467594812963">سیشن سے خارج ہوں</translation> <translation id="703425375924687388"><ph name="QUERY_NAME" />، Google اسسٹنٹ</translation> <translation id="7042322267639375032">اسٹیٹس ایریا کو سکیڑیں</translation> +<translation id="7055910611768509537">ایک ہفتہ سے اسٹائلس کا استعمال نہیں کیا گیا ہے</translation> <translation id="7066646422045619941">اس نیٹ ورک کو آپ کے منتظم نے غیر فعال کیا ہے۔</translation> <translation id="7067196344162293536">خود کار طور پر گھمائیں</translation> <translation id="7068360136237591149">فائلیں کھولیں</translation>
diff --git a/ash/style/default_color_constants.h b/ash/style/default_color_constants.h index 9447fb52..0ba2e73 100644 --- a/ash/style/default_color_constants.h +++ b/ash/style/default_color_constants.h
@@ -22,11 +22,6 @@ constexpr SkColor kLoginButtonBackgroundBaseColor = SkColorSetA(SK_ColorWHITE, 26); -// Colors for shelf. -constexpr SkColor kShelfButtonColor = SK_ColorWHITE; -constexpr SkColor kIndicatorColorActive = SK_ColorWHITE; -constexpr SkColor kIndicatorColorRunning = SkColorSetA(SK_ColorWHITE, 0x7F); - // Colors for back gesture. constexpr SkColor kArrowColorBeforeActivated = gfx::kGoogleBlue600; constexpr SkColor kArrowColorAfterActivated = gfx::kGoogleGrey100;
diff --git a/ash/system/DEPS b/ash/system/DEPS index 158ad04..d9e52e6 100644 --- a/ash/system/DEPS +++ b/ash/system/DEPS
@@ -4,3 +4,9 @@ "+components/prefs", "+grit/ui_chromeos_resources.h", ] + +specific_include_rules = { + "status_area_widget_unittest.cc": [ + "+chromeos/dbus/hermes", + ], +}
diff --git a/ash/system/holding_space/holding_space_test_api.cc b/ash/system/holding_space/holding_space_test_api.cc index c39ab4c..348eb9c 100644 --- a/ash/system/holding_space/holding_space_test_api.cc +++ b/ash/system/holding_space/holding_space_test_api.cc
@@ -132,6 +132,10 @@ return holding_space_tray_; } +views::View* HoldingSpaceTestApi::GetTrayDropTargetOverlay() { + return holding_space_tray_->GetViewByID(kHoldingSpaceTrayDropTargetOverlayId); +} + views::View* HoldingSpaceTestApi::GetDefaultTrayIcon() { return holding_space_tray_->GetViewByID(kHoldingSpaceTrayDefaultIconId); }
diff --git a/ash/system/holding_space/holding_space_tray.cc b/ash/system/holding_space/holding_space_tray.cc index 24a3e79..6fe12a78 100644 --- a/ash/system/holding_space/holding_space_tray.cc +++ b/ash/system/holding_space/holding_space_tray.cc
@@ -27,17 +27,38 @@ #include "components/prefs/pref_change_registrar.h" #include "ui/base/dragdrop/drag_drop_types.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/compositor/scoped_layer_animation_settings.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/views/controls/image_view.h" #include "ui/views/controls/menu/menu_runner.h" +#include "ui/views/layout/fill_layout.h" #include "ui/views/metadata/metadata_impl_macros.h" +#include "ui/views/vector_icons.h" namespace ash { namespace { +// Animation. +constexpr base::TimeDelta kAnimationDuration = + base::TimeDelta::FromMilliseconds(167); + // Helpers --------------------------------------------------------------------- +// Animates the specified `view` to the given `target_opacity`. +void AnimateToTargetOpacity(views::View* view, float target_opacity) { + DCHECK(view->layer()); + if (view->layer()->GetTargetOpacity() == target_opacity) + return; + + ui::ScopedLayerAnimationSettings settings(view->layer()->GetAnimator()); + settings.SetPreemptionStrategy( + ui::LayerAnimator::PreemptionStrategy::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); + settings.SetTransitionDuration(kAnimationDuration); + + view->layer()->SetOpacity(target_opacity); +} + // Returns the file paths extracted from the specified `data` which are *not* // pinned to the attached holding space model. std::vector<base::FilePath> ExtractUnpinnedFilePaths( @@ -77,6 +98,7 @@ return false; } +// Creates the default tray icon. std::unique_ptr<views::ImageView> CreateDefaultTrayIcon() { auto icon = std::make_unique<views::ImageView>(); icon->SetID(kHoldingSpaceTrayDefaultIconId); @@ -85,9 +107,37 @@ AshColorProvider::Get()->GetContentLayerColor( AshColorProvider::ContentLayerType::kIconColorPrimary))); icon->SetPreferredSize(gfx::Size(kTrayItemSize, kTrayItemSize)); + icon->SetPaintToLayer(); + icon->layer()->SetFillsBoundsOpaquely(false); return icon; } +// TODO(crbug.com/1171059): Refine UI upon delivery of spec. +// Creates the overlay to be drawn over all other child views to indicate that +// the parent view is a drop target and is capable of handling the current drag +// payload. +std::unique_ptr<views::View> CreateDropTargetOverlay() { + auto drop_target_overlay = std::make_unique<views::View>(); + drop_target_overlay->SetID(kHoldingSpaceTrayDropTargetOverlayId); + drop_target_overlay->SetLayoutManager(std::make_unique<views::FillLayout>()); + + // Layer. + drop_target_overlay->SetPaintToLayer(ui::LAYER_SOLID_COLOR); + drop_target_overlay->layer()->SetColor(gfx::kGoogleGrey400); + + // Icon. + auto* icon = + drop_target_overlay->AddChildView(std::make_unique<views::ImageView>()); + icon->SetHorizontalAlignment(views::ImageView::Alignment::kCenter); + icon->SetVerticalAlignment(views::ImageView::Alignment::kCenter); + icon->SetImage(gfx::CreateVectorIcon(views::kUnpinIcon, kHoldingSpaceIconSize, + gfx::kGoogleGrey700)); + icon->SetPaintToLayer(); + icon->layer()->SetFillsBoundsOpaquely(false); + + return drop_target_overlay; +} + } // namespace // HoldingSpaceTray ------------------------------------------------------------ @@ -109,6 +159,15 @@ set_context_menu_controller(this); } + // Drop target overlay. + // NOTE: The `drop_target_overlay_` will only be visible when: + // * a drag is in progress, + // * the drag payload contains pinnable files, and + // * the cursor is sufficiently close to this view. + drop_target_overlay_ = AddChildView(CreateDropTargetOverlay()); + drop_target_overlay_->layer()->SetOpacity(0.f); + + // Animation. set_use_bounce_in_animation(true); } @@ -254,13 +313,33 @@ return !ExtractUnpinnedFilePaths(data).empty(); } +// TODO(crbug.com/1171059): Instead of handling `OnDragEntered()`, show the +// `drop_target_overlay_` if the cursor is within range of this view. +void HoldingSpaceTray::OnDragEntered(const ui::DropTargetEvent& event) { + if (ExtractUnpinnedFilePaths(event.data()).empty()) + UpdateDropTargetState(/*is_drop_target=*/false); + else + UpdateDropTargetState(/*is_drop_target=*/true); +} + int HoldingSpaceTray::OnDragUpdated(const ui::DropTargetEvent& event) { - return ExtractUnpinnedFilePaths(event.data()).empty() - ? ui::DragDropTypes::DRAG_NONE - : ui::DragDropTypes::DRAG_COPY; + if (ExtractUnpinnedFilePaths(event.data()).empty()) { + UpdateDropTargetState(/*is_drop_target=*/false); + return ui::DragDropTypes::DRAG_NONE; + } + UpdateDropTargetState(/*is_drop_target=*/true); + return ui::DragDropTypes::DRAG_COPY; +} + +// TODO(crbug.com/1171059): Instead of handling `OnDragExited()`, hide the +// `drop_target_overlay_` if the cursor is outside range of this view. +void HoldingSpaceTray::OnDragExited() { + UpdateDropTargetState(/*is_drop_target=*/false); } int HoldingSpaceTray::OnPerformDrop(const ui::DropTargetEvent& event) { + UpdateDropTargetState(/*is_drop_target=*/false); + std::vector<base::FilePath> unpinned_file_paths( ExtractUnpinnedFilePaths(event.data())); if (unpinned_file_paths.empty()) @@ -270,6 +349,15 @@ return ui::DragDropTypes::DRAG_COPY; } +void HoldingSpaceTray::Layout() { + TrayBackgroundView::Layout(); + + // The `drop_target_overlay_` should always fill this view's bounds as they + // are perceived by the user. Note that the user perceives the bounds of this + // view to be its background bounds, not its local bounds. + drop_target_overlay_->SetBoundsRect(GetBackgroundBounds()); +} + void HoldingSpaceTray::FirePreviewsUpdateTimerIfRunningForTesting() { if (previews_update_.IsRunning()) previews_update_.FireNow(); @@ -510,6 +598,13 @@ return previews_tray_icon_ && previews_tray_icon_->GetVisible(); } +// TODO(crbug.com/1171059): Animate translation of tray icons. +void HoldingSpaceTray::UpdateDropTargetState(bool is_drop_target) { + AnimateToTargetOpacity(drop_target_overlay_, is_drop_target ? 1.f : 0.f); + AnimateToTargetOpacity(default_tray_icon_, is_drop_target ? 0.f : 1.f); + AnimateToTargetOpacity(previews_tray_icon_, is_drop_target ? 0.f : 1.f); +} + BEGIN_METADATA(HoldingSpaceTray, TrayBackgroundView) END_METADATA
diff --git a/ash/system/holding_space/holding_space_tray.h b/ash/system/holding_space/holding_space_tray.h index 34aba0c..692c887 100644 --- a/ash/system/holding_space/holding_space_tray.h +++ b/ash/system/holding_space/holding_space_tray.h
@@ -74,8 +74,11 @@ std::set<ui::ClipboardFormatType>* format_types) override; bool AreDropTypesRequired() override; bool CanDrop(const ui::OSExchangeData& data) override; + void OnDragEntered(const ui::DropTargetEvent& event) override; int OnDragUpdated(const ui::DropTargetEvent& event) override; + void OnDragExited() override; int OnPerformDrop(const ui::DropTargetEvent& event) override; + void Layout() override; void set_use_zero_previews_update_delay_for_testing(bool zero_delay) { use_zero_previews_update_delay_ = zero_delay; @@ -145,6 +148,11 @@ // enabled/ disabled by the user at runtime. bool PreviewsShown() const; + // Updates this view (and its children) to reflect state as a potential drop + // target. If `is_drop_target` is true, this view represents a suitable drop + // target for the current drag payload. + void UpdateDropTargetState(bool is_drop_target); + std::unique_ptr<HoldingSpaceTrayBubble> bubble_; std::unique_ptr<ui::SimpleMenuModel> context_menu_model_; std::unique_ptr<views::MenuRunner> context_menu_runner_; @@ -158,6 +166,10 @@ // Owned by views hierarchy. HoldingSpaceTrayIcon* previews_tray_icon_ = nullptr; + // The view drawn on top of all other child views to indicate that this + // view is a drop target capable of handling the current drag payload. + views::View* drop_target_overlay_ = nullptr; + // When the holding space previews feature is enabled, the user can enable/ // disable previews at runtime. This registrar is associated with the active // user pref service and notifies the holding space tray icon of changes to
diff --git a/ash/system/message_center/message_center_utils.cc b/ash/system/message_center/message_center_utils.cc index 8af7c407..8a5af30 100644 --- a/ash/system/message_center/message_center_utils.cc +++ b/ash/system/message_center/message_center_utils.cc
@@ -4,6 +4,9 @@ #include "ash/system/message_center/message_center_utils.h" +#include "ash/media/media_notification_constants.h" +#include "ash/public/cpp/ash_features.h" +#include "ash/public/cpp/vm_camera_mic_constants.h" #include "ui/message_center/message_center.h" namespace ash { @@ -30,6 +33,30 @@ return sorted_notifications; } +size_t GetNotificationCount() { + // If flag is set, do not include media notifications in count. + // TODO(crbug.com/1111881) This code can be removed when OS media controls are + // launched (expected by M90). + const bool skip_media_notification = + base::FeatureList::IsEnabled(features::kMediaNotificationsCounter); + + size_t count = 0; + for (message_center::Notification* notification : + message_center::MessageCenter::Get()->GetVisibleNotifications()) { + const std::string& notifier = notification->notifier_id().id; + // Don't count these notifications since we have `CameraMicTrayItemView` to + // show indicators on the systray. + if (notifier == kVmCameraMicNotifierId) + continue; + + if (skip_media_notification && notifier == kMediaSessionNotifierId) + continue; + + ++count; + } + return count; +} + } // namespace message_center_utils } // namespace ash
diff --git a/ash/system/message_center/message_center_utils.h b/ash/system/message_center/message_center_utils.h index 63fb97a69..ca9758a 100644 --- a/ash/system/message_center/message_center_utils.h +++ b/ash/system/message_center/message_center_utils.h
@@ -5,6 +5,7 @@ #ifndef ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_UTILS_H_ #define ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_UTILS_H_ +#include "ash/ash_export.h" #include "ui/message_center/public/cpp/notification.h" namespace ash { @@ -23,6 +24,11 @@ // CompareNotifications() above for the sorting order. std::vector<message_center::Notification*> GetSortedVisibleNotifications(); +// Returns total notifications count, with a filter to not count some of them +// (These notifications such as camera, media controls, etc. don't need an +// indicator in status area since they already have a dedicated tray item). +size_t ASH_EXPORT GetNotificationCount(); + } // namespace message_center_utils } // namespace ash
diff --git a/ash/system/message_center/message_center_utils_unittest.cc b/ash/system/message_center/message_center_utils_unittest.cc new file mode 100644 index 0000000..633411a9 --- /dev/null +++ b/ash/system/message_center/message_center_utils_unittest.cc
@@ -0,0 +1,78 @@ +// Copyright 2021 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/system/message_center/message_center_utils.h" + +#include "ash/media/media_notification_constants.h" +#include "ash/public/cpp/ash_features.h" +#include "ash/public/cpp/vm_camera_mic_constants.h" +#include "ash/test/ash_test_base.h" +#include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_feature_list.h" +#include "ui/message_center/message_center.h" + +namespace ash { + +namespace message_center_utils { + +namespace { + +void AddNotification(const std::string& notification_id, + const std::string& app_id) { + message_center::MessageCenter::Get()->AddNotification( + std::make_unique<message_center::Notification>( + message_center::NOTIFICATION_TYPE_BASE_FORMAT, notification_id, + base::UTF8ToUTF16("test_title"), base::UTF8ToUTF16("test message"), + gfx::Image(), /*display_source=*/base::string16(), GURL(), + message_center::NotifierId(message_center::NotifierType::APPLICATION, + app_id), + message_center::RichNotificationData(), + new message_center::NotificationDelegate())); +} + +} // namespace + +class MessageCenterUtilsTest : public AshTestBase, + public testing::WithParamInterface<bool> { + public: + MessageCenterUtilsTest() = default; + MessageCenterUtilsTest(const MessageCenterUtilsTest&) = delete; + MessageCenterUtilsTest& operator=(const MessageCenterUtilsTest&) = delete; + ~MessageCenterUtilsTest() override = default; + + // AshTestBase: + void SetUp() override { + AshTestBase::SetUp(); + scoped_feature_list_.InitWithFeatureState( + features::kMediaNotificationsCounter, + IsMediaNotificationsCounterEnabled()); + } + + bool IsMediaNotificationsCounterEnabled() { return GetParam(); } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +INSTANTIATE_TEST_SUITE_P( + All, + MessageCenterUtilsTest, + testing::Bool() /* IsMediaNotificationsCounterEnabled() */); + +TEST_P(MessageCenterUtilsTest, TotalNotificationCount) { + EXPECT_EQ(0u, GetNotificationCount()); + + // VM camera/mic notifications are ignored by the counter. + AddNotification("0", kVmCameraMicNotifierId); + EXPECT_EQ(0u, GetNotificationCount()); + + AddNotification("1", kMediaSessionNotifierId); + // Counter should ignore media notifications when feature is enabled. + size_t expected_count = IsMediaNotificationsCounterEnabled() ? 0u : 1u; + EXPECT_EQ(expected_count, GetNotificationCount()); +} + +} // namespace message_center_utils + +} // namespace ash
diff --git a/ash/system/status_area_widget_unittest.cc b/ash/system/status_area_widget_unittest.cc index 349a233..453fea4 100644 --- a/ash/system/status_area_widget_unittest.cc +++ b/ash/system/status_area_widget_unittest.cc
@@ -30,6 +30,7 @@ #include "ash/test/ash_test_base.h" #include "base/callback_helpers.h" #include "base/command_line.h" +#include "chromeos/dbus/hermes/hermes_clients.h" #include "chromeos/dbus/shill/shill_clients.h" #include "chromeos/network/network_handler.h" #include "chromeos/network/network_metadata_store.h" @@ -222,6 +223,7 @@ // AshTestBase: void SetUp() override { chromeos::shill_clients::InitializeFakes(); + chromeos::hermes_clients::InitializeFakes(); // Initializing NetworkHandler before ash is more like production. chromeos::NetworkHandler::Initialize(); AshTestBase::SetUp(); @@ -237,6 +239,7 @@ chromeos::NetworkHandler::Get()->ShutdownPrefServices(); AshTestBase::TearDown(); chromeos::NetworkHandler::Shutdown(); + chromeos::hermes_clients::Shutdown(); chromeos::shill_clients::Shutdown(); }
diff --git a/ash/system/unified/notification_counter_view.cc b/ash/system/unified/notification_counter_view.cc index eadd00d..0bc4bd41 100644 --- a/ash/system/unified/notification_counter_view.cc +++ b/ash/system/unified/notification_counter_view.cc
@@ -14,8 +14,11 @@ #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" #include "ash/system/message_center/ash_message_center_lock_screen_controller.h" +#include "ash/system/message_center/message_center_utils.h" #include "ash/system/tray/tray_constants.h" #include "ash/system/tray/tray_utils.h" +#include "ash/system/unified/notification_icons_controller.h" +#include "ash/system/unified/unified_system_tray.h" #include "base/i18n/number_formatting.h" #include "ui/base/l10n/l10n_util.h" #include "ui/gfx/canvas.h" @@ -89,11 +92,16 @@ } // namespace -NotificationCounterView::NotificationCounterView(Shelf* shelf) - : TrayItemView(shelf) { +NotificationCounterView::NotificationCounterView( + UnifiedSystemTray* tray, + NotificationIconsController* controller) + : TrayItemView(tray->shelf()), controller_(controller) { + system_tray_model_observation_.Observe(tray->model()); CreateImageView(); SetVisible(false); Shell::Get()->session_controller()->AddObserver(this); + + OnSystemTrayButtonSizeChanged(tray->model()->GetSystemTrayButtonSize()); } NotificationCounterView::~NotificationCounterView() { @@ -104,33 +112,14 @@ SessionControllerImpl* session_controller = Shell::Get()->session_controller(); - // If flag is set, do not include media notifications in count. - // TODO(crbug.com/1111881) This code can be removed when OS media controls are - // launched (expected by M90). - const bool dont_count_media_notification = - base::FeatureList::IsEnabled(features::kMediaNotificationsCounter); + size_t notification_count = message_center_utils::GetNotificationCount(); - const message_center::NotificationList::Notifications& visible = - message_center::MessageCenter::Get()->GetVisibleNotifications(); - - size_t notification_count = std::count_if( - visible.begin(), visible.end(), - [dont_count_media_notification]( - message_center::Notification* notification) { - const std::string& notifier = notification->notifier_id().id; - // Don't count these notifications since we have `CameraMicTrayItemView` - // to show indicators on the systray. - if (notifier == kVmCameraMicNotifierId) { - return false; - } - if (dont_count_media_notification && - notifier == kMediaSessionNotifierId) { - return false; - } - return true; - }); - - if (notification_count == 0 || + // If we are currently showing icons of some notifications in the tray, this + // counter should not be shown. + const bool tray_notification_icons_shown = + icons_view_visible_ && controller_ && + controller_->TrayItemHasNotification(); + if (notification_count == 0 || tray_notification_icons_shown || message_center::MessageCenter::Get()->IsQuietMode() || !session_controller->ShouldShowNotificationTray() || (session_controller->IsScreenLocked() && @@ -164,10 +153,37 @@ Update(); } +void NotificationCounterView::OnSystemTrayButtonSizeChanged( + UnifiedSystemTrayModel::SystemTrayButtonSize system_tray_size) { + icons_view_visible_ = + system_tray_size != UnifiedSystemTrayModel::SystemTrayButtonSize::kSmall; + Update(); +} + const char* NotificationCounterView::GetClassName() const { return "NotificationCounterView"; } +HiddenNotificationCountView::HiddenNotificationCountView(Shelf* shelf) + : TrayItemView(shelf) { + CreateLabel(); + SetupLabelForTray(label()); + SetBorder(views::CreateEmptyBorder(kUnifiedTrayTextTopPadding, 0, 0, + kUnifiedTrayTextRightPadding)); + label()->SetEnabledColor(AshColorProvider::Get()->GetContentLayerColor( + AshColorProvider::ContentLayerType::kIconColorPrimary)); +} + +HiddenNotificationCountView::~HiddenNotificationCountView() = default; + +void HiddenNotificationCountView::HandleLocaleChange() { + // TODO(crbug.com/1161557): Finish this function. +} + +const char* HiddenNotificationCountView::GetClassName() const { + return "HiddenNotificationCountView"; +} + QuietModeView::QuietModeView(Shelf* shelf) : TrayItemView(shelf) { CreateImageView(); image_view()->SetTooltipText(
diff --git a/ash/system/unified/notification_counter_view.h b/ash/system/unified/notification_counter_view.h index 5fbf695..fcc8de3 100644 --- a/ash/system/unified/notification_counter_view.h +++ b/ash/system/unified/notification_counter_view.h
@@ -8,20 +8,31 @@ #include "ash/ash_export.h" #include "ash/public/cpp/session/session_observer.h" #include "ash/system/tray/tray_item_view.h" +#include "ash/system/unified/unified_system_tray_model.h" #include "base/macros.h" +#include "base/scoped_observation.h" namespace ash { +class NotificationIconsController; +class UnifiedSystemTray; + // Maximum count of notification shown by a number label. "+" icon is shown // instead if it exceeds this limit. constexpr size_t kTrayNotificationMaxCount = 9; -// A notification counter view in UnifiedSystemTray button. -class ASH_EXPORT NotificationCounterView : public TrayItemView, - public SessionObserver { +// A notification counter view in UnifiedSystemTray button. This will be shown +// when there's notification and the tray doesn't show any notification icons. +class ASH_EXPORT NotificationCounterView + : public TrayItemView, + public SessionObserver, + public UnifiedSystemTrayModel::Observer { public: - explicit NotificationCounterView(Shelf* shelf); + NotificationCounterView(UnifiedSystemTray* tray, + NotificationIconsController* controller); ~NotificationCounterView() override; + NotificationCounterView(const NotificationCounterView&) = delete; + NotificationCounterView& operator=(const NotificationCounterView&) = delete; void Update(); @@ -34,6 +45,10 @@ // SessionObserver: void OnSessionStateChanged(session_manager::SessionState state) override; + // UnifiedSystemTrayModel::Observer: + void OnSystemTrayButtonSizeChanged( + UnifiedSystemTrayModel::SystemTrayButtonSize system_tray_size) override; + // views::TrayItemView: const char* GetClassName() const override; @@ -46,7 +61,30 @@ // |kTrayNotificationMaxCount| + 1 indicates the plus icon. int count_for_display_ = 0; - DISALLOW_COPY_AND_ASSIGN(NotificationCounterView); + // Indicates if the notification icons view is set to be shown. Currently, we + // show the icon view in medium or large screen size. + bool icons_view_visible_ = false; + + NotificationIconsController* const controller_; + + base::ScopedObservation<UnifiedSystemTrayModel, + UnifiedSystemTrayModel::Observer> + system_tray_model_observation_{this}; +}; + +// An icon view to indicate the number of hidden notifications (besides from the +// notifications that are shown in tray). +class HiddenNotificationCountView : public TrayItemView { + public: + explicit HiddenNotificationCountView(Shelf* shelf); + ~HiddenNotificationCountView() override; + HiddenNotificationCountView(const HiddenNotificationCountView&) = delete; + HiddenNotificationCountView& operator=(const HiddenNotificationCountView&) = + delete; + + // TrayItemView: + void HandleLocaleChange() override; + const char* GetClassName() const override; }; // A do-not-distrub icon view in UnifiedSystemTray button. @@ -54,6 +92,8 @@ public: explicit QuietModeView(Shelf* shelf); ~QuietModeView() override; + QuietModeView(const QuietModeView&) = delete; + QuietModeView& operator=(const QuietModeView&) = delete; void Update(); @@ -65,9 +105,6 @@ // views::TrayItemView: const char* GetClassName() const override; - - private: - DISALLOW_COPY_AND_ASSIGN(QuietModeView); }; } // namespace ash
diff --git a/ash/system/unified/notification_counter_view_unittest.cc b/ash/system/unified/notification_counter_view_unittest.cc index d598463..a6166c403 100644 --- a/ash/system/unified/notification_counter_view_unittest.cc +++ b/ash/system/unified/notification_counter_view_unittest.cc
@@ -4,9 +4,9 @@ #include "ash/system/unified/notification_counter_view.h" -#include "ash/media/media_notification_constants.h" #include "ash/public/cpp/ash_features.h" -#include "ash/public/cpp/vm_camera_mic_constants.h" +#include "ash/system/unified/notification_icons_controller.h" +#include "ash/system/unified/unified_system_tray.h" #include "ash/test/ash_test_base.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" @@ -21,7 +21,8 @@ namespace ash { -class NotificationCounterViewTest : public AshTestBase { +class NotificationCounterViewTest : public AshTestBase, + public testing::WithParamInterface<bool> { public: NotificationCounterViewTest() = default; NotificationCounterViewTest(const NotificationCounterViewTest&) = delete; @@ -32,27 +33,46 @@ // AshTestBase: void SetUp() override { AshTestBase::SetUp(); + scoped_feature_list_.InitWithFeatureState(features::kScalableStatusArea, + IsScalableStatusAreaEnabled()); - notification_counter_view_ = - std::make_unique<NotificationCounterView>(GetPrimaryShelf()); + tray_ = std::make_unique<UnifiedSystemTray>(GetPrimaryShelf()); + + if (IsScalableStatusAreaEnabled()) { + notification_icons_controller_ = + std::make_unique<NotificationIconsController>(tray_.get()); + notification_icons_controller_->AddNotificationTrayItems( + tray_->tray_container()); + notification_counter_view_ = std::make_unique<NotificationCounterView>( + tray_.get(), notification_icons_controller_.get()); + } else { + notification_counter_view_ = + std::make_unique<NotificationCounterView>(tray_.get(), nullptr); + } } + bool IsScalableStatusAreaEnabled() { return GetParam(); } + void TearDown() override { notification_counter_view_.reset(); + notification_icons_controller_.reset(); + tray_.reset(); AshTestBase::TearDown(); } protected: void AddNotification(const std::string& notification_id, - const std::string& app_id = "app") { + bool is_pinned = false) { + message_center::RichNotificationData rich_notification_data; + rich_notification_data.pinned = is_pinned; message_center::MessageCenter::Get()->AddNotification( std::make_unique<message_center::Notification>( message_center::NOTIFICATION_TYPE_BASE_FORMAT, notification_id, base::UTF8ToUTF16("test_title"), base::UTF8ToUTF16("test message"), gfx::Image(), /*display_source=*/base::string16(), GURL(), message_center::NotifierId( - message_center::NotifierType::APPLICATION, app_id), - message_center::RichNotificationData(), + message_center::NotifierType::APPLICATION, "app"), + rich_notification_data, new message_center::NotificationDelegate())); } @@ -61,13 +81,17 @@ } private: + base::test::ScopedFeatureList scoped_feature_list_; + std::unique_ptr<UnifiedSystemTray> tray_; + std::unique_ptr<NotificationIconsController> notification_icons_controller_; std::unique_ptr<NotificationCounterView> notification_counter_view_; }; -TEST_F(NotificationCounterViewTest, CountForDisplay) { - // VM camera/mic notifications are ignored by the counter. - AddNotification("camera & mic", kVmCameraMicNotifierId); +INSTANTIATE_TEST_SUITE_P(All, + NotificationCounterViewTest, + testing::Bool() /* IsScalableStatusAreaEnabled() */); +TEST_P(NotificationCounterViewTest, CountForDisplay) { // Not visible when count == 0. notification_counter_view()->Update(); EXPECT_EQ(0, notification_counter_view()->count_for_display_for_testing()); @@ -90,27 +114,39 @@ EXPECT_TRUE(notification_counter_view()->GetVisible()); } -// Media notifications are not included when flag is set. -TEST_F(NotificationCounterViewTest, MediaNotifications) { +TEST_P(NotificationCounterViewTest, DisplayChanged) { + AddNotification("0", false /* is_pinned */); + AddNotification("1", true /* is_pinned */); notification_counter_view()->Update(); - EXPECT_EQ(0, notification_counter_view()->count_for_display_for_testing()); - AddNotification("1", kMediaSessionNotifierId); - { - // Counter should ignore media notifications when feature is enabled. - base::test::ScopedFeatureList features; - features.InitAndEnableFeature(features::kMediaNotificationsCounter); - notification_counter_view()->Update(); - EXPECT_EQ(0, notification_counter_view()->count_for_display_for_testing()); - EXPECT_FALSE(notification_counter_view()->GetVisible()); - } - { - // Counter should show media notifications when feature is disabled. - base::test::ScopedFeatureList features; - features.InitAndDisableFeature(features::kMediaNotificationsCounter); - notification_counter_view()->Update(); - EXPECT_EQ(1, notification_counter_view()->count_for_display_for_testing()); - EXPECT_TRUE(notification_counter_view()->GetVisible()); - } + + // In medium size screen, the counter should not be displayed since pinned + // notification icon is shown (if the feature is enabled). + UpdateDisplay("800x800"); + EXPECT_EQ(IsScalableStatusAreaEnabled(), + !notification_counter_view()->GetVisible()); + + // The counter should be shown when we remove the pinned notification. + message_center::MessageCenter::Get()->RemoveNotification("1", + false /* by_user */); + notification_counter_view()->Update(); + EXPECT_TRUE(notification_counter_view()->GetVisible()); + + AddNotification("1", true /* is_pinned */); + notification_counter_view()->Update(); + + // In small display, the counter show be shown with pinned notification. + UpdateDisplay("600x600"); + EXPECT_TRUE(notification_counter_view()->GetVisible()); + + // In large screen size, expected the same behavior like medium screen size. + UpdateDisplay("1680x800"); + EXPECT_EQ(IsScalableStatusAreaEnabled(), + !notification_counter_view()->GetVisible()); + + message_center::MessageCenter::Get()->RemoveNotification("1", + false /* by_user */); + notification_counter_view()->Update(); + EXPECT_TRUE(notification_counter_view()->GetVisible()); } } // namespace ash
diff --git a/ash/system/unified/notification_icons_controller.cc b/ash/system/unified/notification_icons_controller.cc index c441a5a..af6c6fe 100644 --- a/ash/system/unified/notification_icons_controller.cc +++ b/ash/system/unified/notification_icons_controller.cc
@@ -5,16 +5,21 @@ #include "ash/system/unified/notification_icons_controller.h" #include "ash/resources/vector_icons/vector_icons.h" +#include "ash/strings/grit/ash_strings.h" #include "ash/system/message_center/message_center_utils.h" #include "ash/system/tray/tray_constants.h" #include "ash/system/tray/tray_container.h" +#include "ash/system/tray/tray_utils.h" +#include "ash/system/unified/notification_counter_view.h" #include "ash/system/unified/unified_system_tray.h" #include "ash/system/unified/unified_system_tray_model.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/message_center/message_center.h" #include "ui/message_center/public/cpp/notification.h" #include "ui/message_center/vector_icons.h" #include "ui/views/controls/image_view.h" +#include "ui/views/controls/separator.h" namespace ash { @@ -22,6 +27,7 @@ // Maximum number of notification icons shown in the system tray button. constexpr int kMaxNotificationIconsShown = 2; +constexpr int kSeparatorPadding = 3; // We only show notification icon in the tray if it is either: // * Pinned (generally used for background process such as sharing your @@ -33,6 +39,25 @@ message_center::SystemNotificationWarningLevel::CRITICAL_WARNING; } +class SeparatorTrayItemView : public TrayItemView { + public: + explicit SeparatorTrayItemView(Shelf* shelf) : TrayItemView(shelf) { + views::Separator* separator = new views::Separator(); + separator->SetColor(AshColorProvider::Get()->GetContentLayerColor( + AshColorProvider::ContentLayerType::kSeparatorColor)); + separator->SetBorder( + views::CreateEmptyBorder(gfx::Insets(kSeparatorPadding))); + AddChildView(separator); + } + ~SeparatorTrayItemView() override = default; + SeparatorTrayItemView(const SeparatorTrayItemView&) = delete; + SeparatorTrayItemView& operator=(const SeparatorTrayItemView&) = delete; + + // TrayItemView: + void HandleLocaleChange() override {} + const char* GetClassName() const override { return "SeparatorTrayItemView"; } +}; + } // namespace NotificationIconTrayItemView::NotificationIconTrayItemView(Shelf* shelf) @@ -108,14 +133,44 @@ std::make_unique<NotificationIconTrayItemView>(tray_->shelf()))); } + hidden_notification_count_view_ = tray_container->AddChildView( + std::make_unique<HiddenNotificationCountView>(tray_->shelf())); + + separator_ = tray_container->AddChildView( + std::make_unique<SeparatorTrayItemView>(tray_->shelf())); + OnSystemTrayButtonSizeChanged(tray_->model()->GetSystemTrayButtonSize()); } +void NotificationIconsController::UpdateHiddenNotificationCounter() { + if (!icons_view_visible_ || !TrayItemHasNotification()) { + hidden_notification_count_view_->SetVisible(false); + return; + } + + // `first_unused_item_index_` is also the total number of notification icons + // shown in the tray. + int hidden_notification_num = + message_center_utils::GetNotificationCount() - first_unused_item_index_; + if (hidden_notification_num != 0) + hidden_notification_count_view_->label()->SetText( + l10n_util::GetStringFUTF16Int( + IDS_ASH_STATUS_TRAY_HIDDEN_NOTIFICATION_COUNT_LABEL, + hidden_notification_num)); + + hidden_notification_count_view_->SetVisible(hidden_notification_num != 0); +} + +bool NotificationIconsController::TrayItemHasNotification() { + return first_unused_item_index_ != 0; +} + void NotificationIconsController::OnSystemTrayButtonSizeChanged( UnifiedSystemTrayModel::SystemTrayButtonSize system_tray_size) { icons_view_visible_ = system_tray_size != UnifiedSystemTrayModel::SystemTrayButtonSize::kSmall; - Update(); + UpdateNotificationIcons(); + UpdateHiddenNotificationCounter(); } void NotificationIconsController::OnNotificationAdded(const std::string& id) { @@ -126,7 +181,7 @@ // Reset the notification icons if a notification is added since we don't // know the position where its icon should be added. - Update(); + UpdateNotificationIcons(); } void NotificationIconsController::OnNotificationRemoved(const std::string& id, @@ -134,7 +189,7 @@ // If the notification removed is displayed in an icon, call update to show // another notification if needed. if (GetNotificationIconShownInTray(id)) - Update(); + UpdateNotificationIcons(); } void NotificationIconsController::OnNotificationUpdated(const std::string& id) { @@ -143,7 +198,7 @@ item->UpdateTooltipText(); } -void NotificationIconsController::Update() { +void NotificationIconsController::UpdateNotificationIcons() { auto it = tray_items_.begin(); for (message_center::Notification* notification : message_center_utils::GetSortedVisibleNotifications()) { @@ -162,6 +217,7 @@ (*it)->Reset(); (*it)->SetVisible(false); } + separator_->SetVisible(icons_view_visible_ && TrayItemHasNotification()); } NotificationIconTrayItemView*
diff --git a/ash/system/unified/notification_icons_controller.h b/ash/system/unified/notification_icons_controller.h index 05532827..33acae70 100644 --- a/ash/system/unified/notification_icons_controller.h +++ b/ash/system/unified/notification_icons_controller.h
@@ -75,6 +75,12 @@ // Initialize the view by adding items to the container of the tray. void AddNotificationTrayItems(TrayContainer* tray_container); + // Update the text and visibility of the hidden notification counter. + void UpdateHiddenNotificationCounter(); + + // Returns true if any item in `tray_items_` is containing a notification. + bool TrayItemHasNotification(); + // UnifiedSystemTrayModel::Observer: void OnSystemTrayButtonSizeChanged( UnifiedSystemTrayModel::SystemTrayButtonSize system_tray_size) override; @@ -89,8 +95,11 @@ } private: - // Update the icons shown according to the notifications in message center. - void Update(); + friend class NotificationIconsControllerTest; + + // Iterate through the notifications in message center and update the icons + // shown accordingly. + void UpdateNotificationIcons(); // If the notification with given id is currently shown in tray, returns the // pointer to that tray item. Otherwise, returns a null pointer. @@ -105,11 +114,15 @@ // icons tray item. All the items in previous index are used and visible. size_t first_unused_item_index_ = 0; - // Indicates if the notification icons view is set to be shown. + // Indicates if the notification icons view is set to be shown. Currently, we + // show the icon view in medium or large screen size. bool icons_view_visible_ = false; UnifiedSystemTray* tray_; + TrayItemView* hidden_notification_count_view_ = nullptr; + TrayItemView* separator_ = nullptr; + base::ScopedObservation<UnifiedSystemTrayModel, UnifiedSystemTrayModel::Observer> system_tray_model_observation_{this};
diff --git a/ash/system/unified/notification_icons_controller_unittest.cc b/ash/system/unified/notification_icons_controller_unittest.cc index 950ba38..5ff8704 100644 --- a/ash/system/unified/notification_icons_controller_unittest.cc +++ b/ash/system/unified/notification_icons_controller_unittest.cc
@@ -4,10 +4,14 @@ #include "ash/system/unified/notification_icons_controller.h" +#include "ash/media/media_notification_constants.h" +#include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/notification_utils.h" +#include "ash/public/cpp/vm_camera_mic_constants.h" #include "ash/system/tray/tray_item_view.h" #include "ash/system/unified/unified_system_tray.h" #include "ash/test/ash_test_base.h" +#include "base/test/scoped_feature_list.h" #include "ui/message_center/message_center.h" #include "ui/message_center/public/cpp/notification.h" @@ -34,7 +38,17 @@ AshTestBase::TearDown(); } - std::string AddNotification(bool is_pinned, bool is_critical_warning) { + TrayItemView* separator() { + return notification_icons_controller_->separator_; + } + + TrayItemView* hidden_notification_count_view() { + return notification_icons_controller_->hidden_notification_count_view_; + } + + std::string AddNotification(bool is_pinned, + bool is_critical_warning, + const std::string& app_id = "app") { std::string id = base::NumberToString(notification_id_++); auto warning_level = @@ -50,7 +64,7 @@ base::UTF8ToUTF16("test_title"), base::UTF8ToUTF16("test message"), base::string16() /*display_source */, GURL() /* origin_url */, message_center::NotifierId( - message_center::NotifierType::SYSTEM_COMPONENT, "ash.debug"), + message_center::NotifierType::SYSTEM_COMPONENT, app_id), rich_notification_data, nullptr /* delegate */, gfx::VectorIcon(), warning_level)); notification_id_++; @@ -66,20 +80,29 @@ TEST_F(NotificationIconsControllerTest, DisplayChanged) { AddNotification(true /* is_pinned */, false /* is_critical_warning */); + AddNotification(false /* is_pinned */, false /* is_critical_warning */); + notification_icons_controller_->UpdateHiddenNotificationCounter(); + + // Notification icons should be shown in medium screen size. + UpdateDisplay("800x800"); + EXPECT_TRUE( + notification_icons_controller_->tray_items().front()->GetVisible()); + EXPECT_TRUE(separator()->GetVisible()); + EXPECT_TRUE(hidden_notification_count_view()->GetVisible()); // Notification icons should not be shown in small screen size. UpdateDisplay("600x600"); EXPECT_FALSE( notification_icons_controller_->tray_items().front()->GetVisible()); + EXPECT_FALSE(separator()->GetVisible()); + EXPECT_FALSE(hidden_notification_count_view()->GetVisible()); - // Notification icons should be shown in medium and large screen size. - UpdateDisplay("800x800"); - EXPECT_TRUE( - notification_icons_controller_->tray_items().front()->GetVisible()); - + // Notification icons should be shown in large screen size. UpdateDisplay("1680x800"); EXPECT_TRUE( notification_icons_controller_->tray_items().front()->GetVisible()); + EXPECT_TRUE(separator()->GetVisible()); + EXPECT_TRUE(hidden_notification_count_view()->GetVisible()); } TEST_F(NotificationIconsControllerTest, ShowNotificationIcons) { @@ -88,11 +111,13 @@ // If there's no notification, no notification icons should be shown. EXPECT_FALSE(notification_icons_controller_->tray_items()[0]->GetVisible()); EXPECT_FALSE(notification_icons_controller_->tray_items()[1]->GetVisible()); + EXPECT_FALSE(separator()->GetVisible()); // Same case for non pinned or non critical warning notification. AddNotification(false /* is_pinned */, false /* is_critical_warning */); EXPECT_FALSE(notification_icons_controller_->tray_items()[0]->GetVisible()); EXPECT_FALSE(notification_icons_controller_->tray_items()[1]->GetVisible()); + EXPECT_FALSE(separator()->GetVisible()); // Notification icons should be shown when pinned or critical warning // notification is added. @@ -100,11 +125,13 @@ AddNotification(true /* is_pinned */, false /* is_critical_warning */); EXPECT_TRUE(notification_icons_controller_->tray_items()[0]->GetVisible()); EXPECT_FALSE(notification_icons_controller_->tray_items()[1]->GetVisible()); + EXPECT_TRUE(separator()->GetVisible()); std::string id1 = AddNotification(false /* is_pinned */, true /* is_critical_warning */); EXPECT_TRUE(notification_icons_controller_->tray_items()[0]->GetVisible()); EXPECT_TRUE(notification_icons_controller_->tray_items()[1]->GetVisible()); + EXPECT_TRUE(separator()->GetVisible()); // Remove the critical warning notification should make the tray show only one // icon. @@ -112,12 +139,47 @@ false /* by_user */); EXPECT_TRUE(notification_icons_controller_->tray_items()[0]->GetVisible()); EXPECT_FALSE(notification_icons_controller_->tray_items()[1]->GetVisible()); + EXPECT_TRUE(separator()->GetVisible()); // Remove the pinned notification, no icon is shown. message_center::MessageCenter::Get()->RemoveNotification(id0, false /* by_user */); EXPECT_FALSE(notification_icons_controller_->tray_items()[0]->GetVisible()); EXPECT_FALSE(notification_icons_controller_->tray_items()[1]->GetVisible()); + EXPECT_FALSE(separator()->GetVisible()); +} + +TEST_F(NotificationIconsControllerTest, HiddenNotificationCount) { + UpdateDisplay("800x800"); + + // If there's no notification, the counter should be hidden by default. + EXPECT_FALSE(hidden_notification_count_view()->GetVisible()); + + int hidden_notification_num = 5; + base::string16 expected_text = base::UTF8ToUTF16("+5"); + + // The counter should not be shown if no icon is displayed in the tray (a.k.a + // no important notification). + for (int i = 0; i < hidden_notification_num; ++i) { + AddNotification(false /* is_pinned */, false /* is_critical_warning */); + } + notification_icons_controller_->UpdateHiddenNotificationCounter(); + EXPECT_FALSE(hidden_notification_count_view()->GetVisible()); + + // Added a pinned notification, the counter should now be shown with the + // expected text. + std::string id0 = + AddNotification(true /* is_pinned */, false /* is_critical_warning */); + notification_icons_controller_->UpdateHiddenNotificationCounter(); + EXPECT_TRUE(hidden_notification_count_view()->GetVisible()); + EXPECT_EQ(expected_text, + hidden_notification_count_view()->label()->GetText()); + + // Remove the pinned notification should make the counter switch to hidden. + message_center::MessageCenter::Get()->RemoveNotification(id0, + false /* by_user */); + notification_icons_controller_->UpdateHiddenNotificationCounter(); + EXPECT_FALSE(hidden_notification_count_view()->GetVisible()); } } // namespace ash
diff --git a/ash/system/unified/unified_system_tray.cc b/ash/system/unified/unified_system_tray.cc index b2ac971..092a7c3a 100644 --- a/ash/system/unified/unified_system_tray.cc +++ b/ash/system/unified/unified_system_tray.cc
@@ -137,7 +137,9 @@ CameraMicTrayItemView::Type::kCamera)), mic_view_( new CameraMicTrayItemView(shelf, CameraMicTrayItemView::Type::kMic)), - notification_counter_item_(new NotificationCounterView(shelf)), + notification_counter_item_( + new NotificationCounterView(this, + notification_icons_controller_.get())), quiet_mode_view_(new QuietModeView(shelf)), time_view_(new tray::TimeTrayItemView(shelf, model())) { tray_container()->SetMargin( @@ -493,6 +495,8 @@ void UnifiedSystemTray::UpdateNotificationAfterDelay() { notification_counter_item_->Update(); quiet_mode_view_->Update(); + if (notification_icons_controller_) + notification_icons_controller_->UpdateHiddenNotificationCounter(); } message_center::MessagePopupView*
diff --git a/ash/wallpaper/OWNERS b/ash/wallpaper/OWNERS index 412cd3fb..df40d180 100644 --- a/ash/wallpaper/OWNERS +++ b/ash/wallpaper/OWNERS
@@ -1,2 +1,3 @@ achuith@chromium.org xdai@chromium.org +xiaohuic@chromium.org
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc index 617e411f..c04f3215 100644 --- a/base/allocator/partition_allocator/partition_alloc_unittest.cc +++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -390,11 +390,7 @@ class MockPartitionStatsDumper : public PartitionStatsDumper { public: - MockPartitionStatsDumper() - : total_resident_bytes(0), - total_active_bytes(0), - total_decommittable_bytes(0), - total_discardable_bytes(0) {} + MockPartitionStatsDumper() = default; void PartitionDumpTotals(const char* partition_name, const PartitionMemoryStats* stats) override { @@ -423,18 +419,18 @@ } const PartitionBucketMemoryStats* GetBucketStats(size_t bucket_size) { - for (size_t i = 0; i < bucket_stats.size(); ++i) { - if (bucket_stats[i].bucket_slot_size == bucket_size) - return &bucket_stats[i]; + for (auto& stat : bucket_stats) { + if (stat.bucket_slot_size == bucket_size) + return &stat; } return nullptr; } private: - size_t total_resident_bytes; - size_t total_active_bytes; - size_t total_decommittable_bytes; - size_t total_discardable_bytes; + size_t total_resident_bytes = 0; + size_t total_active_bytes = 0; + size_t total_decommittable_bytes = 0; + size_t total_discardable_bytes = 0; std::vector<PartitionBucketMemoryStats> bucket_stats; };
diff --git a/base/allocator/partition_allocator/partition_root.cc b/base/allocator/partition_allocator/partition_root.cc index dce569f..38c2f90 100644 --- a/base/allocator/partition_allocator/partition_root.cc +++ b/base/allocator/partition_allocator/partition_root.cc
@@ -775,10 +775,9 @@ if (flags & PartitionPurgeDecommitEmptySlotSpans) DecommitEmptySlotSpans(); if (flags & PartitionPurgeDiscardUnusedSystemPages) { - for (size_t i = 0; i < kNumBuckets; ++i) { - Bucket* bucket = &buckets[i]; - if (bucket->slot_size >= SystemPageSize()) - internal::PartitionPurgeBucket(bucket); + for (Bucket& bucket : buckets) { + if (bucket.slot_size >= SystemPageSize()) + internal::PartitionPurgeBucket(&bucket); } } } @@ -857,9 +856,9 @@ // Do not hold the lock when calling |dumper|, as it may allocate. if (!is_light_dump) { - for (size_t i = 0; i < kNumBuckets; ++i) { - if (bucket_stats[i].is_valid) - dumper->PartitionsDumpBucketStats(partition_name, &bucket_stats[i]); + for (auto& stat : bucket_stats) { + if (stat.is_valid) + dumper->PartitionsDumpBucketStats(partition_name, &stat); } for (size_t i = 0; i < num_direct_mapped_allocations; ++i) {
diff --git a/base/allocator/partition_allocator/pcscan.cc b/base/allocator/partition_allocator/pcscan.cc index 3a5eb3e..cf64e2e 100644 --- a/base/allocator/partition_allocator/pcscan.cc +++ b/base/allocator/partition_allocator/pcscan.cc
@@ -301,6 +301,9 @@ size_t SweepQuarantine(); PCScan<thread_safe>& pcscan_; + // Cache the pcscan epoch to avoid the compiler loading the atomic + // QuarantineData::epoch_ on each access. + const size_t pcscan_epoch_; ScanAreas scan_areas_; LargeScanAreas large_scan_areas_; @@ -323,7 +326,7 @@ return nullptr; // We are certain here that |maybe_ptr| points to the super page payload. return QuarantineBitmapFromPointer(QuarantineBitmapType::kScanner, - pcscan_.quarantine_data_.epoch(), + pcscan_epoch_, reinterpret_cast<char*>(maybe_ptr)); } @@ -374,8 +377,7 @@ // PCScan has exclusive access to the scanner bitmap, we can avoid atomic rmw // operation for it. scanner_bitmap->template ClearBit<AccessType::kNonAtomic>(base); - QuarantineBitmapFromPointer(QuarantineBitmapType::kMutator, - pcscan_.quarantine_data_.epoch(), + QuarantineBitmapFromPointer(QuarantineBitmapType::kMutator, pcscan_epoch_, reinterpret_cast<char*>(base)) ->template SetBit<AccessType::kAtomic>(base); return target_slot_span->bucket->slot_size; @@ -389,7 +391,7 @@ for (auto super_page : super_pages_) { auto* bitmap = QuarantineBitmapFromPointer( - QuarantineBitmapType::kScanner, pcscan_.quarantine_data_.epoch(), + QuarantineBitmapType::kScanner, pcscan_epoch_, reinterpret_cast<char*>(super_page)); auto* root = Root::FromSuperPage(reinterpret_cast<char*>(super_page)); bitmap->template Iterate<AccessType::kNonAtomic>([root](uintptr_t ptr) { @@ -593,11 +595,11 @@ return quarantine_size; } - // Keep this constant so that the compiler can remove redundant loads for - // the base of the normal bucket pool and hoist them out of the loops. const ScanFunction scan_function_; const PCScanTask& pcscan_task_; #if defined(PA_HAS_64_BITS_POINTERS) + // Keep this a constant so that the compiler can remove redundant loads for + // the base of the normal bucket pool and hoist them out of the loops. const uintptr_t normal_bucket_pool_base_; #endif }; @@ -618,7 +620,7 @@ // TODO(chromium:1129751): Check mutator bitmap as well if performance // allows. auto* bitmap = QuarantineBitmapFromPointer( - QuarantineBitmapType::kScanner, pcscan_.quarantine_data_.epoch(), + QuarantineBitmapType::kScanner, pcscan_epoch_, reinterpret_cast<char*>(scan_area.begin)); for (uintptr_t* current_slot = scan_area.begin; current_slot < scan_area.end; @@ -649,7 +651,7 @@ for (auto super_page : super_pages_) { auto* bitmap = QuarantineBitmapFromPointer( - QuarantineBitmapType::kScanner, pcscan_.quarantine_data_.epoch(), + QuarantineBitmapType::kScanner, pcscan_epoch_, reinterpret_cast<char*>(super_page)); auto* root = Root::FromSuperPage(reinterpret_cast<char*>(super_page)); bitmap->template IterateAndClear<AccessType::kNonAtomic>( @@ -665,7 +667,8 @@ } template <bool thread_safe> -PCScan<thread_safe>::PCScanTask::PCScanTask(PCScan& pcscan) : pcscan_(pcscan) { +PCScan<thread_safe>::PCScanTask::PCScanTask(PCScan& pcscan) + : pcscan_(pcscan), pcscan_epoch_(pcscan.quarantine_data_.epoch()) { // Threshold for which bucket size it is worthwhile in checking whether the // object is a quarantined object and can be skipped. static constexpr size_t kLargeScanAreaThreshold = 8192; @@ -710,8 +713,7 @@ super_pages_.insert(reinterpret_cast<uintptr_t>(super_page)); } else { #if DCHECK_IS_ON() - PA_CHECK(IsScannerQuarantineBitmapEmpty( - super_page, pcscan_.quarantine_data_.epoch())); + PA_CHECK(IsScannerQuarantineBitmapEmpty(super_page, pcscan_epoch_)); #endif } }
diff --git a/base/android/java/src/org/chromium/base/ApplicationStatus.java b/base/android/java/src/org/chromium/base/ApplicationStatus.java index 92c26f3..4306e356 100644 --- a/base/android/java/src/org/chromium/base/ApplicationStatus.java +++ b/base/android/java/src/org/chromium/base/ApplicationStatus.java
@@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; @@ -608,6 +609,24 @@ } /** + * Mark all Activities as destroyed to avoid side-effects in future test. + */ + @MainThread + public static void resetActivitiesForInstrumentationTests() { + assert ThreadUtils.runningOnUiThread(); + + synchronized (sActivityInfo) { + // Copy the set to avoid concurrent modifications to the underlying set. + for (Activity activity : new HashSet<>(sActivityInfo.keySet())) { + assert activity.getApplication() + == null : "Real activities that are launched should be closed by test code " + + "and not rely on this cleanup of mocks."; + onStateChangeForTesting(activity, ActivityState.DESTROYED); + } + } + } + + /** * Registers the single thread-safe native activity status listener. * This handles the case where the caller is not on the main thread. * Note that this is used by a leaky singleton object from the native
diff --git a/base/android/javatests/src/org/chromium/base/EarlyTraceEventTest.java b/base/android/javatests/src/org/chromium/base/EarlyTraceEventTest.java index 35a045c1..3fc2cd96 100644 --- a/base/android/javatests/src/org/chromium/base/EarlyTraceEventTest.java +++ b/base/android/javatests/src/org/chromium/base/EarlyTraceEventTest.java
@@ -18,6 +18,7 @@ import org.chromium.base.EarlyTraceEvent.Event; import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import java.util.ArrayList; @@ -53,6 +54,7 @@ @Test @SmallTest @Feature({"Android-AppBase"}) + @DisabledTest(message = "https://crbug.com/1173968") public void testCanRecordEvent() { EarlyTraceEvent.enable(); long myThreadId = Process.myTid();
diff --git a/base/check.h b/base/check.h index c94ab68d..17048e45 100644 --- a/base/check.h +++ b/base/check.h
@@ -85,7 +85,7 @@ // Stream for adding optional details to the error message. std::ostream& stream(); - ~CheckError(); + NOMERGE ~CheckError(); CheckError(const CheckError& other) = delete; CheckError& operator=(const CheckError& other) = delete;
diff --git a/base/compiler_specific.h b/base/compiler_specific.h index fa961b0c..14a5d687 100644 --- a/base/compiler_specific.h +++ b/base/compiler_specific.h
@@ -332,4 +332,11 @@ #endif // defined(__clang_analyzer__) +// Use nomerge attribute to disable optimization of merging multiple same calls. +#if defined(__clang__) && __has_attribute(nomerge) && !defined(OS_CHROMEOS) +#define NOMERGE [[clang::nomerge]] +#else +#define NOMERGE +#endif + #endif // BASE_COMPILER_SPECIFIC_H_
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc index d8f2b98..8b769c5 100644 --- a/base/files/file_util_posix.cc +++ b/base/files/file_util_posix.cc
@@ -625,7 +625,8 @@ File CreateAndOpenTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) { // For call to close() inside ScopedFD. ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); - return File(CreateAndOpenFdForTemporaryFileInDir(dir, temp_file)); + ScopedFD fd = CreateAndOpenFdForTemporaryFileInDir(dir, temp_file); + return fd.is_valid() ? File(std::move(fd)) : File(File::GetLastFileError()); } bool CreateTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) {
diff --git a/build/chromeos/test_runner.py b/build/chromeos/test_runner.py index 8818677..b6fb649 100755 --- a/build/chromeos/test_runner.py +++ b/build/chromeos/test_runner.py
@@ -266,6 +266,9 @@ self._suite_name = args.suite_name self._tast_vars = args.tast_vars self._tests = args.tests + # The CQ passes in '--gtest_filter' when specifying tests to skip. Store it + # here and parse it later to integrate it into Tast executions. + self._gtest_style_filter = args.gtest_filter self._conditional = args.conditional self._should_strip = args.strip_chrome self._deploy_lacros = args.deploy_lacros @@ -283,23 +286,30 @@ 'When using the host-side Tast bin, "--logs-dir" must be passed in ' 'order to parse its results.') + # If the first test filter is negative, it should be safe to assume all of + # them are, so just test the first filter. + if self._gtest_style_filter and self._gtest_style_filter[0] == '-': + raise TestFormatError('Negative test filters not supported for Tast.') + @property def suite_name(self): return self._suite_name def build_test_command(self): - if '--gtest_filter=%s' % self.suite_name in self._additional_args: - logging.info('GTest filtering not supported for tast tests. The ' - '--gtest_filter arg will be ignored.') - self._additional_args.remove('--gtest_filter=%s' % self.suite_name) - if any(arg.startswith('--gtest_repeat') for arg in self._additional_args): - logging.info( - '--gtest_repeat not supported for tast tests. The arg will be ' - 'ignored.') - self._additional_args = [ - arg for arg in self._additional_args - if not arg.startswith('--gtest_repeat') - ] + unsupported_args = [ + '--test-launcher-retry-limit', + '--test-launcher-batch-limit', + '--gtest_repeat', + ] + for unsupported_arg in unsupported_args: + if any(arg.startswith(unsupported_arg) for arg in self._additional_args): + logging.info( + '%s not supported for Tast tests. The arg will be ignored.', + unsupported_arg) + self._additional_args = [ + arg for arg in self._additional_args + if not arg.startswith(unsupported_arg) + ] # Lacros deployment mounts itself by default. self._test_cmd.extend( @@ -351,6 +361,19 @@ '--tast-total-shards=%d' % self._test_launcher_total_shards, '--tast-shard-index=%d' % self._test_launcher_shard_index, ] + # If we're using a test filter, replace the contents of the Tast + # conditional with a long list of "name:test" expressions, one for each + # test in the filter. + if self._gtest_style_filter: + if self._conditional or self._tests: + logging.warning( + 'Presence of --gtest_filter will cause the specified Tast ' + 'conditional or test list to be ignored.') + names = [] + for test in self._gtest_style_filter.split(':'): + names.append('"name:%s"' % test) + self._conditional = '(' + ' || '.join(names) + ')' + if self._conditional: # Don't use pipes.quote() here. Something funky happens with the arg # as it gets passed down from cros_run_test to tast. (Tast picks up the @@ -922,6 +945,12 @@ action='append', dest='tests', help='A Tast test to run in the device (eg: "ui.ChromeLogin").') + tast_test_parser.add_argument( + '--gtest_filter', + type=str, + help="Similar to GTest's arg of the same name, this will filter out the " + "specified tests from the Tast run. However, due to the nature of Tast's " + 'cmd-line API, this will overwrite the value(s) of "--test" above.') add_common_args(gtest_parser, tast_test_parser, host_cmd_parser)
diff --git a/build/chromeos/test_runner_test.py b/build/chromeos/test_runner_test.py index 9e877824b..067529b 100755 --- a/build/chromeos/test_runner_test.py +++ b/build/chromeos/test_runner_test.py
@@ -39,6 +39,19 @@ shutil.rmtree(self._tmp_dir, ignore_errors=True) self.mock_rdb.stop() + def safeAssertItemsEqual(self, list1, list2): + """A Py3 safe version of assertItemsEqual. + + See https://bugs.python.org/issue17866. + """ + if six.PY3: + self.assertSetEqual(set(list1), set(list2)) + else: + self.assertItemsEqual(list1, list2) + + +class TastTests(TestRunnerTest): + def get_common_tast_args(self, use_vm): return [ 'script_name', @@ -81,80 +94,24 @@ ] return expectation - def safeAssertItemsEqual(self, list1, list2): - """A Py3 safe version of assertItemsEqual. - - See https://bugs.python.org/issue17866. - """ - if six.PY3: - self.assertSetEqual(set(list1), set(list2)) - else: - self.assertItemsEqual(list1, list2) - - @parameterized.expand([ - [True], - [False], - ]) - def test_gtest(self, use_vm): - """Tests running a gtest.""" - fd_mock = mock.mock_open() - - args = [ - 'script_name', - 'vm-test', - '--test-exe=out_eve/Release/base_unittests', - '--board=eve', - '--path-to-outdir=out_eve/Release', - '--use-vm' if use_vm else '--device=localhost:2222', - ] - with mock.patch.object(sys, 'argv', args),\ - mock.patch.object(test_runner.subprocess, 'Popen') as mock_popen,\ - mock.patch.object(os, 'fdopen', fd_mock),\ - mock.patch.object(os, 'remove') as mock_remove,\ - mock.patch.object(tempfile, 'mkstemp', - return_value=(3, 'out_eve/Release/device_script.sh')),\ - mock.patch.object(os, 'fchmod'): - mock_popen.return_value.returncode = 0 - - test_runner.main() - self.assertEqual(1, mock_popen.call_count) - expected_cmd = [ - test_runner.CROS_RUN_TEST_PATH, '--board', 'eve', '--cache-dir', - test_runner.DEFAULT_CROS_CACHE, '--as-chronos', '--remote-cmd', - '--cwd', 'out_eve/Release', '--files', - 'out_eve/Release/device_script.sh' - ] - expected_cmd.extend(['--start', '--copy-on-write'] - if use_vm else ['--device', 'localhost:2222']) - expected_cmd.extend(['--', './device_script.sh']) - self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) - - fd_mock().write.assert_called_once_with( - '#!/bin/sh\nexport HOME=/usr/local/tmp\n' - 'export TMPDIR=/usr/local/tmp\n' - 'LD_LIBRARY_PATH=./ ./out_eve/Release/base_unittests ' - '--test-launcher-shard-index=0 --test-launcher-total-shards=1\n') - mock_remove.assert_called_once_with('out_eve/Release/device_script.sh') - - @parameterized.expand([ - [True], - [False], - ]) - def test_tast(self, use_vm): - """Tests running a tast tests.""" + def test_tast_gtest_filter(self): + """Tests running tast tests with a gtest-style filter.""" with open(os.path.join(self._tmp_dir, 'streamed_results.jsonl'), 'w') as f: json.dump(_TAST_TEST_RESULTS_JSON, f) - args = self.get_common_tast_args(use_vm) + [ - '-t=ui.ChromeLogin', + args = self.get_common_tast_args(False) + [ + '--attr-expr=( "group:mainline" && "dep:chrome" && !informational)', + '--gtest_filter=ui.ChromeLogin:ui.WindowControl', ] with mock.patch.object(sys, 'argv', args),\ mock.patch.object(test_runner.subprocess, 'Popen') as mock_popen: mock_popen.return_value.returncode = 0 test_runner.main() - expected_cmd = self.get_common_tast_expectations(use_vm) + [ - '--tast', 'ui.ChromeLogin' + # The gtest filter should cause the Tast expr to be replaced with a list + # of the tests in the filter. + expected_cmd = self.get_common_tast_expectations(False) + [ + '--tast=("name:ui.ChromeLogin" || "name:ui.WindowControl")' ] self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) @@ -233,6 +190,77 @@ self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) + @parameterized.expand([ + [True], + [False], + ]) + def test_tast(self, use_vm): + """Tests running a tast tests.""" + with open(os.path.join(self._tmp_dir, 'streamed_results.jsonl'), 'w') as f: + json.dump(_TAST_TEST_RESULTS_JSON, f) + + args = self.get_common_tast_args(use_vm) + [ + '-t=ui.ChromeLogin', + ] + with mock.patch.object(sys, 'argv', args),\ + mock.patch.object(test_runner.subprocess, 'Popen') as mock_popen: + mock_popen.return_value.returncode = 0 + + test_runner.main() + expected_cmd = self.get_common_tast_expectations(use_vm) + [ + '--tast', 'ui.ChromeLogin' + ] + + self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) + + +class GTestTest(TestRunnerTest): + + @parameterized.expand([ + [True], + [False], + ]) + def test_gtest(self, use_vm): + """Tests running a gtest.""" + fd_mock = mock.mock_open() + + args = [ + 'script_name', + 'vm-test', + '--test-exe=out_eve/Release/base_unittests', + '--board=eve', + '--path-to-outdir=out_eve/Release', + '--use-vm' if use_vm else '--device=localhost:2222', + ] + with mock.patch.object(sys, 'argv', args),\ + mock.patch.object(test_runner.subprocess, 'Popen') as mock_popen,\ + mock.patch.object(os, 'fdopen', fd_mock),\ + mock.patch.object(os, 'remove') as mock_remove,\ + mock.patch.object(tempfile, 'mkstemp', + return_value=(3, 'out_eve/Release/device_script.sh')),\ + mock.patch.object(os, 'fchmod'): + mock_popen.return_value.returncode = 0 + + test_runner.main() + self.assertEqual(1, mock_popen.call_count) + expected_cmd = [ + test_runner.CROS_RUN_TEST_PATH, '--board', 'eve', '--cache-dir', + test_runner.DEFAULT_CROS_CACHE, '--as-chronos', '--remote-cmd', + '--cwd', 'out_eve/Release', '--files', + 'out_eve/Release/device_script.sh' + ] + expected_cmd.extend(['--start', '--copy-on-write'] + if use_vm else ['--device', 'localhost:2222']) + expected_cmd.extend(['--', './device_script.sh']) + self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) + + fd_mock().write.assert_called_once_with( + '#!/bin/sh\nexport HOME=/usr/local/tmp\n' + 'export TMPDIR=/usr/local/tmp\n' + 'LD_LIBRARY_PATH=./ ./out_eve/Release/base_unittests ' + '--test-launcher-shard-index=0 --test-launcher-total-shards=1\n') + mock_remove.assert_called_once_with('out_eve/Release/device_script.sh') + if __name__ == '__main__': unittest.main()
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni index 747e92a5..7b3d259 100644 --- a/build/config/compiler/compiler.gni +++ b/build/config/compiler/compiler.gni
@@ -68,7 +68,7 @@ # not ARC or linux-chromeos since it's been seen to not play nicely with # Chrome's clang. crbug.com/1033839 use_thin_lto = is_cfi || (is_official_build && - (target_os == "android" || + (is_win || target_os == "android" || ((is_chromeos_ash || is_chromeos_lacros) && is_chromeos_device)))
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index e3cdef3..4030d55 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -0.20210209.0.1 +0.20210209.2.2
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index aeff336f..4030d55 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -0.20210209.1.1 +0.20210209.2.2
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py index 6024a35..c3b1182 100755 --- a/build/vs_toolchain.py +++ b/build/vs_toolchain.py
@@ -19,6 +19,21 @@ from gn_helpers import ToGNString +# VS 2019 16.61 with 10.0.19041 SDK, and 10.0.17134 version of +# d3dcompiler_47.dll, with ARM64 libraries and UWP support. +# See go/chromium-msvc-toolchain for instructions about how to update the +# toolchain. +# +# When updating the toolchain, consider the following areas impacted by the +# toolchain version: +# +# * //base/win/windows_version.cc NTDDI preprocessor check +# Triggers a compiler error if the available SDK is older than the minimum. +# * //build/config/win/BUILD.gn NTDDI_VERSION value +# Affects the availability of APIs in the toolchain headers. +# * //docs/windows_build_instructions.md mentions of VS or Windows SDK. +# Keeps the document consistent with the toolchain version. +TOOLCHAIN_HASH = '20d5f2553f' script_dir = os.path.dirname(os.path.realpath(__file__)) json_data_file = os.path.join(script_dir, 'win_toolchain.json') @@ -68,8 +83,6 @@ toolchain = toolchain_data['path'] version = toolchain_data['version'] win_sdk = toolchain_data.get('win_sdk') - if not win_sdk: - win_sdk = toolchain_data['win8sdk'] wdk = toolchain_data['wdk'] # TODO(scottmg): The order unfortunately matters in these. They should be # split into separate keys for x64/x86/arm64. (See CopyDlls call below). @@ -427,27 +440,11 @@ def _GetDesiredVsToolchainHashes(): """Load a list of SHA1s corresponding to the toolchains that we want installed - to build with. - - When updating the toolchain, consider the following areas impacted by the - toolchain version: - - * //base/win/windows_version.cc NTDDI preprocessor check - Triggers a compiler error if the available SDK is older than the minimum. - * //build/config/win/BUILD.gn NTDDI_VERSION value - Affects the availability of APIs in the toolchain headers. - * //docs/windows_build_instructions.md mentions of VS or Windows SDK. - Keeps the document consistent with the toolchain version. - """ - # VS 2019 16.61 with 10.0.19041 SDK, and 10.0.17134 version of - # d3dcompiler_47.dll, with ARM64 libraries and UWP support. - # See go/chromium-msvc-toolchain for instructions about how to update the - # toolchain. - toolchain_hash = '20d5f2553f' + to build with.""" # Third parties that do not have access to the canonical toolchain can map # canonical toolchain version to their own toolchain versions. - toolchain_hash_mapping_key = 'GYP_MSVS_HASH_%s' % toolchain_hash - return [os.environ.get(toolchain_hash_mapping_key, toolchain_hash)] + toolchain_hash_mapping_key = 'GYP_MSVS_HASH_%s' % TOOLCHAIN_HASH + return [os.environ.get(toolchain_hash_mapping_key, TOOLCHAIN_HASH)] def ShouldUpdateToolchain():
diff --git a/chrome/VERSION b/chrome/VERSION index 2a86bed..c41e3bc 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=90 MINOR=0 -BUILD=4414 +BUILD=4415 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 74e07f54..c40a958 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -291,6 +291,7 @@ "//base:jni_java", "//cc:cc_java", "//chrome/android/features/keyboard_accessory:public_java", + "//chrome/android/feed:web_feed_java", "//chrome/android/modules/cablev2_authenticator/public:java", "//chrome/android/modules/image_editor/provider:java", "//chrome/android/modules/stack_unwinder/provider:java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni index 7afdf76c..eaa04c2d 100644 --- a/chrome/android/chrome_junit_test_java_sources.gni +++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -2,6 +2,7 @@ "junit/src/org/chromium/chrome/browser/AppIndexingUtilTest.java", "junit/src/org/chromium/chrome/browser/ChromeActionModeHandlerUnitTest.java", "junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java", + "junit/src/org/chromium/chrome/browser/ChromeLocalizationUtilsTest.java", "junit/src/org/chromium/chrome/browser/DeferredStartupHandlerTest.java", "junit/src/org/chromium/chrome/browser/DelayedScreenLockIntentHandlerTest.java", "junit/src/org/chromium/chrome/browser/PowerBroadcastReceiverTest.java",
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantMetrics.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantMetrics.java index dda72694..71caac1 100644 --- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantMetrics.java +++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantMetrics.java
@@ -51,6 +51,10 @@ /** * UKM metric. Records the start of a lite script. + * + * The events recorded by this call lacks a trigger type. This is appropriate when the trigger + * type is not yet known, because the Trigger protos sent by the server have not been processed + * yet. If trigger protos are available, record the metric from C++. */ public static void recordLiteScriptStarted( WebContents webContents, @LiteScriptStarted int started) { @@ -65,6 +69,10 @@ /** * UKM metric. Records the finish of a lite script. + * + * The events recorded by this call lacks a trigger type. This is appropriate when the trigger + * type is not yet known, because the Trigger protos sent by the server have not been processed + * yet. If trigger protos are available, record the metric from C++. */ public static void recordLiteScriptFinished( WebContents webContents, @LiteScriptFinishedState int finishedState) { @@ -79,8 +87,12 @@ /** * UKM metric. Records the onboarding after a successful lite script. + * + * The events recorded by this call lacks a trigger type. This is only appropriate when called + * for the deprecated lite script triggers, not defined from a TriggerProto. */ - public static void recordLiteScriptOnboarding( + @Deprecated + /* package */ static void recordLiteScriptOnboarding( WebContents webContents, @LiteScriptOnboarding int onboarding) { if (!areWebContentsValid(webContents)) { return; @@ -93,8 +105,12 @@ /** * UKM metric. Records whether the lite script prompt was shown to the user or not. + * + * The events recorded by this call lacks a trigger type. This is only appropriate when called + * for the deprecated lite script trigger, not defined from a TriggerProto. */ - public static void recordLiteScriptShownToUser( + @Deprecated + /* package */ static void recordLiteScriptShownToUser( WebContents webContents, @LiteScriptShownToUser int shownToUser) { if (!areWebContentsValid(webContents)) { return;
diff --git a/chrome/android/features/start_surface/DEPS b/chrome/android/features/start_surface/DEPS index 69a3c08..6535a88f 100644 --- a/chrome/android/features/start_surface/DEPS +++ b/chrome/android/features/start_surface/DEPS
@@ -4,6 +4,7 @@ "+chrome/browser/tabmodel/android/java", "+chrome/browser/tabpersistence/android/java", "+chrome/browser/profiles/android/java", + "+chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/HomeButton.java", "+components/browser_ui/widget/android", "+content/public/android/java/src/org/chromium/content_public", ]
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java index a4eb0a9d..333f689 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
@@ -680,7 +680,7 @@ CriteriaHelper.pollUiThread(() -> allCardsHaveThumbnail(recyclerView)); // TODO(crbug.com/1065314): Tab group cards should not have favicons. mRenderTestRule.render(mActivityTestRule.getActivity().findViewById(R.id.tab_list_view), - "tabSwitcher_tabGroups_aspect_ratio_point85"); + "tabSwitcher_tabGroups"); // Resume native initialization and make sure the GTS looks the same. startAndWaitNativeInitialization();
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java index 5504ec4..98a80dc 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
@@ -182,7 +182,7 @@ @Rule public ChromeRenderTestRule mRenderTestRule = - ChromeRenderTestRule.Builder.withPublicCorpus().setRevision(1).build(); + ChromeRenderTestRule.Builder.withPublicCorpus().build(); @SuppressWarnings("FieldCanBeLocal") private EmbeddedTestServer mTestServer; @@ -731,6 +731,7 @@ @DisableIf.Build(sdk_is_less_than = Build.VERSION_CODES.M, message = "https://crbug.com/1023833") public void testIncognitoToggle_thumbnailFetchCount() throws InterruptedException { + mActivityTestRule.loadUrl(mUrl); ChromeTabbedActivity cta = mActivityTestRule.getActivity(); int oldFetchCount = mTabListDelegate.getBitmapFetchCountForTesting(); @@ -1325,8 +1326,8 @@ @Feature({"RenderTest"}) // clang-format off @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID}) - @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/1.0"}) - public void testRenderGrid_withAspectRatioOfOne() throws IOException { + @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/0.85"}) + public void testRenderGrid_withAspectRatioPoint85() throws IOException { // clang-format on ChromeTabbedActivity cta = mActivityTestRule.getActivity(); prepareTabs(3, 0, "about:blank"); @@ -1336,7 +1337,7 @@ createTabGroup(cta, false, tabGroup); // Make sure all tabs have thumbnail. enterGTSWithThumbnailRetry(); - mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "aspect_ratio_of_one"); + mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "aspect_ratio_point_85"); } @Test
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java index 800b1b8..b5c9846 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
@@ -102,6 +102,7 @@ import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; import org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper; +import org.chromium.chrome.browser.toolbar.HomeButton; import org.chromium.chrome.browser.toolbar.top.ToolbarPhone; import org.chromium.chrome.start_surface.R; import org.chromium.chrome.test.ChromeActivityTestRule; @@ -404,7 +405,7 @@ @Test @MediumTest @Feature({"StartSurface"}) - @CommandLineFlags.Add({BASE_PARAMS + "/single"}) + @CommandLineFlags.Add({BASE_PARAMS + "/single/home_button_on_grid_tab_switcher/false"}) public void testShow_SingleAsHomepage() { if (!mImmediateReturn) { onView(withId(org.chromium.chrome.tab_ui.R.id.home_button)).perform(click()); @@ -441,6 +442,10 @@ fail("Failed to tap 'more tabs' " + e.toString()); } onViewWaiting(withId(R.id.secondary_tasks_surface_view)); + assertEquals(mActivityTestRule.getActivity() + .findViewById(R.id.home_button_on_tab_switcher) + .getVisibility(), + View.GONE); pressBack(); onViewWaiting(withId(R.id.primary_tasks_surface_view)); @@ -1310,7 +1315,7 @@ .perform(RecyclerViewActions.actionOnItemAtPosition(0, click())); assertFalse(bottomSheetTestSupport.hasSuppressionTokens()); - onView(withId(org.chromium.chrome.tab_ui.R.id.home_button)).perform(click()); + pressHomePageButton(); assertFalse(bottomSheetTestSupport.hasSuppressionTokens()); try { @@ -1326,6 +1331,15 @@ assertTrue(bottomSheetTestSupport.hasSuppressionTokens()); } + private void pressHomePageButton() { + TestThreadUtils.runOnUiThreadBlocking(() -> { + mActivityTestRule.getActivity() + .getToolbarManager() + .getToolbarTabControllerForTesting() + .openHomepage(); + }); + } + @Test @MediumTest @Feature({"StartSurface"}) @@ -1414,9 +1428,7 @@ onView(allOf(withId(org.chromium.chrome.tab_ui.R.id.mv_tiles_container), isDisplayed())); TestThreadUtils.runOnUiThreadBlocking(() -> tilesLayout.getChildAt(0).performClick()); CriteriaHelper.pollUiThread(() -> !cta.getLayoutManager().overviewVisible()); - onViewWaiting(allOf(withId(org.chromium.chrome.R.id.home_button), isDisplayed())); - TestThreadUtils.runOnUiThreadBlocking( - () -> { cta.findViewById(org.chromium.chrome.R.id.home_button).performClick(); }); + pressHomePageButton(); onViewWaiting(withId(R.id.primary_tasks_surface_view)); onView(allOf(withId(org.chromium.chrome.tab_ui.R.id.tab_list_view), isDisplayed())); // Verifies a new Tab is created, and can be seen in the Start surface. @@ -1523,8 +1535,7 @@ TabUiTestHelper.verifyTabModelTabCount(cta, 2, 0); TabUiTestHelper.mergeAllNormalTabsToAGroup(cta); - onViewWaiting(withId(org.chromium.chrome.tab_ui.R.id.home_button)); - onView(withId(org.chromium.chrome.tab_ui.R.id.home_button)).perform(click()); + pressHomePageButton(); CriteriaHelper.pollUiThread(() -> cta.getLayoutManager().overviewVisible()); onView(allOf(withParent(withId( @@ -1589,8 +1600,7 @@ // Goes to the Start surface from tapping home button, and navigate from the Omnibox. The // new created Tab shouldn't get focus. - waitForView(withId(org.chromium.chrome.tab_ui.R.id.home_button)); - onView(withId(org.chromium.chrome.tab_ui.R.id.home_button)).perform(click()); + pressHomePageButton(); CriteriaHelper.pollUiThread(this::isOverviewVisible); onView(allOf(withId(R.id.search_box_text), isDisplayed())) @@ -1649,6 +1659,42 @@ TabUiTestHelper.verifyTabModelTabCount(mActivityTestRule.getActivity(), 1, 0); } + @Test + @MediumTest + @Feature({"StartSurface"}) + @CommandLineFlags.Add({BASE_PARAMS + "/single/home_button_on_grid_tab_switcher/true"}) + public void testHomeButtonOnTabSwitcher() { + if (!mImmediateReturn) { + onView(withId(org.chromium.chrome.tab_ui.R.id.home_button)).perform(click()); + } + CriteriaHelper.pollUiThread(this::isOverviewVisible); + waitForTabModel(); + TabUiTestHelper.verifyTabModelTabCount(mActivityTestRule.getActivity(), 1, 0); + + // Note that onView(R.id.more_tabs).perform(click()) can not be used since it requires 90 + // percent of the view's area is displayed to the users. However, this view has negative + // margin which makes the percentage is less than 90. + // TODO(crbug.com/1025296): Investigate whether this would be a problem for real users. + try { + TestThreadUtils.runOnUiThreadBlocking( + () + -> mActivityTestRule.getActivity() + .findViewById(org.chromium.chrome.tab_ui.R.id.more_tabs) + .performClick()); + } catch (ExecutionException e) { + fail("Failed to tap 'more tabs' " + e.toString()); + } + waitForView(withId(R.id.secondary_tasks_surface_view)); + onView(withId(org.chromium.chrome.tab_ui.R.id.home_button_on_tab_switcher)) + .check(matches(isDisplayed())); + HomeButton homeButton = mActivityTestRule.getActivity().findViewById( + org.chromium.chrome.tab_ui.R.id.home_button_on_tab_switcher); + Assert.assertFalse(homeButton.isLongClickable()); + onView(withId(R.id.home_button_on_tab_switcher)).perform(click()); + + onView(withId(R.id.primary_tasks_surface_view)).check(matches(isDisplayed())); + } + private boolean isKeyboardShown() { Activity activity = mActivityTestRule.getActivity(); if (activity.getCurrentFocus() == null) return false;
diff --git a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java b/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java index 242b4f6..bbc02aae 100644 --- a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java +++ b/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java
@@ -86,6 +86,12 @@ new BooleanCachedFieldTrialParameter(ChromeFeatureList.START_SURFACE_ANDROID, OMNIBOX_FOCUSED_ON_NEW_TAB_PARAM, false); + private static final String HOME_BUTTON_ON_GRID_TAB_SWITCHER_PARAM = + "home_button_on_grid_tab_switcher"; + public static final BooleanCachedFieldTrialParameter HOME_BUTTON_ON_GRID_TAB_SWITCHER = + new BooleanCachedFieldTrialParameter(ChromeFeatureList.START_SURFACE_ANDROID, + HOME_BUTTON_ON_GRID_TAB_SWITCHER_PARAM, false); + private static final String STARTUP_UMA_PREFIX = "Startup.Android."; private static final String INSTANT_START_SUBFIX = ".Instant"; private static final String REGULAR_START_SUBFIX = ".NoInstant";
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java index b438954..f29b4de 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java
@@ -44,7 +44,7 @@ public static final String THUMBNAIL_ASPECT_RATIO_PARAM = "thumbnail_aspect_ratio"; public static final DoubleCachedFieldTrialParameter THUMBNAIL_ASPECT_RATIO = new DoubleCachedFieldTrialParameter( - ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, THUMBNAIL_ASPECT_RATIO_PARAM, 0.85); + ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, THUMBNAIL_ASPECT_RATIO_PARAM, 1.0); private static final String SEARCH_CHIP_PARAM = "enable_search_term_chip"; public static final BooleanCachedFieldTrialParameter ENABLE_SEARCH_CHIP =
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherThumbnailTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherThumbnailTest.java index ba5d73bc..26b3a7d 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherThumbnailTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherThumbnailTest.java
@@ -75,7 +75,7 @@ @Test @MediumTest - @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/1.0"}) + @CommandLineFlags.Add({BASE_PARAMS}) public void testThumbnailAspectRatio_one() { int tabCounts = 11; TabUiTestHelper.prepareTabsWithThumbnail(mActivityTestRule, tabCounts, 0, "about:blank"); @@ -90,7 +90,7 @@ @Test @MediumTest - @CommandLineFlags.Add({BASE_PARAMS}) + @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/0.85"}) public void testThumbnailAspectRatio_point85() { int tabCounts = 11; TabUiTestHelper.prepareTabsWithThumbnail(mActivityTestRule, tabCounts, 0, "about:blank"); @@ -105,7 +105,7 @@ int tabCounts = 11; TabUiTestHelper.prepareTabsWithThumbnail(mActivityTestRule, tabCounts, 0, "about:blank"); TabUiTestHelper.enterTabSwitcher(mActivityTestRule.getActivity()); - verifyAllThumbnailHeightWithAspectRatio(tabCounts, .85f); + verifyAllThumbnailHeightWithAspectRatio(tabCounts, 1.f); // With soft cleanup. TabUiTestHelper.leaveTabSwitcher(mActivityTestRule.getActivity()); @@ -113,7 +113,7 @@ // There is a chance this will fail without the current changes. Soft cleanup sets the // fetcher to null, which triggers TabGridViewBinder#releaseThumbnail. If the view still // under measuring, then its height can be zero after measurement. - verifyAllThumbnailHeightWithAspectRatio(tabCounts, .85f); + verifyAllThumbnailHeightWithAspectRatio(tabCounts, 1.f); } private void verifyAllThumbnailHeightWithAspectRatio(int tabCounts, float ratio) {
diff --git a/chrome/android/feed/BUILD.gn b/chrome/android/feed/BUILD.gn index 218326f..72cd5ce 100644 --- a/chrome/android/feed/BUILD.gn +++ b/chrome/android/feed/BUILD.gn
@@ -26,3 +26,9 @@ "//ui/android:ui_java_resources", ] } + +android_library("web_feed_java") { + sources = + [ "core/java/src/org/chromium/chrome/browser/webfeed/WebFeedBridge.java" ] + deps = [ "//url:gurl_java" ] +}
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/webfeed/WebFeedBridge.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/webfeed/WebFeedBridge.java new file mode 100644 index 0000000..33d1f86 --- /dev/null +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/webfeed/WebFeedBridge.java
@@ -0,0 +1,19 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.webfeed; + +import org.chromium.url.GURL; + +/** + * Collection of methods used across Web Feed follow entry points. + */ +public class WebFeedBridge { + /** + * Returns whether the given {@link GURL} is followed. + */ + public boolean isFollowed(GURL url) { + return false; + } +} \ No newline at end of file
diff --git a/chrome/android/java/res/layout/start_top_toolbar.xml b/chrome/android/java/res/layout/start_top_toolbar.xml index 1d3343ad..9431371 100644 --- a/chrome/android/java/res/layout/start_top_toolbar.xml +++ b/chrome/android/java/res/layout/start_top_toolbar.xml
@@ -10,17 +10,30 @@ android:id="@+id/tab_switcher_toolbar" android:layout_width="match_parent" android:layout_height="@dimen/toolbar_height_no_shadow" + android:paddingStart="8dp" android:clickable="true" android:visibility="gone"> + <org.chromium.chrome.browser.toolbar.HomeButton + android:id="@+id/home_button_on_tab_switcher" + style="@style/ToolbarButton" + android:layout_width="wrap_content" + android:layout_centerVertical="true" + android:paddingStart="8dp" + android:paddingEnd="8dp" + android:contentDescription="@string/accessibility_toolbar_btn_home" + android:src="@drawable/btn_toolbar_home" + android:visibility="gone" + app:tint="@color/default_icon_color_tint_list" /> + <Switch tools:ignore="UseSwitchCompatOrMaterialXml" android:id="@+id/incognito_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_toEndOf="@+id/home_button_on_tab_switcher" android:layout_centerVertical="true" - android:layout_alignParentStart="true" - android:paddingStart="16dp" + android:paddingStart="8dp" android:paddingEnd="8dp" android:thumb="@drawable/incognito_switch" android:track="@drawable/incognito_switch_track"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java index f23bb8a8..8d68a5a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java
@@ -39,9 +39,6 @@ import org.chromium.chrome.browser.translate.TranslateBridge; import org.chromium.components.browser_ui.share.ShareImageFileUtils; import org.chromium.components.user_prefs.UserPrefs; -import org.chromium.ui.base.ResourceBundle; - -import java.util.Locale; /** * Tracks the foreground session state for the Chrome activities. @@ -136,7 +133,7 @@ UmaUtils.recordForegroundStartTime(); updatePasswordEchoState(); FontSizePrefs.getInstance().onSystemFontScaleChanged(); - recordWhetherSystemAndAppLanguagesDiffer(); + ChromeLocalizationUtils.recordUiLanguageStatus(); updateAcceptLanguages(); mVariationsSession.start(); mPowerBroadcastReceiver.onForegroundSessionStart(); @@ -250,37 +247,6 @@ } /** - * Records whether Chrome was started in a language other than the system language. - * Also records if the UI and system languages differ but we support the system language. That - * can happen if the user changes the system language and the required language split cannot be - * installed in time. - */ - private void recordWhetherSystemAndAppLanguagesDiffer() { - String uiLanguage = - LocaleUtils.toLanguage(ChromeLocalizationUtils.getUiLocaleStringForCompressedPak()); - String systemLanguage = - LocaleUtils.toLanguage(LocaleUtils.toLanguageTag(Locale.getDefault())); - - boolean systemLanguageIsUiLanguage = systemLanguage.equals(uiLanguage); - RecordHistogram.recordBooleanHistogram( - "Android.Language.UiIsSystemLanguage", systemLanguageIsUiLanguage); - - boolean systemLanguageIsSupported = isLanguageSupported( - systemLanguage, ResourceBundle.getAvailableCompressedPakLocales()); - RecordHistogram.recordBooleanHistogram("Android.Language.WrongLanguageAfterResume", - !systemLanguageIsUiLanguage && systemLanguageIsSupported); - } - - private static boolean isLanguageSupported(String language, String[] compressedLocales) { - for (String languageTag : compressedLocales) { - if (LocaleUtils.toLanguage(languageTag).equals(language)) { - return true; - } - } - return false; - } - - /** * @return The PowerBroadcastReceiver for the browser process. */ @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeLocalizationUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeLocalizationUtils.java index 2f53c4c..2801b72b4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeLocalizationUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeLocalizationUtils.java
@@ -4,13 +4,57 @@ package org.chromium.chrome.browser; +import android.os.Build; +import android.os.LocaleList; +import android.text.TextUtils; + +import androidx.annotation.IntDef; +import androidx.annotation.VisibleForTesting; + import org.chromium.base.ContextUtils; +import org.chromium.base.LocaleUtils; +import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.R; +import org.chromium.chrome.browser.language.GlobalAppLocaleController; +import org.chromium.chrome.browser.language.settings.AvailableUiLanguages; +import org.chromium.ui.base.LocalizationUtils; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.Locale; /** * This class provides the locale related methods for Chrome. */ public class ChromeLocalizationUtils { + // Constants used to log UI language availability. Must stay in sync with values in the + // LanguageUsage.UI.Available enum. These values are persisted to logs. Entries should + // not be renumbered and numeric values should never be reused. + @IntDef({UiAvailableTypes.TOP_AVAILABLE, UiAvailableTypes.ONLY_DEFAULT_AVAILABLE, + UiAvailableTypes.NONE_AVAILABLE, UiAvailableTypes.OVERRIDDEN}) + @Retention(RetentionPolicy.SOURCE) + @interface UiAvailableTypes { + int TOP_AVAILABLE = 0; + int ONLY_DEFAULT_AVAILABLE = 1; + int NONE_AVAILABLE = 2; + int OVERRIDDEN = 3; + int NUM_ENTRIES = 4; + } + + // Constants used to log the UI language correctness. Must stay in sync with values in the + // LanguageUsage.UI.Android.Correctness enum. These values are persisted to logs. Entries + // should not be renumbered and numeric values should never be reused. + @IntDef({UiCorrectTypes.CORRECT, UiCorrectTypes.INCORRECT, UiCorrectTypes.NOT_AVAILABLE, + UiCorrectTypes.ONLY_JAVA_CORRECT}) + @Retention(RetentionPolicy.SOURCE) + @interface UiCorrectTypes { + int CORRECT = 0; + int INCORRECT = 1; + int NOT_AVAILABLE = 2; + int ONLY_JAVA_CORRECT = 3; + int NUM_ENTRIES = 4; + } + /** * @return the current Chromium locale used to display UI elements. * @@ -23,11 +67,169 @@ * Using this value is necessary to ensure that the strings accessed from the locale .pak files * from C++ match the resources displayed by the Java-based UI views. */ - public static String getUiLocaleStringForCompressedPak() { + public static String getJavaUiLocale() { return ContextUtils.getApplicationContext().getResources().getString( R.string.current_detected_ui_locale_name); } + /** + * Records the status of the current UI language under "LanguageUsage.UI.Android.*". Tracks if + * the Android system language is available and if the Chromium UI language is correct. + * + * On N+ both the top Android language and default Android language are checked for + * availability. The default language is the one used by the JVM for localization. These will be + * different if the top Android is not available for localization in Chromium. Otherwise they + * are the same. + * + * For correctness both the Java and native UI languages are checked. These can be different if + * an override language is set and Play Store hygiene has not run. + */ + public static void recordUiLanguageStatus() { + String defaultLanguage = LocaleUtils.toLanguage(Locale.getDefault().toLanguageTag()); + + // The default locale is the first Android locale with translated Chromium resources. On N+ + // the top system language can be retrieved, even if it is not an option for Chromium's UI. + String topAndroidLanguage = defaultLanguage; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + topAndroidLanguage = + LocaleUtils.toLanguage(LocaleList.getDefault().get(0).toLanguageTag()); + } + boolean isDefaultLanguageAvailable = AvailableUiLanguages.isAvailable(defaultLanguage); + boolean isTopAndroidLanguageAvailable = + AvailableUiLanguages.isAvailable(topAndroidLanguage); + + // The java and native UI languages can be different if the native language plack is not + // correctly installed through the Play Store. + String javaUiLanguage = LocaleUtils.toLanguage(getJavaUiLocale()); + String nativeUiLanguage = LocaleUtils.toLanguage(LocalizationUtils.getNativeUiLocale()); + boolean isJavaUiCorrect = TextUtils.equals(defaultLanguage, javaUiLanguage); + boolean isNativeUiCorrect = TextUtils.equals(defaultLanguage, nativeUiLanguage); + + // The Android Chromium UI language can be overridden at the device level by users. + boolean isOverridden = GlobalAppLocaleController.getInstance().isOverridden(); + + @UiAvailableTypes + int availableStatus = getUiAvailabilityStatus( + isOverridden, isTopAndroidLanguageAvailable, isDefaultLanguageAvailable); + RecordHistogram.recordEnumeratedHistogram("LanguageUsage.UI.Android.Availability", + availableStatus, UiAvailableTypes.NUM_ENTRIES); + + boolean noLanguageAvailable = !isTopAndroidLanguageAvailable && !isDefaultLanguageAvailable; + @UiCorrectTypes + int correctStatus = + getUiCorrectnessStatus(noLanguageAvailable, isJavaUiCorrect, isNativeUiCorrect); + RecordHistogram.recordEnumeratedHistogram( + "LanguageUsage.UI.Android.Correctness", correctStatus, UiCorrectTypes.NUM_ENTRIES); + + if (isOverridden) { + @UiCorrectTypes + int overrideStatus = getOverrideUiCorrectStatus(isJavaUiCorrect, isNativeUiCorrect); + RecordHistogram.recordEnumeratedHistogram( + "LanguageUsage.UI.Android.Correctness.Override", overrideStatus, + UiCorrectTypes.NUM_ENTRIES); + } else { + @UiCorrectTypes + int noOverrideStatus = + getNoOverrideUiCorrectStatus(noLanguageAvailable, isJavaUiCorrect); + RecordHistogram.recordEnumeratedHistogram( + "LanguageUsage.UI.Android.Correctness.NoOverride", noOverrideStatus, + UiCorrectTypes.NUM_ENTRIES); + } + } + + /** + * Return the status of Android system languages for use as the Chromium UI language. + * The default language is the one used by the JVM for localization. This will be different from + * the top Android language if the top Android language is not available for localization in + * Chromium. See {@link LocaleList#getDefault()}. If the Chromium UI is overridden the language + * set will always be available. + * @param isOverridden Boolean indicating if the Chromium UI is overridden. + * @param isTopAndroidLanguageAvailable Boolean indicating if the top Android language can be + * the UI language. + * @param isDefaultLanguageAvailable Boolean indicating if the default Android language can be + * the UI language. + * @return The @UiAvailableTypes status of Android language settings. + */ + @VisibleForTesting + static @UiAvailableTypes int getUiAvailabilityStatus(boolean isOverridden, + boolean isTopAndroidLanguageAvailable, boolean isDefaultLanguageAvailable) { + if (isOverridden) { + return UiAvailableTypes.OVERRIDDEN; + } + if (isTopAndroidLanguageAvailable) { + return UiAvailableTypes.TOP_AVAILABLE; + } + if (isDefaultLanguageAvailable && !isTopAndroidLanguageAvailable) { + return UiAvailableTypes.ONLY_DEFAULT_AVAILABLE; + } + return UiAvailableTypes.NONE_AVAILABLE; + } + + /** + * Return the correctness status of the current Chromium UI. The Ui language is correct when it + * matches the default Android system language. The native UI language can be different from the + * Java UI language if Play Store daily hygiene has not run since setting an override language. + * @param noLanguageAvailable Boolean indicating no Android system language is a Chromium + * language. + * @param isJavaUiCorrect Boolean indicating if the Java UI language is correct. + * @param isNativeUiCorrect Boolean indicating if the native UI language is correct. + * @return The @UiCorrectnessTypes status of the UI. + */ + @VisibleForTesting + static @UiCorrectTypes int getUiCorrectnessStatus( + boolean noLanguageAvailable, boolean isJavaUiCorrect, boolean isNativeUiCorrect) { + if (noLanguageAvailable) { + return UiCorrectTypes.NOT_AVAILABLE; + } + if (isJavaUiCorrect && isNativeUiCorrect) { + return UiCorrectTypes.CORRECT; + } + if (isJavaUiCorrect && !isNativeUiCorrect) { + return UiCorrectTypes.ONLY_JAVA_CORRECT; + } + return UiCorrectTypes.INCORRECT; + } + + /** + * Return the status of the current Chromium UI when the UI language is not overridden. The UI + * language is correct when it matches the default Android system language. If no Android + * language is available as the Chromium language then the UI is by definition incorrect. + * @param isCorrect Boolean indicating the Chromium UI language matches the Android default. + * @return The @UiCorrectnessTypes status of the UI. + */ + @VisibleForTesting + static @UiCorrectTypes int getNoOverrideUiCorrectStatus( + boolean noLanguageAvailable, boolean isCorrect) { + if (noLanguageAvailable) { + return UiCorrectTypes.NOT_AVAILABLE; + } + if (isCorrect) { + return UiCorrectTypes.CORRECT; + } + return UiCorrectTypes.INCORRECT; + } + + /** + * Return the status of the current Chromium UI when the UI language is overridden. The UI + * language is correct when it matches the override UI value set as the default locale. The + * native UI language can be different from the Java UI language if Play Store daily hygiene has + * not run since setting an override language. + * @param isJavaUiCorrect Boolean indicating if the Java UI language is correct. + * @param isNativeUiCorrect Boolean indicating if the native UI language is correct. + * @return The @UiCorrectnessTypes status of the UI. + */ + @VisibleForTesting + static @UiCorrectTypes int getOverrideUiCorrectStatus( + boolean isJavaUiCorrect, boolean isNativeUiCorrect) { + if (isJavaUiCorrect && isNativeUiCorrect) { + return UiCorrectTypes.CORRECT; + } + if (isJavaUiCorrect && !isNativeUiCorrect) { + return UiCorrectTypes.ONLY_JAVA_CORRECT; + } + return UiCorrectTypes.INCORRECT; + } + private ChromeLocalizationUtils() { /* cannot be instantiated */ }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java index 102fedb..36b6e2e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -60,6 +60,7 @@ import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate; import org.chromium.chrome.browser.ui.appmenu.CustomViewBinder; +import org.chromium.chrome.browser.webfeed.WebFeedBridge; import org.chromium.chrome.features.start_surface.StartSurfaceConfiguration; import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.components.embedder_support.util.UrlConstants; @@ -501,8 +502,18 @@ menu.findItem(R.id.get_image_descriptions_id).setVisible(false); } - menu.findItem(R.id.feed_follow_id) - .setVisible(ChromeFeatureList.isEnabled(ChromeFeatureList.WEB_FEED)); + // Enable web feed follow menu item if WebFeed feature is enabled. + MenuItem followMenuItem = menu.findItem(R.id.feed_follow_id); + if (ChromeFeatureList.isEnabled(ChromeFeatureList.WEB_FEED)) { + followMenuItem.setVisible(true); + WebFeedBridge webFeedBridge = new WebFeedBridge(); + if (webFeedBridge.isFollowed(currentTab.getUrl())) { + followMenuItem.setIcon(R.drawable.ic_checkmark_24dp); + followMenuItem.setTitle(R.string.menu_following); + } + } else { + followMenuItem.setVisible(false); + } // Disable find in page on the native NTP. menu.findItem(R.id.find_in_page_id).setVisible(shouldShowFindInPage(currentTab));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java index 5a144b1..ef81122 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
@@ -94,6 +94,7 @@ ConditionalTabStripUtils.CONDITIONAL_TAB_STRIP_SESSION_TIME_MS, PageAnnotationsServiceConfig.PAGE_ANNOTATIONS_BASE_URL, ReturnToChromeExperimentsUtil.TAB_SWITCHER_ON_RETURN_MS, + StartSurfaceConfiguration.HOME_BUTTON_ON_GRID_TAB_SWITCHER, StartSurfaceConfiguration.OMNIBOX_FOCUSED_ON_NEW_TAB, StartSurfaceConfiguration.START_SURFACE_EXCLUDE_MV_TILES, StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabWindowManagerSingleton.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabWindowManagerSingleton.java index e14110f..b81bc59 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabWindowManagerSingleton.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabWindowManagerSingleton.java
@@ -43,4 +43,9 @@ assert sInstance == null; sSelectorFactoryForTesting = factory; } + + @VisibleForTesting + public static void resetTabModelSelectorFactoryForTesting() { + sInstance = null; + } } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java index f07d1cb..7c08688 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
@@ -73,7 +73,7 @@ // Whether to allow to refetch tab thumbnail if the aspect ratio is not matching. public static final BooleanCachedFieldTrialParameter ALLOW_TO_REFETCH_TAB_THUMBNAIL_VARIATION = new BooleanCachedFieldTrialParameter( - ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, "allow_to_refetch", true); + ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, "allow_to_refetch", false); @VisibleForTesting public static final String UMA_THUMBNAIL_FETCHING_RESULT =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java index 33c7d8a..e91a24c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
@@ -670,9 +670,11 @@ // TODO(donnd): Consider supporting URL-only requests -- for now content is required. StringBuilder stampBuilder = new StringBuilder().append(experimentConfigStamp); if (isLanguageRestricted) stampBuilder.append(RELATED_SEARCHES_LANGUAGE_RESTRICTION); - // Hard code a tag so the server knows this version of the client is doing a dark launch - // and cannot decode Related Searches. - stampBuilder.append(RELATED_SEARCHES_DARK_LAUNCH); + // Add a tag so the server knows this version of the client is doing a dark launch + // and cannot decode Related Searches, unless overridden by a Feature flag. + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.RELATED_SEARCHES_UI)) { + stampBuilder.append(RELATED_SEARCHES_DARK_LAUNCH); + } return stampBuilder.toString(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfoBarController.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfoBarController.java index f655a9b93..5b375614 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfoBarController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfoBarController.java
@@ -434,8 +434,11 @@ } private boolean isVisibleToUser(OfflineItem offlineItem) { - OTRProfileID otrProfileID = OTRProfileID.deserialize(offlineItem.otrProfileId); - if (offlineItem.isTransient || !OTRProfileID.areEqual(mOtrProfileID, otrProfileID) + // Need to use serialized OTRProfileID for comparison, since calling + // |OTRProfileID#deserialize| method causes crash if the OTR profile is destroyed. + String stringOTRProfileID = OTRProfileID.serialize(mOtrProfileID); + if (offlineItem.isTransient + || !OTRProfileID.areEqual(stringOTRProfileID, offlineItem.otrProfileId) || offlineItem.isSuggested || offlineItem.isDangerous) { return false; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi.java b/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi.java index 439ce90..0c8f95e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi.java
@@ -154,6 +154,13 @@ // notification UI. if (item.isSuggested || item.schedule != null) return; + // If the download is cancelled, no need to DownloadInfo object and it is enough to notify + // that the download is canceled. + if (item.state == OfflineItemState.CANCELLED) { + mUi.notifyDownloadCanceled(item.id); + return; + } + DownloadInfo info = DownloadInfo.fromOfflineItem(item, visuals); switch (item.state) { case OfflineItemState.IN_PROGRESS: @@ -162,9 +169,6 @@ case OfflineItemState.COMPLETE: mUi.notifyDownloadSuccessful(info, -1L, false, item.isOpenable); break; - case OfflineItemState.CANCELLED: - mUi.notifyDownloadCanceled(item.id); - break; case OfflineItemState.INTERRUPTED: mUi.notifyDownloadInterrupted(info, LegacyHelpers.isLegacyDownload(item.id) ? false : true, item.pendingState);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java index 026e39c..aad9a873 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
@@ -233,8 +233,8 @@ // be on first run when we need to extract all the .pak files we need, or after // the user has switched locale, in which case we want new locale resources. ResourceExtractor.get().setResultTraits(UiThreadTaskTraits.BOOTSTRAP); - ResourceExtractor.get().startExtractingResources(LocaleUtils.toLanguage( - ChromeLocalizationUtils.getUiLocaleStringForCompressedPak())); + ResourceExtractor.get().startExtractingResources( + LocaleUtils.toLanguage(ChromeLocalizationUtils.getJavaUiLocale())); mPostInflationStartupComplete = true; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java index 0b6ed70..6b84544 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java
@@ -8,14 +8,12 @@ import android.preference.PreferenceManager; import android.text.TextUtils; -import com.google.android.play.core.splitcompat.SplitCompat; import com.google.android.play.core.splitinstall.SplitInstallManager; import com.google.android.play.core.splitinstall.SplitInstallManagerFactory; import com.google.android.play.core.splitinstall.SplitInstallRequest; import org.chromium.base.BundleUtils; import org.chromium.base.ContextUtils; -import org.chromium.base.Log; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; @@ -77,21 +75,6 @@ } /** - * Enable access to language split for bundle builds with an override language set. - * @param context Activity context to enable downloaded language splits on. - */ - public static void maybeInstallActivitySplitCompat(Context context) { - if (GlobalAppLocaleController.getInstance().isOverridden() && BundleUtils.isBundle()) { - Log.i(TAG, "maybeInstallActivitySplit isOverridden: %s isBundle: %s", - GlobalAppLocaleController.getInstance().isOverridden(), BundleUtils.isBundle()); - Log.i(TAG, "Override Locale: %s", getAppLanguagePref()); - logInstalledLanguages(context); - SplitCompat.installActivity(context); - logInstalledLanguages(context); - } - } - - /** * For bundle builds ensure that the language split for languageName is downloaded. */ private static void ensureLanguageSplitInstalled(String languageName) { @@ -107,18 +90,4 @@ splitInstallManager.startInstall(installRequest); } } - - /** - * Log list of installed languages for context. - * @param context Context to log installed languages on. - */ - private static void logInstalledLanguages(Context context) { - if (BundleUtils.isBundle()) { - SplitInstallManager splitInstallManager = SplitInstallManagerFactory.create(context); - Log.i(TAG, "Installed Languages: %s", - TextUtils.join(", ", splitInstallManager.getInstalledLanguages())); - } else { - Log.i(TAG, "Installed Languages: None - not a bundle"); - } - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/language/settings/AvailableUiLanguages.java b/chrome/android/java/src/org/chromium/chrome/browser/language/settings/AvailableUiLanguages.java index 25a9698..c3a47c9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/language/settings/AvailableUiLanguages.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/language/settings/AvailableUiLanguages.java
@@ -4,9 +4,8 @@ package org.chromium.chrome.browser.language.settings; -import org.chromium.base.BundleUtils; import org.chromium.base.LocaleUtils; -import org.chromium.chrome.browser.ProductConfig; +import org.chromium.ui.base.ResourceBundle; import java.util.Arrays; import java.util.Comparator; @@ -19,23 +18,14 @@ private AvailableUiLanguages() {} /** - * Get available language set from {@link ProductConfig}, which is a sorted - * array of language tags included in this build. - */ - private static String[] getLanguageList() { - if (BundleUtils.isBundle()) { - return ProductConfig.UNCOMPRESSED_LOCALES; - } - return ProductConfig.COMPRESSED_LOCALES; - } - - /** * Return true if the language is available as the UI language. This is used to disable * the overflow option when selecting a UI language. * @param language BCP-47 language tag representing a locale (e.g. "en-US") */ public static boolean isAvailable(String language) { - return Arrays.binarySearch(getLanguageList(), language, LANGUAGE_COMPARATOR) >= 0; + return Arrays.binarySearch( + ResourceBundle.getAvailableLocales(), language, LANGUAGE_COMPARATOR) + >= 0; } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java index 81c8032..d565acec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java
@@ -27,7 +27,6 @@ import org.chromium.base.supplier.ObservableSupplier; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.app.tab_activity_glue.ReparentingTask; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.ConfigurationChangedObserver; @@ -186,7 +185,6 @@ @Override public void onFinishNativeInitialization() { mNativeInitialized = true; - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_MULTIPLE_DISPLAY)) return; DisplayManager displayManager = (DisplayManager) mActivity.getSystemService(Context.DISPLAY_SERVICE); if (displayManager == null) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java index db167c2..ab23935 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java
@@ -28,7 +28,6 @@ import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.ChromeTabbedActivity2; import org.chromium.chrome.browser.IntentHandler; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.util.AndroidTaskUtils; import org.chromium.ui.display.DisplayAndroidManager; @@ -78,7 +77,6 @@ * @return Whether the system currently supports multiple displays, requiring Android Q+. */ public boolean isInMultiDisplayMode(Activity activity) { - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_MULTIPLE_DISPLAY)) return false; // TODO(crbug.com/824954): Consider supporting more displays. return ApiCompatibilityUtils.getTargetableDisplayIds(activity).size() == 2; } @@ -175,9 +173,6 @@ * @return The targetable secondary display. {@code Display.INVALID_DISPLAY} if not found. */ public static int getDisplayIdForTargetableSecondaryDisplay(Activity activity) { - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_MULTIPLE_DISPLAY)) { - return Display.INVALID_DISPLAY; - } List<Integer> displays = ApiCompatibilityUtils.getTargetableDisplayIds(activity); Display defaultDisplay = DisplayAndroidManager.getDefaultDisplayForContext(activity); if (displays.size() != 0) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBuilder.java index 5cdb278..33cb13f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBuilder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBuilder.java
@@ -19,6 +19,7 @@ public class TabBuilder { private int mId = Tab.INVALID_TAB_ID; private Tab mParent; + private TabResolver mTabResolver; private boolean mIncognito; private WindowAndroid mWindow; private Integer mLaunchType; @@ -54,6 +55,16 @@ } /** + * Sets the tab resolver (tab id -> {@link Tab} mapping) + * @param tabResolver the {@link TabResolver} + * @return {@link TabBuilder} creating the Tab. + */ + public TabBuilder setTabResolver(TabResolver tabResolver) { + mTabResolver = tabResolver; + return this; + } + + /** * Sets incognito mode. * @param incognito {@code true} if the tab will be in incognito mode. * @return {@link TabBuilder} creating the Tab. @@ -160,24 +171,35 @@ if (mFromFrozenState) assert mLaunchType == TabLaunchType.FROM_RESTORE; } - TabImpl tab = new TabImpl(mId, mParent, mIncognito, mLaunchType); + TabImpl tab = + new TabImpl(mId, mIncognito, mLaunchType, mSerializedCriticalPersistedTabData); + Tab parent = null; + if (mParent != null) { + parent = mParent; + } else if (mTabResolver != null) { + if (mSerializedCriticalPersistedTabData != null) { + parent = mTabResolver.resolve(CriticalPersistedTabData.from(tab).getParentId()); + } else if (mTabState != null) { + parent = mTabResolver.resolve(mTabState.parentId); + } + } tab.updateWindowAndroid(mWindow); - if (mParent != null && mDelegateFactory == null) { - mDelegateFactory = ((TabImpl) mParent).getDelegateFactory(); + if (parent != null && mDelegateFactory == null) { + mDelegateFactory = ((TabImpl) parent).getDelegateFactory(); } if (mPreInitializeAction != null) mPreInitializeAction.onResult(tab); // Initializes Tab. Its user data objects are also initialized through the event // |onInitialized| of TabObserver they register. - tab.initialize(mParent, mCreationType, mLoadUrlParams, mWebContents, mDelegateFactory, - mInitiallyHidden, mTabState, mSerializedCriticalPersistedTabData); - if (mParent != null) { - if (mParent.getAddApi2TransitionToFutureNavigations()) { + tab.initialize(parent, mCreationType, mLoadUrlParams, mWebContents, mDelegateFactory, + mInitiallyHidden, mTabState); + if (parent != null) { + if (parent.getAddApi2TransitionToFutureNavigations()) { tab.setAddApi2TransitionToFutureNavigations(true); } - if (mParent.getHideFutureNavigations()) { + if (parent.getHideFutureNavigations()) { tab.setHideFutureNavigations(true); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java index 4cd3e9e..6a6d7924 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
@@ -118,7 +118,7 @@ /** * Tab id to be used as a source tab in SyncedTabDelegate. */ - private final int mSourceTabId; + private int mSourceTabId = INVALID_TAB_ID; private boolean mIsClosing; private boolean mIsShowingErrorPage; @@ -197,6 +197,7 @@ private final TabThemeColorHelper mThemeColorHelper; private int mThemeColor; + private boolean mUsedCriticalPersistedTabData; /** * Creates an instance of a {@link TabImpl}. @@ -207,20 +208,19 @@ * Package-private. Use {@link TabBuilder} to create an instance. * * @param id The id this tab should be identified with. - * @param parent The tab that caused this tab to be opened. * @param incognito Whether or not this tab is incognito. * @param launchType Type indicating how this tab was launched. + * @param serializedCriticalPersistedTabData serialized {@link CriticalPersistedTabData} */ @SuppressLint("HandlerLeak") - TabImpl(int id, Tab parent, boolean incognito, @Nullable @TabLaunchType Integer launchType) { + TabImpl(int id, boolean incognito, @Nullable @TabLaunchType Integer launchType, + @Nullable byte[] serializedCriticalPersistedTabData) { mIsTabSaveEnabledSupplier.set(false); mId = TabIdManager.getInstance().generateValidId(id); mIncognito = incognito; - if (parent == null) { - mSourceTabId = INVALID_TAB_ID; - } else { - CriticalPersistedTabData.from(this).setParentId(parent.getId()); - mSourceTabId = parent.isIncognito() == incognito ? parent.getId() : INVALID_TAB_ID; + if (serializedCriticalPersistedTabData != null && useCriticalPersistedTabData()) { + CriticalPersistedTabData.build(this, serializedCriticalPersistedTabData, true); + mUsedCriticalPersistedTabData = true; } // Override the configuration for night mode to always stay in light mode until all UIs in @@ -827,16 +827,19 @@ * @param initiallyHidden Only used if {@code webContents} is {@code null}. Determines * whether or not the newly created {@link WebContents} will be hidden or not. * @param tabState State containing information about this Tab, if it was persisted. - * @param serializedCriticalPersistedTabData {@link CriticalPersistedTabData} in serialized - * form. {@link CriticalPersistedTabData} is a replacement for {@link TabState} */ void initialize(Tab parent, @Nullable @TabCreationState Integer creationState, LoadUrlParams loadUrlParams, WebContents webContents, @Nullable TabDelegateFactory delegateFactory, boolean initiallyHidden, - TabState tabState, @Nullable byte[] serializedCriticalPersistedTabData) { + TabState tabState) { try { TraceEvent.begin("Tab.initialize"); + if (parent != null) { + CriticalPersistedTabData.from(this).setParentId(parent.getId()); + mSourceTabId = parent.isIncognito() == mIncognito ? parent.getId() : INVALID_TAB_ID; + } + CriticalPersistedTabData.from(this).setLaunchTypeAtCreation(mLaunchType); mCreationState = creationState; mPendingLoadParams = loadUrlParams; @@ -846,9 +849,7 @@ TabHelpers.initTabHelpers(this, parent); - if (serializedCriticalPersistedTabData != null && useCriticalPersistedTabData()) { - CriticalPersistedTabData.build(this, serializedCriticalPersistedTabData, true); - } else if (tabState != null) { + if (tabState != null) { restoreFieldsFromState(tabState); } @@ -889,7 +890,7 @@ String appId = null; Boolean hasThemeColor = null; int themeColor = 0; - if (serializedCriticalPersistedTabData != null && useCriticalPersistedTabData()) { + if (mUsedCriticalPersistedTabData) { appId = CriticalPersistedTabData.from(this).getOpenerAppId(); themeColor = CriticalPersistedTabData.from(this).getThemeColor(); hasThemeColor = themeColor != TabState.UNSPECIFIED_THEME_COLOR @@ -930,6 +931,7 @@ */ void restoreFieldsFromState(TabState state) { assert state != null; + assert !mUsedCriticalPersistedTabData; CriticalPersistedTabData.from(this).setWebContentsState(state.contentsState); CriticalPersistedTabData.from(this).setTimestampMillis(state.timestampMillis); CriticalPersistedTabData.from(this).setUrl(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java index 3e23ee5a..fca9300 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java
@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tab.TabParentIntent; +import org.chromium.chrome.browser.tab.TabResolver; import org.chromium.chrome.browser.tab.TabState; import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.embedder_support.util.UrlUtilities; @@ -373,12 +374,14 @@ } @Override - public Tab createFrozenTab( - TabState state, byte[] serializedCriticalPersistedTabData, int id, int index) { + public Tab createFrozenTab(TabState state, byte[] serializedCriticalPersistedTabData, int id, + boolean isIncognito, int index) { TabModelSelector selector = mActivity.getTabModelSelector(); - Tab parent = selector != null ? selector.getTabById(state.parentId) : null; - boolean selectTab = mOrderController.willOpenInForeground( - TabLaunchType.FROM_RESTORE, state.isIncognito()); + TabResolver resolver = (tabId) -> { + return selector != null ? selector.getTabById(tabId) : null; + }; + boolean selectTab = + mOrderController.willOpenInForeground(TabLaunchType.FROM_RESTORE, isIncognito); AsyncTabParams asyncParams = mAsyncTabParamsManager.remove(id); Tab tab = null; @TabLaunchType @@ -390,9 +393,9 @@ TabReparentingParams params = (TabReparentingParams) asyncParams; tab = params.getTabToReparent(); - if (tab.isIncognito() != state.isIncognito()) { - throw new IllegalStateException("Incognito state mismatch. TabState: " - + state.isIncognito() + ". Tab: " + tab.isIncognito()); + if (tab.isIncognito() != isIncognito) { + throw new IllegalStateException("Incognito state mismatch. TabState: " + isIncognito + + ". Tab: " + tab.isIncognito()); } ReparentingTask.from(tab).finish( ReparentingDelegateFactory.createReparentingTaskDelegate( @@ -411,8 +414,8 @@ if (tab == null) { tab = TabBuilder.createFromFrozenState() .setId(id) - .setParent(parent) - .setIncognito(state.isIncognito()) + .setTabResolver(resolver) + .setIncognito(isIncognito) .setWindow(mNativeWindow) .setDelegateFactory(createDefaultTabDelegateFactory()) .setInitiallyHidden(!selectTab) @@ -421,7 +424,7 @@ .build(); } - if (state.isIncognito() != mIncognito) { + if (isIncognito != mIncognito) { throw new IllegalStateException("Incognito state mismatch. TabState: " + state.isIncognito() + ". Creator: " + mIncognito); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java index 211c3c29..002e8cfd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
@@ -16,6 +16,7 @@ import androidx.core.util.AtomicFile; import org.chromium.base.Callback; +import org.chromium.base.CallbackController; import org.chromium.base.Log; import org.chromium.base.ObserverList; import org.chromium.base.StreamUtil; @@ -43,6 +44,7 @@ import org.chromium.chrome.browser.tab.TabStateExtractor; import org.chromium.chrome.browser.tab.TabStateFileManager; import org.chromium.chrome.browser.tab.state.CriticalPersistedTabData; +import org.chromium.chrome.browser.tab.state.FilePersistedTabDataStorage; import org.chromium.chrome.browser.tabpersistence.TabStateDirectory; import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.embedder_support.util.UrlUtilities; @@ -168,7 +170,7 @@ private final Deque<TabRestoreDetails> mTabsToRestore; private final Set<Integer> mTabIdsToRestore; - private LoadTabTask mLoadTabTask; + private TabLoader mTabLoader; private SaveTabTask mSaveTabTask; private SaveListTask mSaveListTask; @@ -512,12 +514,12 @@ private void restoreTabStateInternal(String url, int id) { TabRestoreDetails tabToRestore = null; - if (mLoadTabTask != null) { - if ((url == null && mLoadTabTask.mTabToRestore.id == id) - || (url != null && TextUtils.equals(mLoadTabTask.mTabToRestore.url, url))) { + if (mTabLoader != null) { + if ((url == null && mTabLoader.mTabToRestore.id == id) + || (url != null && TextUtils.equals(mTabLoader.mTabToRestore.url, url))) { // Steal the task of restoring the tab from the active load tab task. - mLoadTabTask.cancel(false); - tabToRestore = mLoadTabTask.mTabToRestore; + mTabLoader.cancel(false); + tabToRestore = mTabLoader.mTabToRestore; loadNextTab(); // Queue up async task to load next tab after we're done here. } } @@ -556,6 +558,7 @@ state = TabStateFileManager.restoreTabState(getStateDirectory(), tabToRestore.id); } logExecutionTime("RestoreTabTime", time); + restoreTab(tabToRestore, state, maybeRestoreCriticalPersistedTabDataSynchronously(tabToRestore), setAsActive); } catch (Exception e) { @@ -570,7 +573,11 @@ private static byte[] maybeRestoreCriticalPersistedTabDataSynchronously( TabRestoreDetails tabToRestore) { if (!isCriticalPersistedTabDataEnabled()) return null; - return CriticalPersistedTabData.restore(tabToRestore.id, tabToRestore.isIncognito); + Boolean isIncognito = isIncognitoWithCPTDFallback(tabToRestore); + if (isIncognito == null) { + return null; + } + return CriticalPersistedTabData.restore(tabToRestore.id, isIncognito); } /** @@ -585,8 +592,10 @@ protected void restoreTab(TabRestoreDetails tabToRestore, TabState tabState, byte[] serializedCriticalPersistedTabData, boolean setAsActive) { // If we don't have enough information about the Tab, bail out. - boolean isIncognito = isIncognitoTabBeingRestored(tabToRestore, tabState); - if (tabState == null) { + boolean isIncognito = isIncognitoTabBeingRestored( + tabToRestore, tabState, serializedCriticalPersistedTabData); + + if (tabState == null && serializedCriticalPersistedTabData == null) { if (tabToRestore.isIncognito == null) { Log.w(TAG, "Failed to restore tab: not enough info about its type was available."); return; @@ -601,14 +610,12 @@ } } } - TabModel model = mTabModelSelector.getModel(isIncognito); if (model.isIncognito() != isIncognito) { throw new IllegalStateException("Incognito state mismatch. Restored tab state: " + isIncognito + ". Model: " + model.isIncognito()); } - SparseIntArray restoredTabs = isIncognito ? mIncognitoTabsRestored : mNormalTabsRestored; int restoredIndex = 0; if (tabToRestore.fromMerge) { @@ -632,10 +639,10 @@ } int tabId = tabToRestore.id; - if (tabState != null) { + if (tabState != null || serializedCriticalPersistedTabData != null) { mTabCreatorManager.getTabCreator(isIncognito) .createFrozenTab(tabState, serializedCriticalPersistedTabData, tabToRestore.id, - restoredIndex); + isIncognito, restoredIndex); } else { if (UrlUtilities.isNTPUrl(tabToRestore.url) && !setAsActive && !tabToRestore.fromMerge) { @@ -761,16 +768,15 @@ return; } mTabsToSave.addLast(tab); - tab.setIsTabSaveEnabled(isCriticalPersistedTabDataEnabled()); } public void removeTabFromQueues(Tab tab) { mTabsToSave.remove(tab); mTabsToRestore.remove(getTabToRestoreById(tab.getId())); - if (mLoadTabTask != null && mLoadTabTask.mTabToRestore.id == tab.getId()) { - mLoadTabTask.cancel(false); - mLoadTabTask = null; + if (mTabLoader != null && mTabLoader.mTabToRestore.id == tab.getId()) { + mTabLoader.cancel(false); + mTabLoader = null; loadNextTab(); } @@ -803,7 +809,7 @@ public void destroy() { mDestroyed = true; mPersistencePolicy.destroy(); - if (mLoadTabTask != null) mLoadTabTask.cancel(true); + if (mTabLoader != null) mTabLoader.cancel(true); mTabsToSave.clear(); mTabsToRestore.clear(); if (mSaveTabTask != null) mSaveTabTask.cancel(false); @@ -821,7 +827,7 @@ // The metadata file may be being written out before all of the Tabs have been restored. // Save that information out, as well. - if (mLoadTabTask != null) tabsToRestore.add(mLoadTabTask.mTabToRestore); + if (mTabLoader != null) tabsToRestore.add(mTabLoader.mTabToRestore); for (TabRestoreDetails details : mTabsToRestore) { tabsToRestore.add(details); } @@ -1184,7 +1190,10 @@ @Override protected void onPostExecute(Void v) { if (mDestroyed || isCancelled()) return; - if (mStateSaved) ((TabImpl) mTab).setIsTabStateDirty(false); + if (mStateSaved) { + ((TabImpl) mTab).setIsTabStateDirty(false); + mTab.setIsTabSaveEnabled(isCriticalPersistedTabDataEnabled()); + } mSaveTabTask = null; saveNextTab(); } @@ -1322,15 +1331,90 @@ cleanUpPersistentData(); onStateLoaded(); - mLoadTabTask = null; + mTabLoader = null; Log.i(TAG, "Loaded tab lists; counts: " + mTabModelSelector.getModel(false).getCount() + "," + mTabModelSelector.getModel(true).getCount()); } else { TabRestoreDetails tabToRestore = mTabsToRestore.removeFirst(); - mLoadTabTask = new LoadTabTask(tabToRestore); + mTabLoader = new TabLoader(tabToRestore); + mTabLoader.load(); + } + } + + /** + * Determine if tab is incognito based on field in TabRestoreDetails. If unknown in + * TabRestoreDetails, try to determine if Tab is incognito or not based on existence + * of CriticalPersistedTabData files. + */ + private static Boolean isIncognitoWithCPTDFallback(TabRestoreDetails tabToRestore) { + return tabToRestore.isIncognito == null + ? FilePersistedTabDataStorage.isIncognito(tabToRestore.id) + : tabToRestore.isIncognito; + } + + /** + * Manages loading of {@link TabState} and {@link CriticalPersistedTabData} (TabState + * replacement) stored tab metadata. Also used to track if a load is in progress and the tab + * details of that load. + */ + private class TabLoader { + public final TabRestoreDetails mTabToRestore; + private LoadTabTask mLoadTabTask; + private CallbackController mCallbackController = new CallbackController(); + + /** + * @param tabToRestore details of {@link Tab} which will be read from storage + */ + TabLoader(TabRestoreDetails tabToRestore) { + mTabToRestore = tabToRestore; + } + + /** + * Load serialized {@link CriticalPersistedTabData} from storage if CriticalPersistedTabData + * is enabled or {@link TabState} if CriticalPersistedTabData is not enabled. + * Fall back to {@link TabState} if no {@link CriticalPersistedTabData} file exists. + */ + public void load() { + if (isCriticalPersistedTabDataEnabled()) { + Boolean isIncognito = isIncognitoWithCPTDFallback(mTabToRestore); + if (isIncognito == null) { + loadTabState(); + } else { + TraceEvent.startAsync("LoadCriticalPersistedTabData", mTabToRestore.id); + long startTime = SystemClock.elapsedRealtime(); + CriticalPersistedTabData.restore(mTabToRestore.id, isIncognito, + mCallbackController.makeCancelable((res) -> { + TraceEvent.finishAsync( + "LoadCriticalPersistedTabData", mTabToRestore.id); + RecordHistogram.recordTimesHistogram( + String.format(Locale.US, + "Tabs.SavedTabLoadTime.CriticalPersistedTabData.%s", + res == null ? "Null" : "Exists"), + SystemClock.elapsedRealtime() - startTime); + if (res == null) { + loadTabState(); + } else { + completeLoad(mTabToRestore, null, res); + } + })); + } + } else { + loadTabState(); + } + } + + private void loadTabState() { + mLoadTabTask = new LoadTabTask(mTabToRestore); mLoadTabTask.executeOnTaskRunner(mSequencedTaskRunner); } + + public void cancel(boolean mayInterruptIfRunning) { + if (mLoadTabTask != null) { + mLoadTabTask.cancel(mayInterruptIfRunning); + } + mCallbackController.destroy(); + } } /** @@ -1390,12 +1474,8 @@ } private class LoadTabTask extends AsyncTask<TabState> { - public final TabRestoreDetails mTabToRestore; - private byte[] mSerializedCriticalPersistedTabData; + private final TabRestoreDetails mTabToRestore; private TabState mTabState; - // TabState and CriticalPersistedTabData are acquired asynchronously and Tab - // restoration continues when both have been returned - private int mRemaining = isCriticalPersistedTabDataEnabled() ? 2 : 1; private long mStartTime; public LoadTabTask(TabRestoreDetails tabToRestore) { @@ -1403,26 +1483,6 @@ TraceEvent.startAsync("LoadTabTask", mTabToRestore.id); TraceEvent.startAsync("LoadTabState", mTabToRestore.id); mStartTime = SystemClock.elapsedRealtime(); - // TODO(crbug.com/1119455) decouple CriticalPersistedTabData from - // LoadTabTask - if (isCriticalPersistedTabDataEnabled()) { - TraceEvent.startAsync("LoadCriticalPersistedTabData", mTabToRestore.id); - CriticalPersistedTabData.restore( - tabToRestore.id, tabToRestore.isIncognito, (res) -> { - TraceEvent.finishAsync( - "LoadCriticalPersistedTabData", mTabToRestore.id); - RecordHistogram.recordTimesHistogram( - String.format(Locale.US, - "Tabs.SavedTabLoadTime.CriticalPersistedTabData.%s", - res == null ? "Null" : "Exists"), - SystemClock.elapsedRealtime() - mStartTime); - mSerializedCriticalPersistedTabData = res; - mRemaining--; - if (mRemaining == 0) { - completeLoad(); - } - }); - } } @Override @@ -1444,32 +1504,34 @@ tabState == null ? "Null" : "Exists"), SystemClock.elapsedRealtime() - mStartTime); mTabState = tabState; - mRemaining--; - if (mRemaining == 0) { - completeLoad(); - } - } - private void completeLoad() { TraceEvent.finishAsync("LoadTabTask", mTabToRestore.id); - if (mDestroyed || isCancelled()) return; - - boolean isIncognito = isIncognitoTabBeingRestored(mTabToRestore, mTabState); - if (isIncognito) { - Log.i(TAG, - "Finishing tab restore, isIncognito: " + isIncognito - + " cancelIncognito: " + mCancelIncognitoTabLoads); - } - boolean isLoadCancelled = (isIncognito && mCancelIncognitoTabLoads) - || (!isIncognito && mCancelNormalTabLoads); - if (!isLoadCancelled) { - restoreTab(mTabToRestore, mTabState, mSerializedCriticalPersistedTabData, false); + if (mDestroyed || isCancelled()) { + return; } - loadNextTab(); + completeLoad(mTabToRestore, mTabState, null); } } + private void completeLoad(TabRestoreDetails tabToRestore, TabState tabState, + byte[] serializedCriticalPersistedTabData) { + boolean isIncognito = isIncognitoTabBeingRestored( + tabToRestore, tabState, serializedCriticalPersistedTabData); + if (isIncognito) { + Log.i(TAG, + "Finishing tab restore, isIncognito: " + isIncognito + + " cancelIncognito: " + mCancelIncognitoTabLoads); + } + boolean isLoadCancelled = (isIncognito && mCancelIncognitoTabLoads) + || (!isIncognito && mCancelNormalTabLoads); + if (!isLoadCancelled) { + restoreTab(tabToRestore, tabState, serializedCriticalPersistedTabData, false); + } + + loadNextTab(); + } + /** * Provides additional meta data to restore an individual tab. */ @@ -1504,7 +1566,8 @@ * * @return True if the tab is definitely Incognito, false if it's not or if it's undecideable. */ - private boolean isIncognitoTabBeingRestored(TabRestoreDetails tabDetails, TabState tabState) { + private boolean isIncognitoTabBeingRestored(TabRestoreDetails tabDetails, TabState tabState, + byte[] serializedCriticalPersistedTabData) { if (tabState != null) { Log.i(TAG, "#isIncognitoTabBeingRestored from tabState: " + tabState.isIncognito()); // The Tab's previous state was completely restored. @@ -1513,6 +1576,8 @@ Log.i(TAG, "#isIncognitoTabBeingRestored from tabDetails: " + tabDetails.isIncognito); // The TabState couldn't be restored, but we have some information about the tab. return tabDetails.isIncognito; + } else if (serializedCriticalPersistedTabData != null) { + return FilePersistedTabDataStorage.isIncognito(tabDetails.id); } else { Log.i(TAG, "#isIncognitoTabBeingRestored defaulting to false"); // The tab's type is undecidable.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java index 9f880d27..b83d53c7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java
@@ -75,11 +75,13 @@ * The index is ignored in DocumentMode because Android handles the ordering of Tabs. */ @Override - public Tab createFrozenTab(TabState state, byte[] criticalPersistedTabData, int id, int index) { - return TabBuilder.createFromFrozenState() - .setId(id) - .setIncognito(state.isIncognito()) - .build(); + public Tab createFrozenTab(TabState state, byte[] criticalPersistedTabData, int id, + boolean isIncognito, int index) { + if (isIncognito != mIsIncognito) { + throw new IllegalStateException("Incognito state mismatch. isIncognito: " + isIncognito + + ". TabDelegate: " + mIsIncognito); + } + return TabBuilder.createFromFrozenState().setId(id).setIncognito(isIncognito).build(); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/DEPS b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/DEPS index 773fef3..c3558e1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/DEPS +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/DEPS
@@ -22,5 +22,8 @@ 'ToolbarButtonInProductHelpController.java': [ "+chrome/android/java/src/org/chromium/chrome/browser", "-chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java", + ], + 'StartSurfaceToolbarView.java': [ + "+chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/HomeButton.java", ] }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index b1dff96..aeb60e9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -888,7 +888,8 @@ buttonDataProviders, mLayoutStateProviderSupplier, browsingModeThemeColorProvider, mAppThemeColorProvider, mMenuButtonCoordinator, startSurfaceMenuButtonCoordinator, mMenuButtonCoordinator.getMenuButtonHelperSupplier(), mTabModelSelectorSupplier, - mHomeButtonVisibilitySupplier, mIdentityDiscStateSupplier, (client) -> { + mHomeButtonVisibilitySupplier, mHomepageManagedByPolicySupplier, + mIdentityDiscStateSupplier, (client) -> { if (invalidator != null) { invalidator.invalidate(client); } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java index 30a5001..37d7f58b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java
@@ -60,7 +60,10 @@ OneshotSupplier<LayoutStateProvider> layoutStateProviderSupplier, ObservableSupplier<Boolean> identityDiscStateSupplier, ThemeColorProvider provider, MenuButtonCoordinator menuButtonCoordinator, - Supplier<ButtonData> identityDiscButtonSupplier, boolean isGridTabSwitcherEnabled) { + Supplier<ButtonData> identityDiscButtonSupplier, boolean isGridTabSwitcherEnabled, + ObservableSupplier<Boolean> homepageEnabledSupplier, + ObservableSupplier<Boolean> homepageManagedByPolicySupplier, + OnClickListener homeButtonOnClickHandler) { mStub = startSurfaceToolbarStub; layoutStateProviderSupplier.onAvailable( @@ -92,7 +95,9 @@ }, StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH_NO_TAB.getValue(), StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH.getValue(), - menuButtonCoordinator, identityDiscStateSupplier, identityDiscButtonSupplier); + StartSurfaceConfiguration.HOME_BUTTON_ON_GRID_TAB_SWITCHER.getValue(), + menuButtonCoordinator, identityDiscStateSupplier, identityDiscButtonSupplier, + homepageEnabledSupplier, homepageManagedByPolicySupplier, homeButtonOnClickHandler); mThemeColorProvider = provider; mMenuButtonCoordinator = menuButtonCoordinator;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java index 7265ff6..9fcca59 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
@@ -6,6 +6,10 @@ import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.ACCESSIBILITY_ENABLED; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.BUTTONS_CLICKABLE; +import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.HOMEPAGE_ENABLED_SUPPLIER; +import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.HOMEPAGE_MANAGED_BY_POLICY_SUPPLIER; +import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.HOME_BUTTON_CLICK_HANDLER; +import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.HOME_BUTTON_IS_VISIBLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_CLICK_HANDLER; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_DESCRIPTION; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_IMAGE; @@ -67,11 +71,16 @@ private CallbackController mCallbackController = new CallbackController(); private float mNonIncognitoHomepageTranslationY; + private boolean mShowHomeButtonOnTabSwitcher; + StartSurfaceToolbarMediator(PropertyModel model, Callback<IPHCommandBuilder> showIPHCallback, boolean hideIncognitoSwitchWhenNoTabs, boolean hideIncognitoSwitchOnHomePage, - MenuButtonCoordinator menuButtonCoordinator, + boolean showHomeButtonOnTabSwitcher, MenuButtonCoordinator menuButtonCoordinator, ObservableSupplier<Boolean> identityDiscStateSupplier, - Supplier<ButtonData> identityDiscButtonSupplier) { + Supplier<ButtonData> identityDiscButtonSupplier, + ObservableSupplier<Boolean> homepageEnabledSupplier, + ObservableSupplier<Boolean> homepageManagedByPolicySupplier, + View.OnClickListener homeButtonOnClickHandler) { mPropertyModel = model; mOverviewModeState = StartSurfaceState.NOT_SHOWN; mShowIPHCallback = showIPHCallback; @@ -84,6 +93,14 @@ if (!canShowHint && !mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)) return; updateIdentityDisc(mIdentityDiscButtonSupplier.get()); }); + + mShowHomeButtonOnTabSwitcher = showHomeButtonOnTabSwitcher; + if (mShowHomeButtonOnTabSwitcher) { + mPropertyModel.set(HOMEPAGE_ENABLED_SUPPLIER, homepageEnabledSupplier); + mPropertyModel.set( + HOMEPAGE_MANAGED_BY_POLICY_SUPPLIER, homepageManagedByPolicySupplier); + mPropertyModel.set(HOME_BUTTON_CLICK_HANDLER, homeButtonOnClickHandler); + } } void onNativeLibraryReady() { @@ -123,6 +140,7 @@ setStartSurfaceToolbarVisibility(shouldShowStartSurfaceToolbar); updateIncognitoSwitchVisibility(); updateNewTabButtonVisibility(); + updateHomeButtonVisibility(); updateLogoVisibility(mIsGoogleSearchEngine); updateIdentityDisc(mIdentityDiscButtonSupplier.get()); updateTranslationY(mNonIncognitoHomepageTranslationY); @@ -289,6 +307,16 @@ mPropertyModel.set(NEW_TAB_BUTTON_IS_VISIBLE, isShownTabswitcherState); } + private void updateHomeButtonVisibility() { + boolean isShownTabswitcherState = mOverviewModeState == StartSurfaceState.SHOWN_TABSWITCHER + || mOverviewModeState == StartSurfaceState.SHOWN_TABSWITCHER_TASKS_ONLY + || mOverviewModeState == StartSurfaceState.SHOWN_TABSWITCHER_OMNIBOX_ONLY + || mOverviewModeState == StartSurfaceState.SHOWN_TABSWITCHER_TRENDY_TERMS; + mPropertyModel.set(HOME_BUTTON_IS_VISIBLE, + isShownTabswitcherState && !mPropertyModel.get(IS_INCOGNITO) + && mShowHomeButtonOnTabSwitcher); + } + private void updateTranslationY(float transY) { if (mOverviewModeState == StartSurfaceState.SHOWN_HOMEPAGE && !mPropertyModel.get(IS_INCOGNITO)) { @@ -307,4 +335,9 @@ int getOverviewModeStateForTesting() { return mOverviewModeState; } + + @VisibleForTesting + void setShowHomeButtonOnTabSwitcherForTesting(boolean showHomeButtonOnTabSwitcher) { + mShowHomeButtonOnTabSwitcher = showHomeButtonOnTabSwitcher; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java index aafd9cf6..54f7eba 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java
@@ -7,6 +7,7 @@ import android.graphics.drawable.Drawable; import android.view.View; +import org.chromium.base.supplier.ObservableSupplier; import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; @@ -71,11 +72,25 @@ public static final PropertyModel.WritableFloatPropertyKey TRANSLATION_Y = new PropertyModel.WritableFloatPropertyKey(); - public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {NEW_TAB_CLICK_HANDLER, - IS_VISIBLE, LOGO_IS_VISIBLE, IS_INCOGNITO, INCOGNITO_STATE_PROVIDER, - ACCESSIBILITY_ENABLED, MENU_IS_VISIBLE, NEW_TAB_BUTTON_IS_VISIBLE, BUTTONS_CLICKABLE, - GRID_TAB_SWITCHER_ENABLED, IDENTITY_DISC_AT_START, INCOGNITO_SWITCHER_VISIBLE, - NEW_TAB_BUTTON_AT_START, IDENTITY_DISC_IS_VISIBLE, IDENTITY_DISC_CLICK_HANDLER, - IDENTITY_DISC_IMAGE, IDENTITY_DISC_DESCRIPTION, IN_START_SURFACE_MODE, - NEW_TAB_BUTTON_HIGHLIGHT, TRANSLATION_Y}; + public static final PropertyModel.WritableBooleanPropertyKey HOME_BUTTON_IS_VISIBLE = + new PropertyModel.WritableBooleanPropertyKey(); + public static final PropertyModel + .WritableObjectPropertyKey<ObservableSupplier<Boolean>> HOMEPAGE_ENABLED_SUPPLIER = + new PropertyModel.WritableObjectPropertyKey<ObservableSupplier<Boolean>>(); + public static final PropertyModel.WritableObjectPropertyKey<ObservableSupplier<Boolean>> + HOMEPAGE_MANAGED_BY_POLICY_SUPPLIER = + new PropertyModel.WritableObjectPropertyKey<ObservableSupplier<Boolean>>(); + public static final PropertyModel + .WritableObjectPropertyKey<View.OnClickListener> HOME_BUTTON_CLICK_HANDLER = + new PropertyModel.WritableObjectPropertyKey<View.OnClickListener>(); + + public static final PropertyKey[] ALL_KEYS = + new PropertyKey[] {NEW_TAB_CLICK_HANDLER, IS_VISIBLE, LOGO_IS_VISIBLE, IS_INCOGNITO, + INCOGNITO_STATE_PROVIDER, ACCESSIBILITY_ENABLED, MENU_IS_VISIBLE, + NEW_TAB_BUTTON_IS_VISIBLE, BUTTONS_CLICKABLE, GRID_TAB_SWITCHER_ENABLED, + IDENTITY_DISC_AT_START, INCOGNITO_SWITCHER_VISIBLE, NEW_TAB_BUTTON_AT_START, + IDENTITY_DISC_IS_VISIBLE, IDENTITY_DISC_CLICK_HANDLER, IDENTITY_DISC_IMAGE, + IDENTITY_DISC_DESCRIPTION, IN_START_SURFACE_MODE, NEW_TAB_BUTTON_HIGHLIGHT, + TRANSLATION_Y, HOME_BUTTON_IS_VISIBLE, HOMEPAGE_ENABLED_SUPPLIER, + HOMEPAGE_MANAGED_BY_POLICY_SUPPLIER, HOME_BUTTON_CLICK_HANDLER}; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarView.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarView.java index 5a641b8..42610f9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarView.java
@@ -19,9 +19,11 @@ import androidx.annotation.StringRes; import androidx.appcompat.content.res.AppCompatResources; +import org.chromium.base.supplier.ObservableSupplier; import org.chromium.chrome.R; import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider; +import org.chromium.chrome.browser.toolbar.HomeButton; import org.chromium.chrome.browser.toolbar.NewTabButton; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.components.browser_ui.widget.animation.Interpolators; @@ -30,6 +32,7 @@ /** View of the StartSurfaceToolbar */ class StartSurfaceToolbarView extends RelativeLayout { private NewTabButton mNewTabButton; + private HomeButton mHomeButton; private View mIncognitoSwitch; private View mLogo; @Nullable @@ -46,6 +49,10 @@ private boolean mInStartSurfaceMode; private boolean mIsShowing; + private ObservableSupplier<Boolean> mHomepageEnabledSupplier; + private ObservableSupplier<Boolean> mHomepageManagedByPolicySupplier; + private boolean mIsHomeButtonInitialized; + public StartSurfaceToolbarView(Context context, AttributeSet attrs) { super(context, attrs); } @@ -54,6 +61,7 @@ protected void onFinishInflate() { super.onFinishInflate(); mNewTabButton = findViewById(R.id.new_tab_button); + mHomeButton = findViewById(R.id.home_button_on_tab_switcher); mIncognitoSwitch = findViewById(R.id.incognito_switch); mLogo = findViewById(R.id.logo); mIdentityDiscButton = findViewById(R.id.identity_disc_button); @@ -131,6 +139,54 @@ } /** + * @param isVisible Whether the home button is visible. + */ + void setHomeButtonVisibility(boolean isVisible) { + mayInitializeHomeButton(); + mHomeButton.setVisibility(isVisible ? View.VISIBLE : View.GONE); + } + + /** + * @param homepageEnabledSupplier Supplier of whether homepage is enabled. + */ + void setHomepageEnabledSupplier(ObservableSupplier<Boolean> homepageEnabledSupplier) { + assert mHomepageEnabledSupplier == null; + mHomepageEnabledSupplier = homepageEnabledSupplier; + } + + /** + * @param homepageManagedByPolicySupplier Supplier of whether the homepage is managed by policy. + */ + void setHomepageManagedByPolicySupplier( + ObservableSupplier<Boolean> homepageManagedByPolicySupplier) { + assert mHomepageManagedByPolicySupplier == null; + mHomepageManagedByPolicySupplier = homepageManagedByPolicySupplier; + } + + /** + * Initializes the home button if not yet. + */ + private void mayInitializeHomeButton() { + if (mIsHomeButtonInitialized || mHomepageEnabledSupplier == null + || mHomepageManagedByPolicySupplier == null) { + return; + } + + // The long click which shows the change homepage settings is disabled when the Start + // surface is enabled. + mHomeButton.init(mHomepageEnabledSupplier, null, mHomepageManagedByPolicySupplier); + mIsHomeButtonInitialized = true; + } + + /** + * @param homeButtonClickHandler The callback that will be notified when the home button is + * pressed. + */ + void setHomeButtonClickHandler(OnClickListener homeButtonClickHandler) { + mHomeButton.setOnClickListener(homeButtonClickHandler); + } + + /** * @param isClickable Whether the buttons are clickable. */ void setButtonClickableState(boolean isClickable) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java index d50f0a2..d443ead11 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java
@@ -7,6 +7,10 @@ import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.ACCESSIBILITY_ENABLED; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.BUTTONS_CLICKABLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.GRID_TAB_SWITCHER_ENABLED; +import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.HOMEPAGE_ENABLED_SUPPLIER; +import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.HOMEPAGE_MANAGED_BY_POLICY_SUPPLIER; +import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.HOME_BUTTON_CLICK_HANDLER; +import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.HOME_BUTTON_IS_VISIBLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_AT_START; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_CLICK_HANDLER; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_DESCRIPTION; @@ -72,6 +76,14 @@ view.setNewTabButtonVisibility(model.get(NEW_TAB_BUTTON_IS_VISIBLE)); } else if (propertyKey == TRANSLATION_Y) { view.setTranslationY(model.get(TRANSLATION_Y)); + } else if (propertyKey == HOME_BUTTON_IS_VISIBLE) { + view.setHomeButtonVisibility(model.get(HOME_BUTTON_IS_VISIBLE)); + } else if (propertyKey == HOMEPAGE_ENABLED_SUPPLIER) { + view.setHomepageEnabledSupplier(model.get(HOMEPAGE_ENABLED_SUPPLIER)); + } else if (propertyKey == HOMEPAGE_MANAGED_BY_POLICY_SUPPLIER) { + view.setHomepageManagedByPolicySupplier(model.get(HOMEPAGE_MANAGED_BY_POLICY_SUPPLIER)); + } else if (propertyKey == HOME_BUTTON_CLICK_HANDLER) { + view.setHomeButtonClickHandler(model.get(HOME_BUTTON_CLICK_HANDLER)); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTTCoordinatorPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTTCoordinatorPhone.java index 3ed9096..e7265bc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTTCoordinatorPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTTCoordinatorPhone.java
@@ -188,10 +188,10 @@ private boolean isNewTabVariationEnabled() { return mIsGridTabSwitcherEnabled && ChromeFeatureList.isInitialized() && IncognitoUtils.isIncognitoModeEnabled() - && !ChromeFeatureList - .getFieldTrialParamByFeature(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, - "tab_grid_layout_android_new_tab") - .equals("false"); + && ChromeFeatureList + .getFieldTrialParamByFeature(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, + "tab_grid_layout_android_new_tab") + .equals("NewTabVariation"); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java index e257078..52e48f74 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -104,6 +104,7 @@ * @param overviewThemeColorProvider The {@link ThemeColorProvider} for overview mode. * @param tabModelSelectorSupplier Supplier of the {@link TabModelSelector}. * @param homeButtonVisibilitySupplier Supplier of the visibility change of Home button. + * @param homepageManagedByPolicySupplier Supplier of whether the homepage is managed by policy. * @param identityDiscStateSupplier Supplier of the state change of identity disc button. * @param invalidatorCallback Callback that will be invoked when the toolbar attempts to * invalidate the drawing surface. This will give the object that registers as the host @@ -128,6 +129,7 @@ ObservableSupplier<AppMenuButtonHelper> appMenuButtonHelperSupplier, ObservableSupplier<TabModelSelector> tabModelSelectorSupplier, ObservableSupplier<Boolean> homeButtonVisibilitySupplier, + ObservableSupplier<Boolean> homepageManagedByPolicySupplier, ObservableSupplier<Boolean> identityDiscStateSupplier, Callback<Runnable> invalidatorCallback, Supplier<ButtonData> identityDiscButtonSupplier, OneshotSupplier<StartSurface> startSurfaceSupplier, @@ -145,11 +147,18 @@ if (mToolbarLayout instanceof ToolbarPhone) { if (isStartSurfaceEnabled) { + View.OnClickListener homeButtonOnClickListener = v -> { + if (tabController != null) { + tabController.openHomepage(); + } + }; mStartSurfaceToolbarCoordinator = new StartSurfaceToolbarCoordinator( controlContainer.getRootView().findViewById(R.id.tab_switcher_toolbar_stub), userEducationHelper, layoutStateProviderSupplier, identityDiscStateSupplier, overviewThemeColorProvider, overviewModeMenuButtonCoordinator, - identityDiscButtonSupplier, isGridTabSwitcherEnabled); + identityDiscButtonSupplier, isGridTabSwitcherEnabled, + homeButtonVisibilitySupplier, homepageManagedByPolicySupplier, + homeButtonOnClickListener); } else { mTabSwitcherModeCoordinatorPhone = new TabSwitcherModeTTCoordinatorPhone( controlContainer.getRootView().findViewById(R.id.tab_switcher_toolbar_stub),
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java index 4c170bd..c9c0bd3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java
@@ -255,7 +255,7 @@ TabState state = TabStateExtractor.from(tab); sActivityTestRule.getActivity().getCurrentTabModel().closeTab(tab); frozen[0] = sActivityTestRule.getActivity().getCurrentTabCreator().createFrozenTab( - state, null, tab.getId(), 1); + state, null, tab.getId(), tab.isIncognito(), 1); restored[0] = WebContentsStateBridge.restoreContentsFromByteBuffer( TabStateExtractor.from(frozen[0]).contentsState, false); });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java index 09b8ede..f4c7a26 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java
@@ -108,18 +108,14 @@ ChromeFeatureList.setTestFeatures(features); TestThreadUtils.runOnUiThreadBlocking(() -> { - // ApplicationStatus needs to be initialized with an activity to retrieve correct - // resources. - if (!ApplicationStatus.isInitialized()) { - ApplicationStatus.initialize(BaseJUnit4ClassRunner.getApplication()); - } ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.CREATED); }); } @After public void tearDown() { - ApplicationStatus.destroyForJUnitTests(); + TestThreadUtils.runOnUiThreadBlocking( + () -> { ApplicationStatus.resetActivitiesForInstrumentationTests(); }); } private void initializePopulator(@ContextMenuMode int mode, ContextMenuParams params) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabLaunchCauseMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabLaunchCauseMetricsTest.java index bde13b28..bec616d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabLaunchCauseMetricsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabLaunchCauseMetricsTest.java
@@ -34,15 +34,14 @@ @Before public void setUp() { NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess(); - if (!ApplicationStatus.isInitialized()) { - ApplicationStatus.initialize(BaseJUnit4ClassRunner.getApplication()); - } } @After public void tearDown() { - ThreadUtils.runOnUiThreadBlocking(() -> LaunchCauseMetrics.resetForTests()); - ApplicationStatus.destroyForJUnitTests(); + ThreadUtils.runOnUiThreadBlocking(() -> { + ApplicationStatus.resetActivitiesForInstrumentationTests(); + LaunchCauseMetrics.resetForTests(); + }); } private static int histogramCountForValue(int value) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/LaunchCauseMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/LaunchCauseMetricsTest.java index f1e2bff1..49f1fb6 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/LaunchCauseMetricsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/LaunchCauseMetricsTest.java
@@ -43,9 +43,6 @@ @Before public void setUp() { ThreadUtils.runOnUiThreadBlocking(() -> { - if (!ApplicationStatus.isInitialized()) { - ApplicationStatus.initialize(BaseJUnit4ClassRunner.getApplication()); - } ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.CREATED); }); NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess(); @@ -53,8 +50,10 @@ @After public void tearDown() { - ApplicationStatus.destroyForJUnitTests(); - ThreadUtils.runOnUiThreadBlocking(() -> LaunchCauseMetrics.resetForTests()); + ThreadUtils.runOnUiThreadBlocking(() -> { + ApplicationStatus.resetActivitiesForInstrumentationTests(); + LaunchCauseMetrics.resetForTests(); + }); } private static int histogramCountForValue(int value) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/TabbedActivityLaunchCauseMetricsUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/TabbedActivityLaunchCauseMetricsUnitTest.java index a8e7e4e..aa3b4f8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/TabbedActivityLaunchCauseMetricsUnitTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/TabbedActivityLaunchCauseMetricsUnitTest.java
@@ -48,9 +48,6 @@ @Before public void setUp() { ThreadUtils.runOnUiThreadBlocking(() -> { - if (!ApplicationStatus.isInitialized()) { - ApplicationStatus.initialize(BaseJUnit4ClassRunner.getApplication()); - } ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.CREATED); }); NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess(); @@ -58,8 +55,10 @@ @After public void tearDown() { - ApplicationStatus.destroyForJUnitTests(); - ThreadUtils.runOnUiThreadBlocking(() -> LaunchCauseMetrics.resetForTests()); + ThreadUtils.runOnUiThreadBlocking(() -> { + ApplicationStatus.resetActivitiesForInstrumentationTests(); + LaunchCauseMetrics.resetForTests(); + }); } private static int histogramCountForValue(int value) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorageTest.java index 26775386..4a7af0a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorageTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorageTest.java
@@ -72,7 +72,7 @@ }); semaphore.acquire(); - File file = persistedTabDataStorage.getFile(TAB_ID_1, DATA_ID_1); + File file = FilePersistedTabDataStorage.getFile(TAB_ID_1, DATA_ID_1); Assert.assertTrue(file.exists()); ThreadUtils.runOnUiThreadBlocking(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabModelMergingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabModelMergingTest.java index 5111d77..988389d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabModelMergingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabModelMergingTest.java
@@ -37,7 +37,6 @@ import org.chromium.base.test.util.UrlUtils; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.ChromeTabbedActivity2; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.multiwindow.MultiInstanceManager; import org.chromium.chrome.browser.multiwindow.MultiWindowTestHelper; @@ -50,7 +49,6 @@ import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.chrome.test.util.OverviewModeBehaviorWatcher; -import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.test.util.UiRestriction; @@ -508,7 +506,6 @@ @Test @LargeTest - @EnableFeatures(ChromeFeatureList.ANDROID_MULTIPLE_DISPLAY) @DisableIf.Build(sdk_is_less_than = VERSION_CODES.P) public void testMergeOnMultiDisplay_CTA_Resumed_CTA2_Not_Resumed() throws TimeoutException { TestThreadUtils.runOnUiThreadBlocking(() -> { @@ -549,7 +546,6 @@ @Test @LargeTest - @EnableFeatures(ChromeFeatureList.ANDROID_MULTIPLE_DISPLAY) @DisableIf.Build(sdk_is_less_than = VERSION_CODES.P) public void testMergeOnMultiDisplay_OnDisplayChanged() throws TimeoutException { TestThreadUtils.runOnUiThreadBlocking(() -> {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java index 585ab29..025e6e2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java
@@ -22,9 +22,11 @@ import org.chromium.base.ActivityState; import org.chromium.base.ContextUtils; import org.chromium.base.task.AsyncTask; -import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.params.ParameterAnnotations; +import org.chromium.base.test.params.ParameterProvider; +import org.chromium.base.test.params.ParameterSet; +import org.chromium.base.test.params.ParameterizedRunner; import org.chromium.base.test.util.AdvancedMockContext; -import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisableIf; @@ -38,6 +40,7 @@ import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton; import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelper; import org.chromium.chrome.browser.flags.ActivityType; +import org.chromium.chrome.browser.flags.CachedFeatureFlags; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; @@ -60,6 +63,7 @@ import org.chromium.chrome.browser.tabmodel.TestTabModelDirectory.TabStateInfo; import org.chromium.chrome.browser.tabpersistence.TabStateDirectory; import org.chromium.chrome.test.ChromeBrowserTestRule; +import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.DisableFeatures; import org.chromium.chrome.test.util.browser.tabmodel.MockTabCreator; @@ -68,14 +72,18 @@ import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; /** Tests for the TabPersistentStore. */ -@RunWith(BaseJUnit4ClassRunner.class) -@Batch(Batch.PER_CLASS) + +// TODO(crbug.com/1174662) reintroduce batching - batching was removed because introducing +// parameterized tests caused cross-talk between tests. +@RunWith(ParameterizedRunner.class) +@ParameterAnnotations.UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) @CommandLineFlags. Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "force-fieldtrials=Study/Group"}) public class TabPersistentStoreTest { @@ -234,6 +242,18 @@ }; private static TabWindowManagerImpl sTabWindowManager; + /** + * Parameterizes whether CriticalPersistedTabData flag should be turned on + * or off + */ + public static class StoreParamProvider implements ParameterProvider { + @Override + public Iterable<ParameterSet> getParameters() { + return Arrays.asList(new ParameterSet().value(false).name("TabState"), + new ParameterSet().value(true).name("CriticalPersistedTabData")); + } + } + /** Class for mocking out the directory containing all of the TabState files. */ private TestTabModelDirectory mMockDirectory; private AdvancedMockContext mAppContext; @@ -242,6 +262,9 @@ @BeforeClass public static void beforeClassSetUp() { TestThreadUtils.runOnUiThreadBlocking(() -> { + // Required for parameterized tests - otherwise we will fail + // assert sInstance == null in setTabModelSelectorFactoryForTesting + TabWindowManagerSingleton.resetTabModelSelectorFactoryForTesting(); TabWindowManagerSingleton.setTabModelSelectorFactoryForTesting( sMockTabModelSelectorFactory); sTabWindowManager = (TabWindowManagerImpl) TabWindowManagerSingleton.getInstance(); @@ -250,6 +273,7 @@ @Before public void setUp() { + CachedFeatureFlags.setForTesting(ChromeFeatureList.CRITICAL_PERSISTED_TAB_DATA, false); TestThreadUtils.runOnUiThreadBlocking(() -> { mChromeActivity = new ChromeActivity() { @Override @@ -323,7 +347,10 @@ @Test @SmallTest @Feature("TabPersistentStore") - public void testBasic() throws Exception { + @ParameterAnnotations.UseMethodParameter(StoreParamProvider.class) + public void testBasic(boolean isCriticalPersistedTabDataEnabled) throws Exception { + CachedFeatureFlags.setForTesting( + ChromeFeatureList.CRITICAL_PERSISTED_TAB_DATA, isCriticalPersistedTabDataEnabled); TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V4; int numExpectedTabs = info.contents.length; @@ -423,7 +450,11 @@ @Test @SmallTest @Feature({"TabPersistentStore"}) - public void testInterruptedButStillRestoresAllTabs() throws Exception { + @ParameterAnnotations.UseMethodParameter(StoreParamProvider.class) + public void testInterruptedButStillRestoresAllTabs(boolean isCriticalPersistedTabDataEnabled) + throws Exception { + CachedFeatureFlags.setForTesting( + ChromeFeatureList.CRITICAL_PERSISTED_TAB_DATA, isCriticalPersistedTabDataEnabled); TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V4; int numExpectedTabs = info.contents.length; @@ -645,7 +676,10 @@ @Test @SmallTest @Feature({"TabPersistentStore"}) - public void testPrefetchActiveTab() throws Exception { + @ParameterAnnotations.UseMethodParameter(StoreParamProvider.class) + public void testPrefetchActiveTab(boolean isCriticalPersistedTabDataEnabled) throws Exception { + CachedFeatureFlags.setForTesting( + ChromeFeatureList.CRITICAL_PERSISTED_TAB_DATA, isCriticalPersistedTabDataEnabled); final TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V5_NO_M18; mMockDirectory.writeTabModelFiles(info, true); @@ -690,7 +724,11 @@ @Test @SmallTest @Feature({"TabPersistentStore"}) - public void testUndoSingleTabClosureWritesTabListFile() throws Exception { + @ParameterAnnotations.UseMethodParameter(StoreParamProvider.class) + public void testUndoSingleTabClosureWritesTabListFile(boolean isCriticalPersistedTabDataEnabled) + throws Exception { + CachedFeatureFlags.setForTesting( + ChromeFeatureList.CRITICAL_PERSISTED_TAB_DATA, isCriticalPersistedTabDataEnabled); TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V5_NO_M18; mMockDirectory.writeTabModelFiles(info, true);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java index 30ad778..7307643 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java
@@ -255,7 +255,8 @@ TabState ntpState = new TabState(); mPersistentStore.restoreTab(ntpDetails, ntpState, null, false); - verify(mNormalTabCreator).createFrozenTab(eq(ntpState), eq(null), eq(1), anyInt()); + verify(mNormalTabCreator) + .createFrozenTab(eq(ntpState), eq(null), eq(1), eq(false), anyInt()); } @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java index 5cc728a9..632ebd3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java
@@ -17,6 +17,7 @@ import org.chromium.base.ActivityState; import org.chromium.base.ApplicationStatus; +import org.chromium.base.ThreadUtils; import org.chromium.base.test.UiThreadTest; import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.Feature; @@ -29,10 +30,6 @@ import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector; -import org.chromium.content_public.browser.test.util.TestThreadUtils; - -import java.util.ArrayList; -import java.util.List; /** * Test for {@link TabWindowManagerImpl} through {@link TabWindowManagerSingleton}. @@ -43,7 +40,6 @@ @RunWith(ChromeJUnit4ClassRunner.class) @Batch(Batch.UNIT_TESTS) public class TabWindowManagerTest { - private List<Activity> mActivities = new ArrayList<>(); private static final TabModelSelectorFactory sMockTabModelSelectorFactory = new TabModelSelectorFactory() { @Override @@ -55,21 +51,28 @@ }; @BeforeClass - public static void setUp() { + public static void setUpFixture() { TabWindowManagerSingleton.setTabModelSelectorFactoryForTesting( sMockTabModelSelectorFactory); } + @After + public void tearDown() { + ThreadUtils.runOnUiThreadBlocking( + () -> { ApplicationStatus.resetActivitiesForInstrumentationTests(); }); + } + private ChromeActivity buildActivity() { ChromeActivity activity = new CustomTabActivity(); - mActivities.add(activity); - ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATED); + ThreadUtils.runOnUiThreadBlocking(() -> { + ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATED); + }); return activity; } private void destroyActivity(Activity a) { - mActivities.remove(a); - ApplicationStatus.onStateChangeForTesting(a, ActivityState.DESTROYED); + ThreadUtils.runOnUiThreadBlocking( + () -> { ApplicationStatus.onStateChangeForTesting(a, ActivityState.DESTROYED); }); } private Pair<Integer, TabModelSelector> requestSelector( @@ -79,16 +82,6 @@ activity, activity, () -> NextTabPolicy.HIERARCHICAL, requestedIndex); } - @After - public void tearDown() { - TestThreadUtils.runOnUiThreadBlocking(() -> { - for (Activity a : mActivities) { - ApplicationStatus.onStateChangeForTesting(a, ActivityState.DESTROYED); - } - }); - mActivities.clear(); - } - /** * Test that a single {@link Activity} can request a {@link TabModelSelector}. */
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeLocalizationUtilsTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeLocalizationUtilsTest.java new file mode 100644 index 0000000..c605bbb1 --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeLocalizationUtilsTest.java
@@ -0,0 +1,111 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +import org.chromium.base.test.BaseRobolectricTestRunner; + +/** + * Tests for {@link ChromeLocalizationUtils}. + */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class ChromeLocalizationUtilsTest { + /** + * Test the return value for getUiAvailabilityStatus. + */ + @Test + public void testGetUiAvailabilityStatus() { + // The boolean flags in order are: isOverridden, isTopAndroidLanguageAvailable, + // isDefaultLanguage + @ChromeLocalizationUtils.UiAvailableTypes + int status = ChromeLocalizationUtils.getUiAvailabilityStatus(true, false, false); + Assert.assertEquals(status, ChromeLocalizationUtils.UiAvailableTypes.OVERRIDDEN); + + status = ChromeLocalizationUtils.getUiAvailabilityStatus(true, false, true); + Assert.assertEquals(status, ChromeLocalizationUtils.UiAvailableTypes.OVERRIDDEN); + + status = ChromeLocalizationUtils.getUiAvailabilityStatus(false, false, false); + Assert.assertEquals(status, ChromeLocalizationUtils.UiAvailableTypes.NONE_AVAILABLE); + + status = ChromeLocalizationUtils.getUiAvailabilityStatus(false, false, true); + Assert.assertEquals( + status, ChromeLocalizationUtils.UiAvailableTypes.ONLY_DEFAULT_AVAILABLE); + + status = ChromeLocalizationUtils.getUiAvailabilityStatus(false, true, true); + Assert.assertEquals(status, ChromeLocalizationUtils.UiAvailableTypes.TOP_AVAILABLE); + + // If top is available it shouldn't mater what if default is available. + status = ChromeLocalizationUtils.getUiAvailabilityStatus(false, true, false); + Assert.assertEquals(status, ChromeLocalizationUtils.UiAvailableTypes.TOP_AVAILABLE); + } + + /** + * Test the return value for getUiCorrectnessStatus + */ + @Test + public void testGetUiCorrectnessStatus() { + // The boolean flags in order are: noLanguageAvailable, isJavaUiCorrect, isNativeUiCorrect + @ChromeLocalizationUtils.UiCorrectTypes + int status = ChromeLocalizationUtils.getUiCorrectnessStatus(true, false, false); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.NOT_AVAILABLE); + + status = ChromeLocalizationUtils.getUiCorrectnessStatus(true, true, false); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.NOT_AVAILABLE); + + status = ChromeLocalizationUtils.getUiCorrectnessStatus(false, false, false); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.INCORRECT); + + status = ChromeLocalizationUtils.getUiCorrectnessStatus(false, true, false); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.ONLY_JAVA_CORRECT); + + status = ChromeLocalizationUtils.getUiCorrectnessStatus(false, true, true); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.CORRECT); + } + + /** + * Test the return value for getNoOverrideUiCorrectStatus + */ + @Test + public void testGetNoOverrideUiCorrectStatus() { + // The boolean flags in order are: noLanguageAvailable, isCorrect + @ChromeLocalizationUtils.UiCorrectTypes + int status = ChromeLocalizationUtils.getNoOverrideUiCorrectStatus(true, false); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.NOT_AVAILABLE); + + status = ChromeLocalizationUtils.getNoOverrideUiCorrectStatus(true, true); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.NOT_AVAILABLE); + + status = ChromeLocalizationUtils.getNoOverrideUiCorrectStatus(false, true); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.CORRECT); + + status = ChromeLocalizationUtils.getNoOverrideUiCorrectStatus(false, false); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.INCORRECT); + } + + /** + * Test the return value for getOverrideUiCorrectStatus + */ + @Test + public void testGetOverrideUiCorrectStatus() { + // The boolean flags in order are: isJavaUiCorrect, isNativeUiCorrect + @ChromeLocalizationUtils.UiCorrectTypes + int status = ChromeLocalizationUtils.getOverrideUiCorrectStatus(true, true); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.CORRECT); + + status = ChromeLocalizationUtils.getOverrideUiCorrectStatus(true, false); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.ONLY_JAVA_CORRECT); + + status = ChromeLocalizationUtils.getOverrideUiCorrectStatus(false, false); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.INCORRECT); + + status = ChromeLocalizationUtils.getOverrideUiCorrectStatus(false, true); + Assert.assertEquals(status, ChromeLocalizationUtils.UiCorrectTypes.INCORRECT); + } +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabUnitTest.java index c475167..03413e3 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabUnitTest.java
@@ -78,7 +78,7 @@ doReturn(mContext).when(mWeakReferenceContext).get(); doReturn(mContext).when(mContext).getApplicationContext(); - mTab = new TabImpl(TAB1_ID, null, false, null); + mTab = new TabImpl(TAB1_ID, false, null, null); mTab.addObserver(mObserver); CriticalPersistedTabData.from(mTab).addObserver(mCriticalPersistedTabDataObserver); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java index 063c956..503465a8 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java
@@ -13,6 +13,7 @@ import static org.mockito.Mockito.verify; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.BUTTONS_CLICKABLE; +import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.HOME_BUTTON_IS_VISIBLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_AT_START; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_CLICK_HANDLER; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_DESCRIPTION; @@ -693,14 +694,48 @@ assertEquals(mPropertyModel.get(IS_VISIBLE), true); } + @Test + public void testShowHomeButtonInTabSwitcher() { + createMediator(false, false, true); + mMediator.setTabModelSelector(mTabModelSelector); + doReturn(0).when(mIncognitoTabModel).getCount(); + mMediator.onNativeLibraryReady(); + verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); + assertEquals(mPropertyModel.get(HOME_BUTTON_IS_VISIBLE), false); + + mMediator.setStartSurfaceMode(true); + mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); + mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); + mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); + assertEquals(mPropertyModel.get(HOME_BUTTON_IS_VISIBLE), false); + + mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); + mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); + mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); + assertEquals(mPropertyModel.get(HOME_BUTTON_IS_VISIBLE), true); + + mMediator.setShowHomeButtonOnTabSwitcherForTesting(false); + mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); + mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); + mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); + assertEquals(mPropertyModel.get(HOME_BUTTON_IS_VISIBLE), false); + } + private void createMediator( boolean hideIncognitoSwitchWhenNoTabs, boolean hideIncognitoSwitchOnHomePage) { + createMediator(hideIncognitoSwitchWhenNoTabs, hideIncognitoSwitchOnHomePage, false); + } + + private void createMediator(boolean hideIncognitoSwitchWhenNoTabs, + boolean hideIncognitoSwitchOnHomePage, boolean showHomeButtonOnTabSwitcher) { mMediator = new StartSurfaceToolbarMediator(mPropertyModel, mMockCallback, hideIncognitoSwitchWhenNoTabs, hideIncognitoSwitchOnHomePage, - mMenuButtonCoordinator, mIdentityDiscStateSupplier, + showHomeButtonOnTabSwitcher, mMenuButtonCoordinator, mIdentityDiscStateSupplier, () -> mIdentityDiscController.getForStartSurface( - mMediator.getOverviewModeStateForTesting())); + mMediator.getOverviewModeStateForTesting()), + new ObservableSupplierImpl<>(), new ObservableSupplierImpl<>(), null); mMediator.setLayoutStateProvider(mLayoutStateProvider); verify(mLayoutStateProvider).addObserver(mLayoutStateObserverCaptor.capture());
diff --git a/chrome/android/static_initializers.gni b/chrome/android/static_initializers.gni index fe7d7a10..1159113 100644 --- a/chrome/android/static_initializers.gni +++ b/chrome/android/static_initializers.gni
@@ -16,6 +16,7 @@ # Currently static_initializers come from: # * base_logging.cc # * iostream.cpp + # * token.cc if (target_cpu == "arm" || target_cpu == "arm64") { expected_static_initializer_count = 3 @@ -26,4 +27,4 @@ expected_static_initializer_count += 2 } } -} +} \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 4d1b2f5d..5b86f21 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Verkry toegang tot jou Bluetooth- en serietoestelle</translation> <translation id="114036956334641753">Oudio en onderskrifte</translation> <translation id="1140746652461896221">Blokkeer inhoud op enige bladsy wat jy besoek</translation> +<translation id="1141953877381847186">Laat Assistent toe om inligting op die skerm te gebruik om kitsantwoorde te verskaf, soos vertaling, definisie, eenheidomskakeling en meer. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Hou in gedagte:<ph name="END_BOLD" /> Jy kan dit altyd later in Google Assistent-instellings > Verwante inligting verander.</translation> <translation id="1143142264369994168">Sertifikaatondertekenaar</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome het nie enige skadelike sagteware op jou rekenaar gekry nie • 1 minuut gelede nagegaan}other{Chrome het nie enige skadelike sagteware op jou rekenaar gekry nie • {NUM_MINS} minute gelede nagegaan}}</translation> <translation id="1145593918056169051">Drukker het gestop</translation> @@ -1436,7 +1439,9 @@ <translation id="2594999711683503743">Deursoek Google of tik URL in</translation> <translation id="2602501489742255173">Swiep op om te begin</translation> <translation id="2603115962224169880">Maak rekenaar skoon</translation> +<translation id="2603355571917519942">Voice Match is gereed</translation> <translation id="2603463522847370204">Maak in incognitovenster oop</translation> +<translation id="2604138917550693049">Soek prent met Google Lens</translation> <translation id="2604255671529671813">Netwerkverbinding-fout</translation> <translation id="2606246518223360146">Koppel data</translation> <translation id="2606454609872547359">Nee, gaan voort sonder ChromeVox</translation> @@ -1779,6 +1784,7 @@ <translation id="2963151496262057773">Die volgende inprop reageer nie: <ph name="PLUGIN_NAME" />Wil jy dit stop?</translation> <translation id="2964193600955408481">Deaktiveer Wi-Fi</translation> <translation id="2964245677645334031">Nabydeling: sigbaarheid</translation> +<translation id="2966216232069818096">Laat jou Assistent inligting op jou skerm gebruik om te help</translation> <translation id="2966937470348689686">Bestuur Android-voorkeure</translation> <translation id="2972581237482394796">Herdoen</translation> <translation id="2973324205039581528">Demp werf</translation> @@ -1875,6 +1881,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Hierdie oortjie gebruik tans jou kamera of mikrofoon.</translation> <translation id="3083193146044397360">Tydelik geblokkeer om jou sekuriteit te beskerm</translation> +<translation id="3083899879156272923">Beweeg skerm maar hou muis in die middel van die skerm</translation> <translation id="3084548735795614657">Laat val om te installeer</translation> <translation id="3084771660770137092">Chrome het óf nie meer geheue nie óf die proses vir die webwerf is om een of ander rede gestop. Om voort te gaan, herlaai of gaan na 'n ander bladsy.</translation> <translation id="3084958266922136097">Deaktiveer sluimerskerm</translation> @@ -2370,6 +2377,9 @@ <translation id="3654045516529121250">Lees jou toeganklikheidinstellings</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Dit het permanente toegang tot een lêer.}other{Dit het permanente toegang tot # lêers.}}</translation> <translation id="3658871634334445293">TrackPoint-versnelling</translation> +<translation id="3659830472545192450">Voice Match help jou Google Assistent om jou stem op jou Chromebook te identifiseer en jou van ander mense te onderskei. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Hou in gedagte:<ph name="END_BOLD" /> 'n Soortgelyke stem of opname sal dalk ook toegang tot jou persoonlike resultate kan kry. Jy kan Voice Match-toestemming later verwyder deur dit in Assistent-instellings af te skakel.</translation> <translation id="3660234220361471169">Onvertroude</translation> <translation id="3664511988987167893">Uitbreidingikoon</translation> <translation id="3665589677786828986">Chrome het bespeur dat sommige van jou instellings deur 'n ander program korrup gemaak is en het hulle na hul oorspronklike verstekwaardes teruggestel.</translation> @@ -2978,7 +2988,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> deel tans 'n venster.</translation> <translation id="4364830672918311045">Wys kennisgewings</translation> <translation id="4366138410738374926">Drukwerk het begin</translation> -<translation id="437004882363131692">Kry <ph name="DEVICE_TYPE" />-wenke, -aanbiedings en -opdaterings, en deel terugvoer. Teken enige tyd uit.</translation> <translation id="4370425812909262207">Mandjies is versteek. Hulle sal weer verskyn wanneer jy veranderinge aanbring.</translation> <translation id="4370975561335139969">Die e-posadres en wagwoord wat jy ingevoer het, pas nie</translation> <translation id="4374831787438678295">Linux-installeerder</translation> @@ -3558,6 +3567,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Speltoets word nie gesteun vir die tale wat jy gekies het nie</translation> <translation id="5052499409147950210">Redigeer werf</translation> +<translation id="5053962746715621840">Soek prent met Google Lens</translation> <translation id="5057110919553308744">Wanneer jy die uitbreiding klik</translation> <translation id="5057403786441168405">Bestuur jou aangemelde rekeninge. Webwerwe, programme en uitbreidings in Chrome en Google Play kan hierdie rekeninge gebruik om jou ervaring te pasmaak, na gelang van jou toestemmings. <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Beperk aanmelding</translation> @@ -4041,6 +4051,9 @@ <translation id="5610038042047936818">Wissel na kameramodus</translation> <translation id="561030196642865721">Derdeparty-webkoekies word op hierdie werf toegelaat</translation> <translation id="5612734644261457353">Jammer, jou wagwoord kon steeds nie geverifieer word nie. Let wel: as jy jou wagwoord onlangs verander het, sal jou nuwe wagwoord van toepassing wees sodra jy afmeld. Gebruik die ou wagwoord hier.</translation> +<translation id="561308544008485315">Voice Match help jou Google Assistent om jou stem op jou Chromebook te identifiseer en jou van ander mense te onderskei. Om batterykrag te bespaar, is "Ok Google" slegs aan wanneer jou toestel aan 'n kragbron gekoppel is. Gaan na Instellings om veranderinge te maak. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Hou in gedagte:<ph name="END_BOLD" /> 'n Soortgelyke stem of opname sal dalk ook toegang tot jou persoonlike resultate kan kry. Jy kan Voice Match-toestemming later verwyder deur dit in Assistent-instellings af te skakel.</translation> <translation id="5614190747811328134">Gebruikerkennisgewing</translation> <translation id="5614553682702429503">Stoor wagwoord?</translation> <translation id="5616726534702877126">Reserveer grootte</translation> @@ -5072,6 +5085,7 @@ <translation id="6824584962142919697">&Ondersoek elemente</translation> <translation id="6825184156888454064">Sorteer volgens naam</translation> <translation id="6826872289184051766">Verifieer deur USB</translation> +<translation id="6827604573767207488">Dit lyk of jy gepersonaliseerde Assistent reeds op 'n ander toestel opgestel het. Benut jou Assistent selfs meer deur die volgende instelling aan te skakel.</translation> <translation id="6828153365543658583">Beperk aanmelding tot die volgende gebruikers:</translation> <translation id="6828182567531805778">Voer jou wagfrase in om jou data te sinkroniseer</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5507,6 +5521,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> het ADB-ontfouting gedeaktiveer. Jy sal nie programme direk kan laai nadat jy jou <ph name="DEVICE_TYPE" /> herbegin het nie.</translation> <translation id="7328867076235380839">Ongeldige kombinasie</translation> <translation id="7329154610228416156">Kon nie aanmeld nie omdat dit opgestel is om 'n onveilige URL (<ph name="BLOCKED_URL" />) te gebruik. Kontak jou administrateur.</translation> +<translation id="7329932885428707942">Dit kan veroorsaak dat die selnetwerk momenteel ontkoppel word.</translation> <translation id="7332053360324989309">Toegewyde werker: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Aktiveer gedokte vergrootglas</translation> <translation id="7335974957018254119">Gebruik speltoets vir</translation> @@ -5550,6 +5565,7 @@ <translation id="7374376573160927383">Bestuur USB-toestelle</translation> <translation id="7375235221357833624">{0,plural, =1{Dateer toestel binne 'n uur op}other{Dateer toestel binne # uur op}}</translation> <translation id="7376553024552204454">Lig die muismerker uit wanneer dit beweeg</translation> +<translation id="737728204345822099">'n Rekord van jou besoek aan hierdie werf kan op jou sekuriteitsleutel gehou word.</translation> <translation id="7377451353532943397">Hou aan om sensortoegang te blokkeer</translation> <translation id="7378611153938412599">Swak wagwoorde is maklik om te raai. Maak seker dat jy sterk wagwoorde skep. <ph name="BEGIN_LINK" />Sien meer sekuriteitswenke.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Maak Chrome Webwinkel oop</translation> @@ -6176,6 +6192,7 @@ <translation id="8059417245945632445">Ondersoek toestelle</translation> <translation id="8059456211585183827">Daar is nie enige drukkers beskikbaar om te stoor nie.</translation> <translation id="8061091456562007989">Verander dit terug</translation> +<translation id="8061991877177392872">Dit lyk of jy Voice Match met jou Assistent op 'n ander toestel opgestel het. Hierdie vorige opnames is gebruik om 'n stemmodel op hierdie toestel te maak.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 vel papier}other{{COUNT} velle papier}}</translation> <translation id="8062879968880283306">Skandeer QR-kode met toestelkamera of voer die aktiveringkode in wat jou diensverskaffer verskaf het.</translation> <translation id="8063235345342641131">Verstek- groen avatar</translation> @@ -6447,6 +6464,7 @@ <translation id="8379991678458444070">Boekmerk hierdie oortjie om vinnig terug te kom hierheen</translation> <translation id="8382913212082956454">Kopieer e-posadres</translation> <translation id="8386091599636877289">Kon nie beleid kry nie.</translation> +<translation id="8386819192691131213">Laat Assistent toe om inligting op die skerm te gebruik om kitsantwoorde te verskaf, soos vertaling, definisie, eenheidomskakeling en meer</translation> <translation id="8386903983509584791">Skandering voltooi</translation> <translation id="8387361103813440603">Mag nie jou ligging sien nie</translation> <translation id="8389264703141926739">Blokkeer kennisgewings</translation> @@ -6929,6 +6947,7 @@ <translation id="8915370057835397490">Laai tans voorstel</translation> <translation id="8916476537757519021">Incognitosubraam: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> se <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">Beweeg skerm wanneer muis aan kante van skerm raak</translation> <translation id="8923880975836399332">Donkergroenblou</translation> <translation id="8925458182817574960">Instellings</translation> <translation id="8926389886865778422">Moenie weer vra nie</translation> @@ -7007,6 +7026,7 @@ <translation id="9009708085379296446">Het jy bedoel om hierdie bladsy te verander?</translation> <translation id="9011163749350026987">Wys ikoon altyd</translation> <translation id="9011393886518328654">Vrystellingsnotas</translation> +<translation id="9012122671773859802">Beweeg skerm aanhoudend wanneer muis beweeg</translation> <translation id="9013037634206938463"><ph name="INSTALL_SIZE" /> se beskikbare spasie is nodig om Linux te installeer. Vee lêers op jou toestel uit om meer spasie beskikbaar te maak.</translation> <translation id="9013707997379828817">Jou administrateur het hierdie toestel teruggerol. Stoor asseblief belangrike lêers en herbegin dan. Alle data op die toestel sal uitgevee word.</translation> <translation id="901668144954885282">Rugsteun in Google Drive</translation> @@ -7051,6 +7071,7 @@ <translation id="9052404922357793350">Hou aan blokkeer</translation> <translation id="9053563360605707198">Druk op albei kante</translation> <translation id="9053893665344928494">Onthou my keuse</translation> +<translation id="9055278955535611574">Kry toegang tot jou Assistent met "Ok Google"</translation> <translation id="9055636786322918818">Laat RC4-enkripsie toe. As jy hierdie opsie gebruik, verhoog dit jou risiko aangesien die RC4-syfers onveilig is.</translation> <translation id="9056810968620647706">Geen passings is gevind nie.</translation> <translation id="9057354806206861646">Opdateringskedule</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 2384cdc..20f3ca6 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -2976,7 +2976,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> አንድ መስኮት እያጋራ ነው።</translation> <translation id="4364830672918311045">ማሳወቂያዎችን አሳይ</translation> <translation id="4366138410738374926">ማተም ተጀምሯል</translation> -<translation id="437004882363131692">የ<ph name="DEVICE_TYPE" /> ጠቃሚ ምክሮችን፣ ቅናሾችን እና ዝማኔዎችን ያግኙ፣ እና ግብረመልስ ያጋሩ። በማንኛውም ጊዜ ከደንበኝነት ምዝገባ ይውጡ።</translation> <translation id="4370425812909262207">ተሳቢዎች ተደብቀዋል። እርስዎ ለውጦችን ሲያደርጉ ዳግም ይታያሉ።</translation> <translation id="4370975561335139969">ያስገቧቸው ኢሜይል እና የይለፍ ቃል አይዛመዱም።</translation> <translation id="4374831787438678295">Linux ጫኚ</translation> @@ -5548,6 +5547,7 @@ <translation id="7374376573160927383">የዩኤስቢ መሣሪያዎችን ያቀናብሩ</translation> <translation id="7375235221357833624">{0,plural, =1{በአንድ ሰዓት ውስጥ መሣሪያን አዘምን}one{በ# ሰዓታት ውስጥ መሣሪያን አዘምን}other{በ# ሰዓታት ውስጥ መሣሪያን አዘምን}}</translation> <translation id="7376553024552204454">በሚንቀሳቀስበት ጊዜ የመዳፊት ጠቋሚን አድምቅ</translation> +<translation id="737728204345822099">ወደዚህ ጣቢያ ያደረጉት የጉብኝትዎ መዝገብ በደህንነት ቁልፍዎ ላይ ሊቀመጥ ይችላል።</translation> <translation id="7377451353532943397">የዳሳሽ መዳረሻን ማገዱን ቀጥል</translation> <translation id="7378611153938412599">ደካማ የይለፍ ቃላት ለመገመት ቀላል ናቸው። ጠንካራ የይለፍ ቃላትን እየፈጠሩ መሆንዎን ያረጋግጡ። <ph name="BEGIN_LINK" />ተጨማሪ ጠቃሚ የደህንነት ምክሮችን ይመልከቱ።<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome የድር መደብርን ይክፈቱ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 6f1d9f5..b62cee7 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">الوصول إلى بلوتوث والأجهزة التسلسلية</translation> <translation id="114036956334641753">الصوت والترجمة</translation> <translation id="1140746652461896221">حظر المحتوى على أي صفحة تزورها</translation> +<translation id="1141953877381847186">يمكنك السماح لخدمة "مساعد Google" باستخدام المعلومات التي تظهر على الشاشة لتوفير إجابات سريعة، مثلاً كترجمة نص أو تقديم التعريف لمصطلح معيّن أو تحويل وحدات القياس أو غير ذلك. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ملاحظة:<ph name="END_BOLD" /> يمكنك لاحقًا تغيير هذا الخيار متى شئت من خلال الانتقال إلى إعدادات "مساعد Google" > معلومات ذات صلة.</translation> <translation id="1143142264369994168">الموقّع على الشهادات</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{لم يعثر متصفِّح Chrome على برامج ضارّة في جهاز الكمبيوتر • تم إجراء عملية التحقُّق قبل دقيقة واحدة.}zero{لم يعثر متصفِّح Chrome على برامج ضارّة في جهاز الكمبيوتر • تم إجراء عملية التحقُّق قبل {NUM_MINS} دقيقة.}two{لم يعثر متصفِّح Chrome على برامج ضارّة في جهاز الكمبيوتر • تم إجراء عملية التحقُّق قبل دقيقتَين ({NUM_MINS}).}few{لم يعثر متصفِّح Chrome على برامج ضارّة في جهاز الكمبيوتر • تم إجراء عملية التحقُّق قبل {NUM_MINS} دقائق.}many{لم يعثر متصفِّح Chrome على برامج ضارّة في جهاز الكمبيوتر • تم إجراء عملية التحقُّق قبل {NUM_MINS} دقيقة.}other{لم يعثر متصفِّح Chrome على برامج ضارّة في جهاز الكمبيوتر • تم إجراء عملية التحقُّق قبل {NUM_MINS} دقيقة.}}</translation> <translation id="1145593918056169051">توقفت الطابعة</translation> @@ -1436,7 +1439,9 @@ <translation id="2594999711683503743">البحث في Google أو كتابة عنوان URL</translation> <translation id="2602501489742255173">مرِّر سريعًا للأعلى للبدء.</translation> <translation id="2603115962224169880">إزالة البرامج الضارة من جهاز الكمبيوتر</translation> +<translation id="2603355571917519942">ميزة Voice Match جاهزة للاستخدام</translation> <translation id="2603463522847370204">فتح في نافذة &التصفح المتخفي</translation> +<translation id="2604138917550693049">البحث عن صورة باستخدام "عدسة Google"</translation> <translation id="2604255671529671813">خطأ في اتصال الشبكة</translation> <translation id="2606246518223360146">ربط البيانات</translation> <translation id="2606454609872547359">لا، المتابعة بدون ChromeVox</translation> @@ -1779,6 +1784,7 @@ <translation id="2963151496262057773">المكوّن الإضافي التالي غير مستجيب: <ph name="PLUGIN_NAME" />، هل تريد إيقافه؟</translation> <translation id="2964193600955408481">إيقاف Wi-Fi</translation> <translation id="2964245677645334031">إمكانية ظهور الجهاز الذي يستخدم ميزة "المشاركة عن قرب"</translation> +<translation id="2966216232069818096">السماح لخدمة "مساعد Google" باستخدام المعلومات التي تظهر على الشاشة لتقديم المساعدة</translation> <translation id="2966937470348689686">إدارة إعدادات Android المفضّلة</translation> <translation id="2972581237482394796">إعا&دة</translation> <translation id="2973324205039581528">تجاهل الموقع</translation> @@ -1874,6 +1880,7 @@ <translation id="308268297242056490">معرف موارد منتظم (URI)</translation> <translation id="3082780749197361769">تستخدم علامة التبويب هذه الكاميرا أو الميكروفون.</translation> <translation id="3083193146044397360">تم الحظر مؤقتًا لحماية أمانك</translation> +<translation id="3083899879156272923">تحريك الشاشة مع الإبقاء على مؤشر الماوس في منتصف الشاشة</translation> <translation id="3084548735795614657">إسقاط للتثبيت</translation> <translation id="3084771660770137092">ربما نفدت الذاكرة لدى Chrome أو تم إنهاء العملية لصفحة الويب لسبب آخر. للمتابعة، أعد التحميل أو انتقل إلى صفحة أخرى.</translation> <translation id="3084958266922136097">إيقاف شاشة التوقف</translation> @@ -2368,6 +2375,9 @@ <translation id="3654045516529121250">الاطّلاع على إعدادات إمكانية الوصول</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{لديه حق الوصول الدائم إلى ملف واحد.}zero{لديه حق الوصول الدائم إلى # من الملفات.}two{لديه حق الوصول الدائم إلى ملفين (#).}few{ لديه حق الوصول الدائم إلى # ملفات.}many{لديه حق الوصول الدائم إلى # ملفًا.}other{لديه حق الوصول الدائم إلى # من الملفات.}}</translation> <translation id="3658871634334445293">تسارع TrackPoint</translation> +<translation id="3659830472545192450">تتيح ميزة Voice Match لخدمة "مساعد Google" التعرّف على صوتك على Chromebook والتمييز بينك وبين الآخرين. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ملاحظة:<ph name="END_BOLD" /> يمكن الوصول إلى نتائجك الشخصية باستخدام صوت مشابه لصوتك أو تسجيل لصوتك. يمكنك إيقاف إذن Voice Match لاحقًا من خلال إعدادات "مساعد Google".</translation> <translation id="3660234220361471169">غير موثوق بها</translation> <translation id="3664511988987167893">رمز الإضافة</translation> <translation id="3665589677786828986">اكتشف Chrome أن بعض إعداداتك تم إتلافها من قبل برنامج آخر وإعادة تعيينها للحالة التلقائية الأصلية.</translation> @@ -2971,7 +2981,6 @@ <translation id="4364567974334641491">يشارك <ph name="APP_NAME" /> نافذة.</translation> <translation id="4364830672918311045">عرض الإشعارات</translation> <translation id="4366138410738374926">بدأت عملية الطباعة</translation> -<translation id="437004882363131692">يمكنك الحصول على آخر التحديثات والنصائح والعروض لجهاز <ph name="DEVICE_TYPE" /> ومشاركة التعليقات. ويمكنك إلغاء الاشتراك في أي وقت.</translation> <translation id="4370425812909262207">تم إخفاء سلات التسوّق، وستظهر من جديد عند إجرائك لأي تغييرات.</translation> <translation id="4370975561335139969">البريد الإلكتروني وكلمة المرور اللذان أدخلتهما غير متطابقين</translation> <translation id="4374831787438678295">أداة تثبيت Linux</translation> @@ -3548,6 +3557,7 @@ <translation id="5050330054928994520">تحويل النص إلى كلام (TTS)</translation> <translation id="5051836348807686060">لا تتوفر ميزة التدقيق الإملائي للغات التي اخترتها.</translation> <translation id="5052499409147950210">تعديل موقع إلكتروني</translation> +<translation id="5053962746715621840">البحث عن صورة باستخدام "عدسة Google"</translation> <translation id="5057110919553308744">عند النقر على "الإضافة"</translation> <translation id="5057403786441168405">يمكنك إدارة حساباتك التي سجّلت الدخول إليها. وبناءً على الأذونات، قد تستخدم المواقع الإلكترونية والتطبيقات والإضافات في Chrome وGoogle Play هذه الحسابات لتخصيص تجربتك. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> <translation id="5059241099014281248">حظر تسجيل الدخول على مستخدمين محددين</translation> @@ -4030,6 +4040,9 @@ <translation id="5610038042047936818">التبديل إلى وضع الكاميرا</translation> <translation id="561030196642865721">يسمح هذا الموقع الإلكتروني بملفات تعريف الارتباط التابعة لجهات خارجية.</translation> <translation id="5612734644261457353">عذرًا، لا يزال التحقق من كلمة المرور متعذرًا. ملاحظة: في حالة تغيير كلمة المرور مؤخرًا، فإنه سيتم تطبيق كلمة المرور بعد الخروج، يُرجى استخدام كلمة المرور القديمة هنا.</translation> +<translation id="561308544008485315">تتيح ميزة Voice Match لخدمة "مساعد Google" التعرّف على صوتك على Chromebook والتمييز بينك وبين الآخرين. لتوفير طاقة البطارية، لا يتم تفعيل الكلمة المفتاح "Ok Google" إلا عند اتصال جهازك بمصدر طاقة. ولإجراء تغييرات، يُرجى الانتقال إلى "الإعدادات". + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ملاحظة:<ph name="END_BOLD" /> يمكن الوصول إلى نتائجك الشخصية باستخدام صوت مشابه لصوتك أو تسجيل لصوتك. يمكنك إيقاف إذن Voice Match لاحقًا من خلال إعدادات "مساعد Google".</translation> <translation id="5614190747811328134">إشعار المستخدم</translation> <translation id="5614553682702429503">هل تريد حفظ كلمة المرور؟</translation> <translation id="5616726534702877126">حجز الحجم</translation> @@ -5053,6 +5066,7 @@ <translation id="6824584962142919697">وعناصر الفحص</translation> <translation id="6825184156888454064">تصنيف بحسب الاسم</translation> <translation id="6826872289184051766">التحقُّق عبر USB</translation> +<translation id="6827604573767207488">يبدو أنه سبق لك ضبط إعدادات مخصّصة في خدمة "مساعد Google" على جهاز آخر. يمكنك الاستفادة أكثر من خدمة "مساعد Google" من خلال تفعيل الإعداد التالي:</translation> <translation id="6828153365543658583">قصر تسجيل الدخول على المستخدمين التالين:</translation> <translation id="6828182567531805778">أدخِل عبارة المرور لمزامنة بياناتك.</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5487,6 +5501,7 @@ <translation id="7327989755579928735">أوقَف <ph name="MANAGER" /> إعداد "تصحيح الأخطاء عبر ADB". بعد إعادة تشغيل الجهاز <ph name="DEVICE_TYPE" />، لن تتمكّن من تثبيت تطبيقات من مصادر غير معروفة.</translation> <translation id="7328867076235380839">مجموعة غير صالحة</translation> <translation id="7329154610228416156">فشل تسجيل الدخول نظرًا لأنه قد تم ضبطه على استخدام عنوان URL غير آمن <ph name="BLOCKED_URL" />. يُرجى الاتصال بالمسؤول.</translation> +<translation id="7329932885428707942">يمكن أن يؤدي ذلك إلى قطع الاتصال بشبكة الجوّال لمدة قصيرة.</translation> <translation id="7332053360324989309">عامل مُخصّص: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">تفعيل المكبّر الذي تم إرساؤه</translation> <translation id="7335974957018254119">استخدام التدقيق الإملائي للّغة</translation> @@ -5530,6 +5545,7 @@ <translation id="7374376573160927383">إدارة أجهزة USB</translation> <translation id="7375235221357833624">{0,plural, =1{تحديث الجهاز خلال ساعة}zero{تحديث الجهاز خلال # ساعة}two{تحديث الجهاز خلال ساعتَين}few{تحديث الجهاز خلال # ساعات}many{تحديث الجهاز خلال # ساعة}other{تحديث الجهاز خلال # ساعة}}</translation> <translation id="7376553024552204454">تمييز مؤشر الماوس عندما يتحرك</translation> +<translation id="737728204345822099">قد يتم حفظ سجلّ زيارتك لهذا الموقع الإلكتروني في مفتاح الأمان.</translation> <translation id="7377451353532943397">مواصلة حظر إمكانية الوصول إلى أجهزة الاستشعار</translation> <translation id="7378611153938412599">من السهل تخمين كلمات المرور الضعيفة. يُرجى الحرص على إنشاء كلمات مرور قوية. <ph name="BEGIN_LINK" />الاطّلاع على مزيد من نصائح الأمان<ph name="END_LINK" /></translation> <translation id="73786666777299047">فتح سوق Chrome الإلكتروني</translation> @@ -6156,6 +6172,7 @@ <translation id="8059417245945632445">&فحص الأجهزة</translation> <translation id="8059456211585183827">لا تتوفّر أي طابعات للحفظ.</translation> <translation id="8061091456562007989">العودة إلى الإعدادات السابقة</translation> +<translation id="8061991877177392872">يبدو أنه سبق لك إعداد ميزة Voice Match في خدمة "مساعد Google" على جهاز آخر. أمّا بالنسبة إلى التسجيلات الصوتية السابقة، فقد تم استخدامها لإنشاء نموذج صوتي على هذا الجهاز.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{ورقة واحدة}zero{{COUNT} ورقة}two{ورقتان ({COUNT})}few{{COUNT} أوراق}many{{COUNT} ورقة}other{{COUNT} ورقة}}</translation> <translation id="8062879968880283306">يمكنك مسح رمز الاستجابة السريعة ضوئيًا باستخدام كاميرا الجهاز أو إدخال رمز التفعيل المُقدَّم من مشغِّل شبكة الجوّال.</translation> <translation id="8063235345342641131">الصورة الرمزية التلقائية الخضراء</translation> @@ -6425,6 +6442,7 @@ <translation id="8379991678458444070">يمكنك الرجوع إلى هنا بسرعة من خلال وضع إشارة مرجعية على علامة التبويب هذه.</translation> <translation id="8382913212082956454">نسخ عنوان البريد الإل&كتروني</translation> <translation id="8386091599636877289">تعذَّر العثور على السياسة.</translation> +<translation id="8386819192691131213">يمكنك السماح لخدمة "مساعد Google" باستخدام المعلومات التي تظهر على الشاشة لتوفير إجابات سريعة، مثلاً كترجمة نص أو تقديم التعريف لمصطلح معين أو تحويل وحدات القياس أو غير ذلك.</translation> <translation id="8386903983509584791">اكتملت عملية الفحص.</translation> <translation id="8387361103813440603">المواقع الإلكترونية التي لا يُسمح لها بالاطّلاع على موقعك الجغرافي</translation> <translation id="8389264703141926739">حظر الإشعارات</translation> @@ -6906,6 +6924,7 @@ <translation id="8915370057835397490">جارٍ تحميل الاقتراح</translation> <translation id="8916476537757519021">الإطار الفرعي للتصفح المتخفي: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138">جهاز <ph name="DEVICE_TYPE" /> الخاص بـ <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">تحريك الشاشة عند وصول مؤشر الماوس إلى حواف الشاشة</translation> <translation id="8923880975836399332">أزرق مخضر داكن</translation> <translation id="8925458182817574960">&الإعدادات</translation> <translation id="8926389886865778422">عدم السؤال مرة أخرى</translation> @@ -6983,6 +7002,7 @@ <translation id="9009708085379296446">هل كنت تقصد تغيير هذه الصفحة؟</translation> <translation id="9011163749350026987">إظهار الرمز دائمًا</translation> <translation id="9011393886518328654">ملاحظات الإصدار</translation> +<translation id="9012122671773859802">تحريك الشاشة باستمرار حسب حركة مؤشر الماوس</translation> <translation id="9013037634206938463">يجب توفير <ph name="INSTALL_SIZE" /> على الأقل من المساحة الخالية لتثبيت نظام التشغيل Linux. ولزيادة المساحة الخالية، يجب حذف ملفات من جهازك.</translation> <translation id="9013707997379828817">أعاد المشرف النسخة السابقة من نظام التشغيل Chrome إلى هذا الجهاز. يُرجى حفظ الملفات المهمة، ثم إعادة التشغيل. وسيتم حذف جميع البيانات المتاحة على الجهاز.</translation> <translation id="901668144954885282">الاحتفاظ بنسخة احتياطية في Google Drive</translation> @@ -7027,6 +7047,7 @@ <translation id="9052404922357793350">متابعة الحظر</translation> <translation id="9053563360605707198">الطباعة على كلا الجانبين</translation> <translation id="9053893665344928494">تذكَّر اختياري</translation> +<translation id="9055278955535611574">الوصول إلى "مساعد Google" من خلال قول الكلمة المفتاح OK Google</translation> <translation id="9055636786322918818">فرض ترميز RC4: يؤدي استخدام هذا الخيار إلى زيادة المخاطر، لأن رموز RC4 غير آمنة.</translation> <translation id="9056810968620647706">لم يتم العثور على نتائج مطابقة.</translation> <translation id="9057354806206861646">تعديل الجدول الزمني</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 7b6e8dd..4e12b5c 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">আপোনাৰ ব্লুটুথ আৰু ছিৰিয়েল ডিভাইচসমূহত এক্সেছ পায়</translation> <translation id="114036956334641753">অডিঅ' আৰু কেপশ্বনসমূহ</translation> <translation id="1140746652461896221">আপুনি চোৱা যিকোনো পৃষ্ঠাত এই সমল অৱৰোধ কৰক</translation> +<translation id="1141953877381847186">অনুবাদ কৰা, সংজ্ঞা প্ৰদান কৰা, একক ৰূপান্তৰ কৰা আদিৰ দৰে বহুতো কামৰ ক্ষেত্ৰত ক্ষিপ্ৰ উত্তৰ দিবলৈ Assistantক স্ক্ৰীনত থকা তথ্য ব্যৱহাৰ কৰিবলৈ অনুমতি দিয়ক। + <ph name="BR" /> + <ph name="BEGIN_BOLD" />মনত ৰাখিব:<ph name="END_BOLD" /> আপুনি পাছত যিকোনো সময়তে Google Assistantৰ ছেটিং > সম্পৰ্কিত তথ্যলৈ গৈ এয়া সলনি কৰিব পাৰে।</translation> <translation id="1143142264369994168">প্ৰমাণপত্ৰ স্বাক্ষৰ কৰোঁতা</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chromeএ আপোনাৰ কম্পিউটাৰত কোনো ক্ষতিকাৰক ছফ্টৱেৰ বিচাৰি নাপালে • ১ মিনিটৰ পূৰ্বে পৰীক্ষা কৰিছে}one{Chromeএ আপোনাৰ কম্পিউটাৰত কোনো ক্ষতিকাৰক ছফ্টৱেৰ বিচাৰি নাপালে • {NUM_MINS} মিনিটৰ পূৰ্বে পৰীক্ষা কৰিছে}other{Chromeএ আপোনাৰ কম্পিউটাৰত কোনো ক্ষতিকাৰক ছফ্টৱেৰ বিচাৰি নাপালে • {NUM_MINS} মিনিটৰ পূৰ্বে পৰীক্ষা কৰিছে}}</translation> <translation id="1145593918056169051">প্ৰিণ্টাৰটো বন্ধ হৈছে</translation> @@ -1429,7 +1432,9 @@ <translation id="2594999711683503743">Googleত সন্ধান কৰক বা URL টাইপ কৰক</translation> <translation id="2602501489742255173">আৰম্ভ কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰক</translation> <translation id="2603115962224169880">কম্পিউটাৰৰ ডেটা মচক</translation> +<translation id="2603355571917519942">Voice Match সুবিধাটো সাজু আছে</translation> <translation id="2603463522847370204">&ইনক’গনিট’ ৱিণ্ড’ত খোলক</translation> +<translation id="2604138917550693049">Google Lensৰ জৰিয়তে প্ৰতিচ্ছবিৰ সন্ধান কৰক</translation> <translation id="2604255671529671813">নেটৱৰ্ক সংযোগ সম্পর্কীয় আসোঁৱাহ</translation> <translation id="2606246518223360146">ডেটা লিংক কৰক</translation> <translation id="2606454609872547359">নহয়, ChromeVoxৰ অবিহনে অব্যাহত ৰাখক</translation> @@ -1771,6 +1776,7 @@ <translation id="2963151496262057773">এই প্লাগইনে সঁহাৰি জনোৱা নাই: <ph name="PLUGIN_NAME" /> আপুনি এইটো বন্ধ কৰিব খোজেনে?</translation> <translation id="2964193600955408481">ৱাই-ফাই অক্ষম কৰক</translation> <translation id="2964245677645334031">Nearby Shareৰ দৃশ্যমানতাৰ ছেটিং</translation> +<translation id="2966216232069818096">সহায় কৰিবলৈ Assistantক আপোনাৰ স্ক্ৰীনত থকা তথ্য ব্যৱহাৰ কৰিবলৈ দিয়ক</translation> <translation id="2966937470348689686">Android বিষয়ক অগ্ৰাধিকাৰ পৰিচালনা কৰক</translation> <translation id="2972581237482394796">&ৰিডু কৰক</translation> <translation id="2973324205039581528">ছাইট মিউট কৰক</translation> @@ -1866,6 +1872,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">এই টেবে আপোনাৰ কেমেৰা আৰু মাইক্ৰ’ফ’ন ব্যৱহাৰ কৰি আছে।</translation> <translation id="3083193146044397360">আপোনাৰ সুৰক্ষাৰ বাবে অস্থায়ীভাৱে অৱৰোধ কৰা হৈছে</translation> +<translation id="3083899879156272923">মাউছটো স্ক্ৰীনখনৰ ঠিক মাজত ৰাখি স্ক্ৰীনখন লৰচৰ কৰক</translation> <translation id="3084548735795614657">ইনষ্টল কৰিবলৈ ড্ৰপ কৰক</translation> <translation id="3084771660770137092">হয়তো Chromeত মেম’ৰী শেষ হৈছে বা ৱেবপৃষ্ঠাটোৰ প্ৰক্ৰিয়া আন কিবা কাৰণত বন্ধ হৈছে। অব্যাহত ৰাখিবলৈ পৃষ্ঠাটো পুনৰ ল’ড কৰক বা অন্য পৃষ্ঠালৈ যাওক।</translation> <translation id="3084958266922136097">স্ক্ৰীন ছেভাৰ অক্ষম কৰক</translation> @@ -2359,6 +2366,9 @@ <translation id="3654045516529121250">আপোনাৰ সাধ্য সুবিধাৰ ছেটিংসমূহ পঢ়ক</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{এইটোৰ ১টা ফাইললৈ স্থায়ী এক্সেছ আছে।}one{এইটোৰ #টা ফাইললৈ স্থায়ী এক্সেছ আছে।}other{এইটোৰ #টা ফাইললৈ স্থায়ী এক্সেছ আছে।}}</translation> <translation id="3658871634334445293">TrackPointৰ এক্সিলাৰেশ্বন</translation> +<translation id="3659830472545192450">Voice Matchএ আপোনাৰ Google Assistantক আপোনাৰ Chromebookত আপোনাৰ কণ্ঠধ্বনি চিনাক্ত কৰা আৰু অন্য লোকসকলৰ পৰা পৃথক হিচাপে আপোনাক চিনাক্ত কৰাত সহায় কৰে। + <ph name="BR" /> + <ph name="BEGIN_BOLD" />মনত ৰাখিব:<ph name="END_BOLD" /> একেধৰণৰ কোনো কণ্ঠধ্বনি অথবা ৰেকৰ্ডিঙেও আপোনাৰ ব্যক্তিগত ফলাফল এক্সেছ কৰিবলৈ সক্ষম হ’ব পাৰে। আপুনি পাছত Assistantৰ ছেটিঙত সেইটো অফ কৰি Voice Match সুবিধাটোৰ অনুমতি আঁতৰাব পাৰে।</translation> <translation id="3660234220361471169">অবিশ্বাসী হিচাপে চিহ্নিত</translation> <translation id="3664511988987167893">এক্সটেনশ্বন আইকন</translation> <translation id="3665589677786828986">Chromeএ আপোনাৰ ডিভাইচৰ কিছুমান ছেটিং অন্য এটা প্ৰ’গ্ৰেমে বিকল কৰিছে বুলি ধৰা পেলাইছে আৰু সেইসমূহ প্ৰকৃত ডিফ’ল্টলৈ ৰিছেট কৰিছে।</translation> @@ -2962,7 +2972,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" />এ এখন ৱিণ্ড' শ্বেয়াৰ কৰি আছে।</translation> <translation id="4364830672918311045">জাননী দেখুওৱা</translation> <translation id="4366138410738374926">প্ৰিণ্ট কৰা আৰম্ভ হৈছে</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" />ৰ বিষয়ে পৰামৰ্শ, অফাৰ আৰু আপডে’টসমূহ পাওক আৰু মতামত শ্বেয়াৰ কৰক। যিকোনো সময়তে আনছাবস্ক্ৰাইব কৰক।</translation> <translation id="4370425812909262207">কাৰ্ট লুকুওৱা হ'ল। আপুনি সালসলনি কৰিলে সেয়া পুনৰ প্ৰদৰ্শিত হ'ব।</translation> <translation id="4370975561335139969">আপুনি দিয়া ইমেইল আৰু পাছৱৰ্ড মিলা নাই</translation> <translation id="4374831787438678295">Linux ইনষ্টলাৰ</translation> @@ -3538,6 +3547,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">আপুনি বাছনি কৰা ভাষাৰ ক্ষেত্ৰত বানান পৰীক্ষক সমৰ্থিত নহয়</translation> <translation id="5052499409147950210">ছাইট সম্পাদনা কৰক</translation> +<translation id="5053962746715621840">Google Lensৰ জৰিয়তে প্ৰতিচ্ছবিৰ সন্ধান কৰক</translation> <translation id="5057110919553308744">যেতিয়া আপুনি এক্সটেনশ্বনটো ক্লিক কৰে</translation> <translation id="5057403786441168405">আপুনি ছাইন ইন কৰি থোৱা একাউণ্টসমূহ পৰিচালনা কৰক। Chrome আৰু Google Playৰ ৱেবছাইট, এপ্ আৰু এক্সটেনশ্বনসমূহে অনুমতি সাপেক্ষে আপোনাৰ অভিজ্ঞতা কাষ্টমাইজ কৰিবলৈ এই একাউণ্টসমূহ ব্যৱহাৰ কৰিব পাৰে। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="5059241099014281248">ছাইন ইন সীমাবদ্ধ কৰক</translation> @@ -4019,6 +4029,9 @@ <translation id="5610038042047936818">কেমেৰা ম’ডলৈ সলনি কৰক</translation> <translation id="561030196642865721">এই ছাইটটোত তৃতীয় পক্ষৰ কুকীসমূহক অনুমতি দিয়া হৈছে</translation> <translation id="5612734644261457353">আমি দুঃখিত, আপোনাৰ পাছৱর্ড তথাপিও সত্যাপন কৰিব পৰা নগ’ল। টোকা: যদি আপুনি অলপতে আপোনাৰ পাছৱৰ্ডটো সলনি কৰিছিল তেন্তে আপুনি ছাইন আউট কৰাৰ পিছত নতুন পাছৱৰ্ডটো প্ৰযোজ্য হ‘ব। অনুগ্ৰহ কৰি ইয়াত পুৰণা পাছৱৰ্ডটো ব্যৱহাৰ কৰক।</translation> +<translation id="561308544008485315">Voice Matchএ আপোনাৰ Google Assistantক আপোনাৰ Chromebookত আপোনাৰ কণ্ঠধ্বনি চিনাক্ত কৰা আৰু অন্য লোকসকলৰ পৰা পৃথক হিচাপে আপোনাক চিনাক্ত কৰাত সহায় কৰে। বেটাৰী ৰাহি কৰিবলৈ “Hey Google” সুবিধাটো আপোনাৰ ডিভাইচটো কোনো পাৱাৰ উৎসৰ সৈতে সংযুক্ত হ’লেহে অন হয়। সলনি কৰিবলৈ ছেটিঙলৈ যাওক। + <ph name="BR" /> + <ph name="BEGIN_BOLD" />মনত ৰাখিব:<ph name="END_BOLD" /> একেধৰণৰ কোনো কণ্ঠধ্বনি অথবা ৰেকৰ্ডিঙেও আপোনাৰ ব্যক্তিগত ফলাফল এক্সেছ কৰিবলৈ সক্ষম হ’ব পাৰে। আপুনি পাছত Assistantৰ ছেটিঙত সেইটো অফ কৰি Voice Match সুবিধাটোৰ অনুমতি আঁতৰাব পাৰে।</translation> <translation id="5614190747811328134">ব্যৱহাৰকাৰীৰ জাননী</translation> <translation id="5614553682702429503">পাছৱৰ্ড ছেভ কৰিবনে?</translation> <translation id="5616726534702877126">সংৰক্ষণৰ আকাৰ</translation> @@ -5038,6 +5051,7 @@ <translation id="6824584962142919697">উপাদান &পৰীক্ষা কৰক</translation> <translation id="6825184156888454064">নাম অনুসৰি সজাওক</translation> <translation id="6826872289184051766">USBৰ মাধ্যমেৰে সত্যাপন কৰক</translation> +<translation id="6827604573767207488">আপুনি ইতিমধ্যে অন্য এটা ডিভাইচত ব্যক্তিগতকৃত Assistant ছেট আপ কৰিছে যেন লাগিছে। তলৰ ছেটিংটো অন কৰি আপোনাৰ Assistantৰ পৰা আৰু অধিক উপকৃত হওক।</translation> <translation id="6828153365543658583">নিম্নোক্ত ব্যৱহাৰকাৰীসকলক ছাইন ইন কৰিব নিদিব:</translation> <translation id="6828182567531805778">আপোনাৰ ডেটা ছিংক কৰিবলৈ আপোনাৰ পাছফ্ৰেজ দিয়ক</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5471,6 +5485,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" />এ ADB ডিবাগিং অক্ষম কৰিছে। আপুনি <ph name="DEVICE_TYPE" /> ৰিষ্টাৰ্ট কৰিলে আপুনি এপ্ ছাইডল’ড কৰিব নোৱাৰিব।</translation> <translation id="7328867076235380839">অমান্য যুটি</translation> <translation id="7329154610228416156">এটা অসুৰক্ষিত URL (<ph name="BLOCKED_URL" />) ব্যৱহাৰ কৰিবলৈ কনফিগাৰ কৰি ৰখা কাৰণে ছাইন ইন কৰিব নগ‘ল। অনুগ্ৰহ কৰি আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।</translation> +<translation id="7329932885428707942">এইটোৱে অলপ সময়ৰ বাবে চেলুলাৰ নেটৱৰ্কৰ সংযোগ বিচ্ছিন্ন কৰিব পাৰে।</translation> <translation id="7332053360324989309">সমৰ্পিত কৰ্মচাৰী: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">ড’ক কৰা পৰিৱৰ্ধক সক্ষম কৰক</translation> <translation id="7335974957018254119">ইয়াৰ বাবে বানান পৰীক্ষণ সুবিধা ব্যৱহাৰ কৰক</translation> @@ -6137,6 +6152,7 @@ <translation id="8059417245945632445">&ডিভাইচ পৰীক্ষা কৰক</translation> <translation id="8059456211585183827">ছেভ কৰিবলৈ কোনো প্ৰিণ্টাৰ উপলব্ধ নহয়।</translation> <translation id="8061091456562007989">এইটো পুনৰ সলনি কৰক</translation> +<translation id="8061991877177392872">আপুনি ইতিমধ্যে অন্য এটা ডিভাইচত আপোনাৰ Assistantৰ সৈতে Voice Match সুবিধাটো ছেট আপ কৰিছে যেন লাগিছে। এই পূৰ্বৰ ৰেকৰ্ডিংসমূহ এই ডিভাইচটোত এটা কণ্ঠধ্বনিৰ মডেল বনাবলৈ ব্যৱহাৰ কৰা হৈছে।</translation> <translation id="8062844841289846053">{COUNT,plural, =1{১ খন কাগজ}one{{COUNT} খন কাগজ}other{{COUNT} খন কাগজ}}</translation> <translation id="8062879968880283306">ডিভাইচৰ কেমেৰা ব্যৱহাৰ কৰি কিউআৰ ক’ড স্কেন কৰক অথবা আপোনাৰ বাহকে প্ৰদান কৰা সক্ৰিয়কৰণৰ ক’ডটো দিয়ক।</translation> <translation id="8063235345342641131">ডিফ'ল্ট সেউজীয়া অৱতাৰ</translation> @@ -6406,6 +6422,7 @@ <translation id="8379991678458444070">এই টেবটো বুকমার্ক কৰি পৰৱর্তী সময়ত ক্ষিপ্ৰভাৱে খোলক</translation> <translation id="8382913212082956454">&ইমেইল ঠিকনা প্ৰতিলিপি কৰক</translation> <translation id="8386091599636877289">নীতিটো বিচাৰি পোৱা নগ’ল।</translation> +<translation id="8386819192691131213">অনুবাদ কৰা, সংজ্ঞা প্ৰদান কৰা, একক ৰূপান্তৰ কৰা আদিৰ দৰে বহুতো কামৰ ক্ষেত্ৰত ক্ষিপ্ৰ উত্তৰ দিবলৈ Assistantক স্ক্ৰীনত থকা তথ্য ব্যৱহাৰ কৰিবলৈ অনুমতি দিয়ক</translation> <translation id="8386903983509584791">স্কেন সম্পূর্ণ হ’ল</translation> <translation id="8387361103813440603">আপোনাৰ অৱস্থান চোৱাৰ অনুমতি নাই</translation> <translation id="8389264703141926739">জাননী অৱৰোধ কৰক</translation> @@ -6883,6 +6900,7 @@ <translation id="8915370057835397490">পৰামর্শ ল'ড কৰি থকা হৈছে</translation> <translation id="8916476537757519021">ইনক’গনিট’ ছাবফ্ৰেম: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />ৰ <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">মাউছটোৱে স্ক্ৰীনখনৰ কোনো এটা কাষ স্পৰ্শ কৰিলে স্ক্ৰীনখন লৰচৰ কৰক</translation> <translation id="8923880975836399332">গাঢ় সেউজ-নীলা</translation> <translation id="8925458182817574960">&ছেটিংসমূহ</translation> <translation id="8926389886865778422">পুনৰাই নুসুধিব</translation> @@ -6960,6 +6978,7 @@ <translation id="9009708085379296446">আপুনি এই পৃষ্ঠাখন সলনি কৰিব বিচাৰিছিল নেকি?</translation> <translation id="9011163749350026987">আইকন সদায় দেখুৱাওক</translation> <translation id="9011393886518328654">মুক্তিৰ টোকা</translation> +<translation id="9012122671773859802">মাউছে গতি কৰিলে স্ক্ৰীনখনকো অবিৰতভাৱে গতি কৰাওক</translation> <translation id="9013037634206938463">Linux ইনষ্টল কৰিবলৈ <ph name="INSTALL_SIZE" /> খালী ঠাইৰ আৱশ্যক। খালী ঠাই বঢ়াবলৈ আপোনাৰ ডিভাইচৰ পৰা ফাইলসমূহ মচক।</translation> <translation id="9013707997379828817">আপোনাৰ প্ৰশাসকে এই ডিভাইচটো ৰ’লবেক কৰিছে। অনুগ্ৰহ কৰি প্ৰয়োজনীয় ফাইলসমূহ ছেভ কৰক আৰু ৰিষ্টাৰ্ট কৰক। এই ডিভাইচটোত থকা সকলো ডেটা মচা যাব।</translation> <translation id="901668144954885282">Google Driveত বেকআপ লওক</translation> @@ -7004,6 +7023,7 @@ <translation id="9052404922357793350">অৱৰোধ কৰাটো অব্যাহত ৰাখক</translation> <translation id="9053563360605707198">দুয়ো পিঠিতে প্ৰিণ্ট কৰক</translation> <translation id="9053893665344928494">মোৰ পচন্দ মনত ৰাখিব</translation> +<translation id="9055278955535611574">"Hey Google" বুলি কৈ আপোনাৰ Assistant এক্সেছ কৰক</translation> <translation id="9055636786322918818">RC4 এনক্ৰিপশ্বন প্ৰয়োগ কৰক৷ RC4 চিপাৰসমূহ অসুৰক্ষিত হোৱাৰ বাবে এই বিকল্পটো ব্যৱহাৰ কৰা কার্যয়ে আপোনাৰ বিপদৰ সম্ভাৱনা বৃদ্ধি কৰে।</translation> <translation id="9056810968620647706">মিল থকা একো বিচাৰি পোৱা নগ’ল।</translation> <translation id="9057354806206861646">সময়সূচী আপডে’ট কৰক</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 53955cc..e922afa4 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -2961,7 +2961,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> tətbiqi pəncərə paylaşır.</translation> <translation id="4364830672918311045">Bildirişləri görüntüləyin</translation> <translation id="4366138410738374926">Çap başladılıb</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> məsləhətləri, təklifləri və güncəlləmələrini əldə edin və rəy paylaşın. İstədiyiniz vaxt abunəlikdən çıxın.</translation> <translation id="4370425812909262207">Arabalar gizlədilib. Dəyişiklik etdiyiniz zaman onlar yenidən görünəcək.</translation> <translation id="4370975561335139969">Daxil etdiyiniz e-poçt və parol uyğun gəlmir</translation> <translation id="4374831787438678295">Linux quraşdırıcısı</translation> @@ -3114,6 +3113,7 @@ <translation id="4538417792467843292">Sözü silin</translation> <translation id="4538684596480161368">Həmişə unsandboxed plugins qarşısını <ph name="HOST" /></translation> <translation id="4538792345715658285">Sahibkarlıq qaydaları tərəfindən quraşdırılıb.</translation> +<translation id="4541123282641193691">Hesabınızı doğrulamaq mümkün olmadı. Yenidən cəhd edin və ya Chromebook'u yenidən başladın.</translation> <translation id="4541662893742891060">Bu profilə qoşulmaq olmur. Texniki dəstək üçün operatorunuzla əlaqə saxlayın.</translation> <translation id="4542520061254486227">Datanızı <ph name="WEBSITE_1" /> və <ph name="WEBSITE_2" /> üzərində oxuyun</translation> <translation id="4543778593405494224">Sertifikat meneceri</translation> @@ -4132,6 +4132,7 @@ <translation id="574209121243317957">Pitç</translation> <translation id="5742505912938664543">Buraya ikinci hesab əlavə etdikdə, həmin hesabdan istifadə edərək vebə baxış keçirə, tətbiqləri endirə, Gmail və digər Google xidmətlərinizi yoxlaya bilərsiniz.</translation> <translation id="5746169159649715125">PDF olaraq saxlayın</translation> +<translation id="5746261205461426123">Ayarlama bələdçisini açın</translation> <translation id="5747552184818312860">Vaxtı bitir</translation> <translation id="5747785204778348146">Developer - qeyri-stabil</translation> <translation id="5747809636523347288"><ph name="URL" /> yerləşdirib daxil olun</translation> @@ -5281,6 +5282,7 @@ <translation id="708278670402572152">Skanı aktiv etmək üçün bağlantını kəsin</translation> <translation id="7084321615353200053">Saytlar kameranızdan istifadə icazəsi istəyə bilər (tövsiyə olunur)</translation> <translation id="7085389578340536476">Chrome'a səs yazmaq icazəsi verilsin?</translation> +<translation id="7085805695634549980">Google xidmətlərinə qoşulmaq mümkün olmadı. Xəta kodu: <ph name="ERROR_CODE" />.</translation> <translation id="7086672505018440886">Arxivə Chrome loq fayllarını daxil edin.</translation> <translation id="7088434364990739311">Güncəlləmə yoxlanışı başladıla bilmədi (xəta kodu <ph name="ERROR" />).</translation> <translation id="7088561041432335295">Zip Archiver - ZIP fayllarını Fayl tətbiqində açın və paketləyin.</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index ae10420..8458e2f 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Доступ да прылад Bluetooth і прылад паслядоўнага порта</translation> <translation id="114036956334641753">Аўдыя і субцітры</translation> <translation id="1140746652461896221">Блакіраваць змесціва на ўсіх старонках, якія вы наведваеце</translation> +<translation id="1141953877381847186">Дазвольце Памочніку выкарыстоўваць інфармацыю на экране, каб даваць хуткія адказы (напрыклад, перакладаць, даваць азначэнні, пераводзіць адзінкі вымярэння і не толькі). + <ph name="BR" /> +<ph name="BEGIN_BOLD" />Майце на ўвазе:<ph name="END_BOLD" /> вы заўсёды можаце змяніць гэту наладу ў раздзеле "Налады Памочніка Google > Звязаная інфармацыя".</translation> <translation id="1143142264369994168">Сродак подпісу сертыфікатаў</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome не знайшоў шкоднага праграмнага забеспячэння на вашым камп'ютары • Праверка праводзілася хвіліну таму}one{Chrome не знайшоў шкоднага праграмнага забеспячэння на вашым камп'ютары • Праверка праводзілася {NUM_MINS} хвіліну таму}few{Chrome не знайшоў шкоднага праграмнага забеспячэння на вашым камп'ютары • Праверка праводзілася {NUM_MINS} хвіліны таму}many{Chrome не знайшоў шкоднага праграмнага забеспячэння на вашым камп'ютары • Праверка праводзілася {NUM_MINS} хвілін таму}other{Chrome не знайшоў шкоднага праграмнага забеспячэння на вашым камп'ютары • Праверка праводзілася {NUM_MINS} хвіліны таму}}</translation> <translation id="1145593918056169051">Прынтар спыніў работу</translation> @@ -1434,7 +1437,9 @@ <translation id="2594999711683503743">Увядзіце URL-адрас або пошукавы запыт у Google</translation> <translation id="2602501489742255173">Каб пачаць, правядзіце пальцам уверх</translation> <translation id="2603115962224169880">Ачыстка камп'ютара</translation> +<translation id="2603355571917519942">Функцыя Voice Match гатовая да работы</translation> <translation id="2603463522847370204">Адкрыць у &акне ў рэжыме інкогніта</translation> +<translation id="2604138917550693049">Выканаць пошук па відарысе з дапамогай Google Аб'ектыва</translation> <translation id="2604255671529671813">Памылка падключэння да сеткі</translation> <translation id="2606246518223360146">Звязаць даныя</translation> <translation id="2606454609872547359">Не, працягнуць без ChromeVox</translation> @@ -1776,6 +1781,7 @@ <translation id="2963151496262057773">Наступная ўбудова не адказвае: <ph name="PLUGIN_NAME" />. Спыніць яе?</translation> <translation id="2964193600955408481">Выключыць Wi-Fi</translation> <translation id="2964245677645334031">Абагульванне паблізу: бачнасць</translation> +<translation id="2966216232069818096">Дазвольце Памочніку выкарыстоўваць інфармацыю на экране, каб дапамагаць вам</translation> <translation id="2966937470348689686">Кіраванне параметрамі Android</translation> <translation id="2972581237482394796">&Узнавіць</translation> <translation id="2973324205039581528">Выключыць гук на сайце</translation> @@ -1871,6 +1877,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Гэта ўкладка выкарыстоўвае вашу камеру або мікрафон.</translation> <translation id="3083193146044397360">Часова заблакіравана ў мэтах абароны вашай бяспекі</translation> +<translation id="3083899879156272923">Перамяшчаць экран, трымаючы ўказальнік мышы ў цэнтры экрана</translation> <translation id="3084548735795614657">Каб усталяваць пашырэнне, апусціце яго сюды</translation> <translation id="3084771660770137092">Chrome вычарпаў запас памяці, або працэс апрацоўкі вэб-старонкі быў спынены па іншай прычыне. Каб працягнуць, перазагрузіце старонку або перайдзіце на іншую.</translation> <translation id="3084958266922136097">Выключыць застаўку</translation> @@ -2364,6 +2371,9 @@ <translation id="3654045516529121250">Чытанне налад спецыяльных магчымасцей</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Праграма мае пастаянны доступ да аднаго файла.}one{Праграма мае пастаянны доступ да # файла.}few{Праграма мае пастаянны доступ да # файлаў.}many{Праграма мае пастаянны доступ да # файлаў.}other{Праграма мае пастаянны доступ да # файла.}}</translation> <translation id="3658871634334445293">Паскарэнне TrackPoint</translation> +<translation id="3659830472545192450">Voice Match дапамагае Памочніку Google пазнаваць ваш голас на прыладзе Chromebook і адрозніваць вас ад іншых людзей. + <ph name="BR" /> +<ph name="BEGIN_BOLD" />Майце на ўвазе:<ph name="END_BOLD" /> атрымаць доступ да персанальных вынікаў таксама зможа хтосьці з падобным да вашага голасам або запісам вашага голасу. Выдаліць дазвол Voice Match можна будзе пазней у наладах Памочніка.</translation> <translation id="3660234220361471169">Ненадзейны</translation> <translation id="3664511988987167893">Значок пашырэння</translation> <translation id="3665589677786828986">Выяўлена, што іншая праграма змяніла некаторыя налады ў Chrome, і таму яны скінуты да стандартных значэнняў.</translation> @@ -2970,7 +2980,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> абагульвае акно.</translation> <translation id="4364830672918311045">Паказ апавяшчэнняў</translation> <translation id="4366138410738374926">Пачатак друку</translation> -<translation id="437004882363131692">Давайце водгукі, атрымлівайце прапановы, навіны і парады па прыладах <ph name="DEVICE_TYPE" />. Адпісацца можна ў любы час.</translation> <translation id="4370425812909262207">Кошыкі схаваны. Яны з'явяцца тут зноў, калі вы ўнесяце змены.</translation> <translation id="4370975561335139969">Вы ўвялі няправільны адрас электроннай пошты або пароль</translation> <translation id="4374831787438678295">Усталёўшчык Linux</translation> @@ -3547,6 +3556,7 @@ <translation id="5050330054928994520">Сінтэз маўлення</translation> <translation id="5051836348807686060">Праверка правапісу для выбраных моў не падтрымліваецца</translation> <translation id="5052499409147950210">Рэдагаванне сайта</translation> +<translation id="5053962746715621840">Выканаць пошук па відарысе з дапамогай Google Аб'ектыва</translation> <translation id="5057110919553308744">Пры націсканні на пашырэнне</translation> <translation id="5057403786441168405">Тут можна кіраваць уліковымі запісамі, у якія вы ўвайшлі: вэб-сайты, праграмы і пашырэнні ў браўзеры Chrome і краме Google Play могуць выкарыстоўваць іх для персаналізацыі сваіх функцый згодна з дазволамі. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Задаць абмежаванні на ўваход</translation> @@ -4029,6 +4039,9 @@ <translation id="5610038042047936818">Пераключыцца ў рэжым камеры</translation> <translation id="561030196642865721">Староннія файлы cookie дазволены на гэтым сайце</translation> <translation id="5612734644261457353">На жаль, ваш пароль па-ранейшаму не ўдаецца спраўдзіць. Заўвага: калі вы нядаўна змянілі пароль, новы пароль будзе прыменены пасля выхаду, таму выкарыстайце тут стары пароль.</translation> +<translation id="561308544008485315">Voice Match дапамагае Памочніку Google пазнаваць ваш голас на прыладзе Chromebook і адрозніваць вас ад іншых людзей. У мэтах эканоміі зараду акумулятара галасавая каманда "Ok Google" працуе, толькі калі прылада падключана да крыніцы сілкавання. Каб змяніць гэтыя параметры, перайдзіце ў Налады. + <ph name="BR" /> +<ph name="BEGIN_BOLD" />Майце на ўвазе:<ph name="END_BOLD" /> атрымаць доступ да персанальных вынікаў таксама зможа хтосьці з падобным да вашага голасам або запісам вашага голасу. Выдаліць дазвол Voice Match можна будзе пазней у наладах Памочніка.</translation> <translation id="5614190747811328134">Паведамленне карыстальніку</translation> <translation id="5614553682702429503">Захаваць пароль?</translation> <translation id="5616726534702877126">Зарэзерваваць памер</translation> @@ -5052,6 +5065,7 @@ <translation id="6824584962142919697">&Праверыць элементы</translation> <translation id="6825184156888454064">Сартаваць па назве</translation> <translation id="6826872289184051766">Спраўдзіць праз USB</translation> +<translation id="6827604573767207488">Здаецца, вы ўжо наладзілі персаналізаванага Памочніка на іншай прыладзе. Выкарыстоўвайце яго яшчэ больш эфектыўна, уключыўшы наступную наладу.</translation> <translation id="6828153365543658583">Дазволіць уваход толькі наступным карыстальнікам:</translation> <translation id="6828182567531805778">Для сінхранізацыі даных увядзіце фразу-пароль</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5486,6 +5500,7 @@ <translation id="7327989755579928735">Сайт <ph name="MANAGER" /> выключыў адладку ADB. Пасля перазапуску прылады <ph name="DEVICE_TYPE" /> вы не зможаце загружаць праграмы са старонняй крыніцы.</translation> <translation id="7328867076235380839">Няправільнае спалучэнне</translation> <translation id="7329154610228416156">Адбыўся збой уваходу з-за выкарыстання небяспечнага URL-адраса (<ph name="BLOCKED_URL" />). Звяжыцеся з адміністратарам.</translation> +<translation id="7329932885428707942">Гэта можа прывесці да непрацяглага адключэння ад сотавай сеткі.</translation> <translation id="7332053360324989309">Вылучаны рабочы працэс: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Уключыць прыстыкаваную лупу</translation> <translation id="7335974957018254119">Для якіх моў выкарыстоўваць праверку правапісу</translation> @@ -5529,6 +5544,7 @@ <translation id="7374376573160927383">Кіраваць прыладамі USB</translation> <translation id="7375235221357833624">{0,plural, =1{Перазапусціце прыладу на працягу гадзіны}one{Перазапусціце прыладу на працягу # гадзіны}few{Перазапусціце прыладу на працягу # гадзін}many{Перазапусціце прыладу на працягу # гадзін}other{Перазапусціце прыладу на працягу # гадзіны}}</translation> <translation id="7376553024552204454">Указваць на курсор мышы, калі ён рухаецца</translation> +<translation id="737728204345822099">На ключы бяспекі можа быць пакінуты запіс пра наведванне вамі гэтага вэб-сайта.</translation> <translation id="7377451353532943397">Працягваць блакіраваць доступ да датчыкаў</translation> <translation id="7378611153938412599">Ненадзейныя паролі лёгка адгадаць. Выкарыстоўвайце толькі надзейныя паролі. <ph name="BEGIN_LINK" />Праглядзець іншыя парады па бяспецы.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Адкрыць Вэб-краму Chrome</translation> @@ -6154,6 +6170,7 @@ <translation id="8059417245945632445">&Праверыць прылады</translation> <translation id="8059456211585183827">Няма даступных прынтараў, якія можна захаваць.</translation> <translation id="8061091456562007989">Вярнуць ранейшыя налады</translation> +<translation id="8061991877177392872">Здаецца, вы ўжо наладзілі работу функцыі Voice Match з Памочнікам на іншай прыладзе. Зробленыя пры наладцы запісы былі выкарыстаны для стварэння галасавой мадэлі на гэтай прыладзе.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 аркуш паперы}one{{COUNT} аркуш паперы}few{{COUNT} аркушы паперы}many{{COUNT} аркушаў паперы}other{{COUNT} аркуша паперы}}</translation> <translation id="8062879968880283306">Адсканіруйце QR-код камерай прылады або ўвядзіце код актывацыі, дадзены аператарам.</translation> <translation id="8063235345342641131">Стандартны зялёны аватар</translation> @@ -6423,6 +6440,7 @@ <translation id="8379991678458444070">Дадаўшы гэту ўкладку ў закладкі, вы будзеце мець да яе хуткі доступ</translation> <translation id="8382913212082956454">Скапіраваць &адрас электроннай пошты</translation> <translation id="8386091599636877289">Палітыка не знойдзена.</translation> +<translation id="8386819192691131213">Дазвольце Памочніку выкарыстоўваць інфармацыю на экране, каб даваць хуткія адказы (напрыклад, перакладаць, даваць азначэнні, пераводзіць адзінкі вымярэння і не толькі)</translation> <translation id="8386903983509584791">Пошук завершаны</translation> <translation id="8387361103813440603">Не дазволена атрымліваць звесткі пра ваша месцазнаходжанне</translation> <translation id="8389264703141926739">Блакіраваць апавяшчэнні</translation> @@ -6903,6 +6921,7 @@ <translation id="8915370057835397490">Загрузка прапановы</translation> <translation id="8916476537757519021">Субфрэйм інкогніта: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />: <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">Перамяшчаць экран, калі ўказальнік мышы даходзіць да мяжы экрана</translation> <translation id="8923880975836399332">Цёмна-бірузовы</translation> <translation id="8925458182817574960">&Налады</translation> <translation id="8926389886865778422">Больш не пытацца</translation> @@ -6980,6 +6999,7 @@ <translation id="9009708085379296446">Магчыма, вы хацелі змяніць старонку?</translation> <translation id="9011163749350026987">Заўсёды паказваць значок</translation> <translation id="9011393886518328654">Нататкі да выпуску</translation> +<translation id="9012122671773859802">Пастаянна перамяшчаць экран услед за ўказальнікам мышы</translation> <translation id="9013037634206938463">Для ўсталявання Linux неабходна мець як мінімум <ph name="INSTALL_SIZE" />. Каб вызваліць месца, выдаліце файлы з прылады.</translation> <translation id="9013707997379828817">Ваш адміністратар адкаціў версію АС на прыладзе. Захавайце важныя файлы і перазапусціце прыладу. Усе даныя на прыладзе будуць выдалены.</translation> <translation id="901668144954885282">Рэзервовае капіраванне на Google Дыск</translation> @@ -7024,6 +7044,7 @@ <translation id="9052404922357793350">Працягнуць блакіроўку</translation> <translation id="9053563360605707198">Друк на абодвух баках</translation> <translation id="9053893665344928494">Запомніць мой выбар</translation> +<translation id="9055278955535611574">Актывуйце Памочніка галасавой камандай "Ok Google"</translation> <translation id="9055636786322918818">Уключыць шыфраванне RC4. Выкарыстанне гэтага параметра павялічвае рызыкі з-за небяспечнасці шыфраў RC4.</translation> <translation id="9056810968620647706">Супадзенняў не знойдзена.</translation> <translation id="9057354806206861646">Абнавіць расклад</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index a04f95d..5eedfbd 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Достъп до серийните и устройствата ви с Bluetooth</translation> <translation id="114036956334641753">Аудио и надписи</translation> <translation id="1140746652461896221">Блокиране на съдържанието на посещаваните от вас страници</translation> +<translation id="1141953877381847186">Разрешете на Асистент да използва информацията на екрана с цел предоставяне на кратки отговори, като например преводи, определения, преобразуване на мерни единици и др. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Имайте предвид следното<ph name="END_BOLD" />: Можете да промените това по всяко време, като отворите „Настройки на Google Асистент > Сродна информация“.</translation> <translation id="1143142264369994168">Подписващ сертификата</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome не откри опасен софтуер на компютъра ви • Последна проверка: преди 1 минута}other{Chrome не откри опасен софтуер на компютъра ви • Последна проверка: преди {NUM_MINS} минути}}</translation> <translation id="1145593918056169051">Принтерът спря</translation> @@ -1433,7 +1436,9 @@ <translation id="2594999711683503743">Потърсете с Google или въведете URL адрес</translation> <translation id="2602501489742255173">Прекарайте пръст нагоре, за да започнете</translation> <translation id="2603115962224169880">Почистване на компютъра</translation> +<translation id="2603355571917519942">Функцията Voice Match е готова за използване</translation> <translation id="2603463522847370204">Отваряне на прозорец в режим „&инкогнито“</translation> +<translation id="2604138917550693049">Търсене на изображението с Google Обектив</translation> <translation id="2604255671529671813">Грешка при свързване с мрежата</translation> <translation id="2606246518223360146">Свързване на данните</translation> <translation id="2606454609872547359">Не, продължаване без ChromeVox</translation> @@ -1776,6 +1781,7 @@ <translation id="2963151496262057773">Следната приставка е блокирала: <ph name="PLUGIN_NAME" />. Искате ли да я спрете?</translation> <translation id="2964193600955408481">Деактивиране на Wi-Fi</translation> <translation id="2964245677645334031">Видимост за „Споделяне наблизо“</translation> +<translation id="2966216232069818096">Разрешаване на Асистент да използва информацията на екрана, за да ви помага</translation> <translation id="2966937470348689686">Управление на предпочитанията за Android</translation> <translation id="2972581237482394796">&Възстановяване</translation> <translation id="2973324205039581528">Заглушаване на сайта</translation> @@ -1872,6 +1878,7 @@ <translation id="308268297242056490">URI адрес</translation> <translation id="3082780749197361769">Този раздел използва камерата или микрофона ви.</translation> <translation id="3083193146044397360">Временно блокирано от съображения за сигурност</translation> +<translation id="3083899879156272923">Преместване на екрана и задържане на мишката в центъра му</translation> <translation id="3084548735795614657">Освободете, за да инсталирате</translation> <translation id="3084771660770137092">Или Chrome няма достатъчно памет, или процесът за уеб страницата бе прекратен по друга причина. За да продължите, презаредете или отворете друга страница.</translation> <translation id="3084958266922136097">Деактивиране на скрийнсейвъра</translation> @@ -2367,6 +2374,9 @@ <translation id="3654045516529121250">Четене на настройките ви за достъпност</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Има постоянен достъп до един файл.}other{Има постоянен достъп до # файла.}}</translation> <translation id="3658871634334445293">Ускоряване на TrackPoint</translation> +<translation id="3659830472545192450">Voice Match помага на Google Асистент да разпознава гласа ви на вашия Chromebook, както и да ви различава от другите хора. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Имайте предвид следното<ph name="END_BOLD" />: Възможно е да бъде осъществен достъп до личните ви резултати и от човек с подобен глас или чрез запис. Можете да премахнете разрешението за Voice Match по-късно, като го изключите в настройките на Асистент.</translation> <translation id="3660234220361471169">Ненадеждни</translation> <translation id="3664511988987167893">Икона на разширението</translation> <translation id="3665589677786828986">Chrome установи, че някои от настройките ви са повредени от друга програма, и възстанови първоначалните им стандартни стойности.</translation> @@ -2976,7 +2986,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> споделя прозорец.</translation> <translation id="4364830672918311045">Показване на известия</translation> <translation id="4366138410738374926">Отпечатването стартира</translation> -<translation id="437004882363131692">Получавайте съвети, оферти и актуална информация за <ph name="DEVICE_TYPE" /> и споделяйте отзиви. Можете да се отпишете по всяко време.</translation> <translation id="4370425812909262207">Кошниците са скрити. Те ще се покажат отново, когато направите промени.</translation> <translation id="4370975561335139969">Въведените имейл адрес и парола не съвпадат</translation> <translation id="4374831787438678295">Инсталационна програма за Linux</translation> @@ -3556,6 +3565,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Проверката на правописа не се поддържа за избраните от вас езици</translation> <translation id="5052499409147950210">Редактиране на сайта</translation> +<translation id="5053962746715621840">Търсене на изображението с Google Обектив</translation> <translation id="5057110919553308744">При кликване върху разширението</translation> <translation id="5057403786441168405">Управлявайте профилите, в които сте влезли. В зависимост от разрешенията уебсайтовете, приложенията и разширенията в Chrome и Google Play може да използват тези профили, за да персонализират практическата ви работа. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Ограничаване на влизането в профил</translation> @@ -4040,6 +4050,9 @@ <translation id="5610038042047936818">Превключване към режима за фотоапарат</translation> <translation id="561030196642865721">„Бисквитките“ на трети страни са разрешени на този сайт</translation> <translation id="5612734644261457353">За съжаление паролата ви пак не можа да бъде потвърдена. Забележка: Ако наскоро сте я променили, новата ще се приложи, щом излезете от профила си. Моля, използвайте старата парола тук.</translation> +<translation id="561308544008485315">Voice Match помага на Google Асистент да разпознава гласа ви на вашия Chromebook, както и да ви различава от другите хора. С цел икономия на батерията активиращата фраза Ok Google действа само когато устройството ви е свързано със захранващ източник. За да извършите промени, отворете настройките. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Имайте предвид следното<ph name="END_BOLD" />: Възможно е да бъде осъществен достъп до личните ви резултати и от човек с подобен глас или чрез запис. Можете да премахнете разрешението за Voice Match по-късно, като го изключите в настройките на Асистент.</translation> <translation id="5614190747811328134">Известие за потребителя</translation> <translation id="5614553682702429503">Да се запази ли паролата?</translation> <translation id="5616726534702877126">Запазване на място</translation> @@ -5071,6 +5084,7 @@ <translation id="6824584962142919697">&Инспектиране на елементите</translation> <translation id="6825184156888454064">Сортиране по име</translation> <translation id="6826872289184051766">Потвърждаване чрез USB</translation> +<translation id="6827604573767207488">Изглежда, че вече сте настроили персонализираните резултати от Асистент на друго устройство. Възползвайте се в още по-голяма степен от Асистент, като включите следната настройка.</translation> <translation id="6828153365543658583">Влизането да се ограничи до следните потребители:</translation> <translation id="6828182567531805778">Въведете своя пропуск, за да синхронизирате данните си</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5506,6 +5520,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> деактивира отстраняването на грешки през ADB. След като рестартирате устройството си <ph name="DEVICE_TYPE" />, няма да можете да инсталирате локално приложения.</translation> <translation id="7328867076235380839">Невалидна комбинация</translation> <translation id="7329154610228416156">Влизането не бе успешно, тъй като е конфигурирано да се извършва през незащитен URL адрес (<ph name="BLOCKED_URL" />). Моля, свържете се с администратора си.</translation> +<translation id="7329932885428707942">Това може да доведе до кратко прекъсване на връзката с мобилната мрежа.</translation> <translation id="7332053360324989309">Специализиран изпълнител: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Активиране на лупата в прикрепен режим</translation> <translation id="7335974957018254119">Проверка на правописа за</translation> @@ -5549,6 +5564,7 @@ <translation id="7374376573160927383">Управление на USB устройствата</translation> <translation id="7375235221357833624">{0,plural, =1{Актуализирайте устройството в рамките на 1 час}other{Актуализирайте устройството в рамките на # часа}}</translation> <translation id="7376553024552204454">Открояване на курсора на мишката, когато се движи</translation> +<translation id="737728204345822099">В ключа ви за сигурност може да се съхрани запис за посещението ви на този сайт.</translation> <translation id="7377451353532943397">Достъпът до сензорите да продължи да се блокира</translation> <translation id="7378611153938412599">Ненадеждните пароли са лесни за отгатване. Уверете се, че създаваните от вас са надеждни. <ph name="BEGIN_LINK" />Вижте още съвети за сигурност<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Отваряне на уеб магазина на Chrome</translation> @@ -6176,6 +6192,7 @@ <translation id="8059417245945632445">&Инспектиране на устройствата</translation> <translation id="8059456211585183827">Няма налични принтери за запазване.</translation> <translation id="8061091456562007989">Възстановяване на настройките</translation> +<translation id="8061991877177392872">Изглежда, че вече сте настроили Voice Match за Асистент на друго устройство. Предишните записи бяха използвани за създаване на гласов модел на това устройство.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 лист хартия}other{{COUNT} листа хартия}}</translation> <translation id="8062879968880283306">Сканирайте QR кода с камерата на устройството или въведете кода за активиране, предоставен от оператора ви.</translation> <translation id="8063235345342641131">Стандартен зелен аватар</translation> @@ -6447,6 +6464,7 @@ <translation id="8379991678458444070">Връщайте се тук бързо, като запазите отметка към този раздел</translation> <translation id="8382913212082956454">Копиране на име&йл адреса</translation> <translation id="8386091599636877289">Правилото не е намерено.</translation> +<translation id="8386819192691131213">Разрешете на Асистент да използва информацията на екрана с цел предоставяне на кратки отговори, като например преводи, определения, преобразуване на мерни единици и др.</translation> <translation id="8386903983509584791">Сканирането завърши</translation> <translation id="8387361103813440603">Сайтове без разрешение за преглед на местоположението ви</translation> <translation id="8389264703141926739">Блокиране на известията</translation> @@ -6929,6 +6947,7 @@ <translation id="8915370057835397490">Предложението се зарежда</translation> <translation id="8916476537757519021">Подрамка в режим „инкогнито“: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> на <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Преместване на екрана, когато мишката докосва краищата му</translation> <translation id="8923880975836399332">Тъмно синьо-зелено</translation> <translation id="8925458182817574960">&Настройки</translation> <translation id="8926389886865778422">Без повторно питане</translation> @@ -7007,6 +7026,7 @@ <translation id="9009708085379296446">Искахте ли да промените тази страница?</translation> <translation id="9011163749350026987">Иконата да се показва винаги</translation> <translation id="9011393886518328654">Бележки по версията</translation> +<translation id="9012122671773859802">Непрекъснато преместване на екрана съгласно движенията на мишката</translation> <translation id="9013037634206938463">За инсталирането на Linux трябва да разполагате с поне <ph name="INSTALL_SIZE" /> свободно място. За да увеличите свободното място, изтрийте файлове от устройството.</translation> <translation id="9013707997379828817">Администраторът ви върна това устройство към по-ранна версия. Моля, запазете важните файлове и го рестартирайте. Всички данни на устройството ще бъдат изтрити.</translation> <translation id="901668144954885282">Създаване на резервно копие в Google Диск</translation> @@ -7051,6 +7071,7 @@ <translation id="9052404922357793350">Продължаване на блокирането</translation> <translation id="9053563360605707198">Двустранно отпечатване</translation> <translation id="9053893665344928494">Запомняне на избора ми</translation> +<translation id="9055278955535611574">Осъществяване на достъп до Асистент посредством „Ok Google“</translation> <translation id="9055636786322918818">Задължително прилагане на RC4 шифроване. Използването на тази опция увеличава риска, тъй като шифрите RC4 са несигурни.</translation> <translation id="9056810968620647706">Няма намерени съответствия.</translation> <translation id="9057354806206861646">График на актуализациите</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 6cb5b7ac..d4a4236 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -2967,7 +2967,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> একটি উইন্ডো শেয়ার করছে।</translation> <translation id="4364830672918311045">বিজ্ঞপ্তিগুলি প্রদর্শন করুন</translation> <translation id="4366138410738374926">প্রিন্ট করার প্রক্রিয়া শুরু করা হয়েছে</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" />-এর থেকে পরামর্শ, অফার ও বিভিন্ন আপডেট পান এবং মতামত শেয়ার করুন। যেকোনও সময় আনসাবস্ক্রাইব করুন।</translation> <translation id="4370425812909262207">কার্ট লুকানো হয়েছে। কোনও পরিবর্তন করলে তবেই সেটি দেখা যাবে।</translation> <translation id="4370975561335139969">আপনার লেখা ইমেল আইডি এবং পাসওয়ার্ড মিলছে না</translation> <translation id="4374831787438678295">Linux ইনস্টলার</translation> @@ -3120,6 +3119,7 @@ <translation id="4538417792467843292">শব্দ মুছুন </translation> <translation id="4538684596480161368"><ph name="HOST" /> এ সর্বদা আনস্যান্ডবক্সড প্লাগ ইন অবরুদ্ধ করুন</translation> <translation id="4538792345715658285">এন্টারপ্রাইজ নীতি দ্বারা ইনস্টল করা হয়েছে৷</translation> +<translation id="4541123282641193691">আপনার অ্যাকাউন্ট যাচাই করা যায়নি। আবার চেষ্টা করুন অথবা Chromebook রিস্টার্ট করুন।</translation> <translation id="4541662893742891060">এই প্রোফাইলে কানেক্ট করা যায়নি। প্রযুক্তিগত সহায়তা পেতে, আপনার পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।</translation> <translation id="4542520061254486227"><ph name="WEBSITE_1" /> এবং <ph name="WEBSITE_2" /> আপনার ডেটা পড়ে</translation> <translation id="4543778593405494224">সার্টিফিকেট ম্যানেজার</translation> @@ -4139,6 +4139,7 @@ <translation id="574209121243317957">পিচ</translation> <translation id="5742505912938664543">আপনি এখানে সেকেন্ডারি অ্যাকাউন্ট যোগ করলে সেটির মাধ্যমে ওয়েব ব্রাউজ, অ্যাপ ডাউনলোড, Gmail চেক ও অন্যান্য Google পরিষেবা ব্যবহার করতে পারবেন।</translation> <translation id="5746169159649715125">পিডিএফ হিসেবে সেভ করুন</translation> +<translation id="5746261205461426123">সেট আপ গাইড খুলুন</translation> <translation id="5747552184818312860">মেয়াদ শেষ হবে</translation> <translation id="5747785204778348146">ডেভেলপার - অস্থায়ী</translation> <translation id="5747809636523347288"><ph name="URL" /> পে&স্ট করে সেখানে যান</translation> @@ -5290,6 +5291,7 @@ <translation id="708278670402572152">স্ক্যানিং সক্রিয় করতে সংযোগ বিচ্ছিন্ন করুন</translation> <translation id="7084321615353200053">সাইট আপনার ক্যামেরা ব্যবহারের অনুমতি চাইতে পারে (সাজেস্ট করা হয়েছে)</translation> <translation id="7085389578340536476">Chrome কে অডিও রেকর্ড করার অনুমতি দেবেন?</translation> +<translation id="7085805695634549980">Google পরিষেবার সাথে কানেক্ট করা যায়নি। সমস্যার কোড: <ph name="ERROR_CODE" />।</translation> <translation id="7086672505018440886">আর্কাইভে Chrome লগ ফাইল অন্তর্ভুক্ত করুন।</translation> <translation id="7088434364990739311">আপডেট চেক শুরু করা যায়নি (এরর কোড <ph name="ERROR" />)৷</translation> <translation id="7088561041432335295">জিপ আর্কাইভার - Files অ্যাপে জিপ ফাইলগুলি খুলুন ও প্যাক করুন</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 067d7125..dddff8d 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Pristup vašim Bluetooth i serijskim uređajima</translation> <translation id="114036956334641753">Zvuk i titlovi</translation> <translation id="1140746652461896221">Blokirati sadržaj na bilo kojoj stranici koju posjetite</translation> +<translation id="1141953877381847186">Dopustite Asistentu da koristi informacije na zaslonu kako bi pružio brze odgovore kao što su prijevodi, definicije, pretvorba jedinica i brojne druge informacije. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Napomena:<ph name="END_BOLD" /> tu postavku uvijek možete promijeniti kasnije u odjeljku Postavke Google asistenta > Povezani podaci.</translation> <translation id="1143142264369994168">Potpisnik potvrde</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome nije pronašao štetni softver na vašem računaru • Provjereno prije 1 minut}one{Chrome nije pronašao štetni softver na vašem računaru • Provjereno prije {NUM_MINS} minut}few{Chrome nije pronašao štetni softver na vašem računaru • Provjereno prije {NUM_MINS} minuta}other{Chrome nije pronašao štetni softver na vašem računaru • Provjereno prije {NUM_MINS} minuta}}</translation> <translation id="1145593918056169051">Štampač je prestao raditi</translation> @@ -1438,7 +1441,9 @@ <translation id="2594999711683503743">Pretražite Google ili upišite URL</translation> <translation id="2602501489742255173">Prevucite prema gore da počnete</translation> <translation id="2603115962224169880">Očisti računar</translation> +<translation id="2603355571917519942">Voice Match je spreman</translation> <translation id="2603463522847370204">Otvaranje u &anonimnom prozoru</translation> +<translation id="2604138917550693049">Pretraži sliku pomoću Google objektiva</translation> <translation id="2604255671529671813">Greška mrežne veze</translation> <translation id="2606246518223360146">Poveži podatke</translation> <translation id="2606454609872547359">Ne, nastavi bez ChromeVoxa</translation> @@ -1781,6 +1786,7 @@ <translation id="2963151496262057773">Sljedeći dodatak ne reagira: <ph name="PLUGIN_NAME" />Želite li ga zaustaviti?</translation> <translation id="2964193600955408481">Onemogući Wi-Fi</translation> <translation id="2964245677645334031">Vidljivost Dijeljenja u blizini</translation> +<translation id="2966216232069818096">Dopustite Asistentu da koristi informacije na zaslonu kako bi vam pomogao</translation> <translation id="2966937470348689686">Upravljajte postavkama Androida</translation> <translation id="2972581237482394796">&Ponovi</translation> <translation id="2973324205039581528">Isključi zvuk web lokacije</translation> @@ -1877,6 +1883,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Ova kartica koristi vašu kameru ili mikrofon.</translation> <translation id="3083193146044397360">Privremeno blokirano radi zaštite vaše sigurnosti</translation> +<translation id="3083899879156272923">Pomiči zaslon zadržavajući miš na sredini zaslona</translation> <translation id="3084548735795614657">Otpustite da biste instalirali</translation> <translation id="3084771660770137092">Chrome više nema memorije ili je proces web lokacije prekinut iz nekog drugog razloga. Ponovo učitajte ili idite na drugu stranicu da nastavite.</translation> <translation id="3084958266922136097">Onemogućite čuvara ekrana</translation> @@ -2372,6 +2379,9 @@ <translation id="3654045516529121250">Čitanje vaših postavki pristupačnosti</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ima trajan pristup jednom fajlu.}one{Ima trajan pristup # fajlu.}few{Ima trajan pristup za # fajla}other{Ima trajan pristup za # fajlova}}</translation> <translation id="3658871634334445293">Ubrzanje TrackPointa</translation> +<translation id="3659830472545192450">Voice Match pomaže Google asistentu da prepoznaje vaš glas na vašem Chromebooku i razlikuje vas od drugih. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Napomena:<ph name="END_BOLD" /> vašim osobnim rezultatima mogao bi pristupiti i netko sa sličnim glasom ili snimkom vašeg glasa. Dopuštenje za Voice Match možete ukloniti kasnije tako da ga isključite u postavkama Asistenta.</translation> <translation id="3660234220361471169">Nepouzdan</translation> <translation id="3664511988987167893">Ikona ekstenzije</translation> <translation id="3665589677786828986">Chrome je otkrio da je drugi program oštetio neke vaše postavke i vratio ih na zadano.</translation> @@ -2980,7 +2990,6 @@ <translation id="4364567974334641491">Aplikacija <ph name="APP_NAME" /> dijeli prozor.</translation> <translation id="4364830672918311045">Prikaži obavještenja</translation> <translation id="4366138410738374926">Štampanje je započelo</translation> -<translation id="437004882363131692">Primajte savjete, ponude i ažuriranja za uređaj <ph name="DEVICE_TYPE" /> i dijelite povratne informacije. Otkažite pretplatu bilo kada.</translation> <translation id="4370425812909262207">Korpe su sakrivene. Ponovo će se pojaviti kada napravite izmjene.</translation> <translation id="4370975561335139969">Unijeli ste e-adresu i zaporku koje se ne podudaraju</translation> <translation id="4374831787438678295">Paket za instalaciju Linuxa</translation> @@ -3560,6 +3569,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Alat za provjeru pravopisa nije podržan za odabrane jezike</translation> <translation id="5052499409147950210">Uredite web lokaciju</translation> +<translation id="5053962746715621840">Pretraži sliku pomoću Google objektiva</translation> <translation id="5057110919553308744">Kada kliknete na ekstenziju</translation> <translation id="5057403786441168405">Upravljajte računima na kojima ste prijavljeni. U zavisnosti od odobrenja, web lokacije, aplikacije i ekstenzije na Chromeu i Google Playu mogu koristiti ove račune da prilagode vaše iskustvo. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Ograniči prijavu</translation> @@ -4044,6 +4054,9 @@ <translation id="5610038042047936818">Prebaci na način rada za kameru</translation> <translation id="561030196642865721">Kolačići treće strane su dozvoljeni na ovoj web lokaciji</translation> <translation id="5612734644261457353">Žao nam je, vaša lozinka još nije potvrđena. Napomena: ako ste nedavno promijenili lozinku, vaša nova lozinka će se primijeniti nakon što se odjavite. Ovdje koristite staru lozinku.</translation> +<translation id="561308544008485315">Voice Match pomaže Google asistentu da prepoznaje vaš glas na vašem Chromebooku i razlikuje vas od drugih. Radi uštede baterije značajka "Hey Google" uključena je samo kad je uređaj priključen na napajanje. To možete promijeniti u postavkama. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Napomena:<ph name="END_BOLD" /> vašim osobnim rezultatima mogao bi pristupiti i netko sa sličnim glasom ili snimkom vašeg glasa. Dopuštenje za Voice Match možete ukloniti kasnije tako da ga isključite u postavkama Asistenta.</translation> <translation id="5614190747811328134">Korisničko obavještenja</translation> <translation id="5614553682702429503">Sačuvati lozinku?</translation> <translation id="5616726534702877126">Rezerviraj veličinu</translation> @@ -5074,6 +5087,7 @@ <translation id="6824584962142919697">&Provjeri elemente</translation> <translation id="6825184156888454064">Poredaj po imenu</translation> <translation id="6826872289184051766">Potvrda pomoću USB-a</translation> +<translation id="6827604573767207488">Čini se da ste već postavili prilagođenog Asistenta na drugom uređaju. Da biste još bolje iskoristili Asistenta, uključite sljedeće značajke.</translation> <translation id="6828153365543658583">Ograniči prijavu na sljedeće korisnike:</translation> <translation id="6828182567531805778">Unesite pristupni izraz za sinhroniziranje svojih podataka</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5509,6 +5523,7 @@ <translation id="7327989755579928735">Domena <ph name="MANAGER" /> je onemogućila otklanjanje grešaka putem ADB-a. Nakon ponovnog pokretanja uređaja <ph name="DEVICE_TYPE" />, više nećete moći lokalno instalirati aplikacije.</translation> <translation id="7328867076235380839">Nevažeća kombinacija</translation> <translation id="7329154610228416156">Prijava nije uspjela jer je konfigurirana za korištenje nesigurnog URL-a (<ph name="BLOCKED_URL" />). Obratite se svom administratoru.</translation> +<translation id="7329932885428707942">To može uzrokovati kratak prekid veze s mobilnom mrežom.</translation> <translation id="7332053360324989309">Namjenski radnik: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Omogući priključeno uvećalo</translation> <translation id="7335974957018254119">Koristite provjeru pravopisa za</translation> @@ -5552,6 +5567,7 @@ <translation id="7374376573160927383">Upravljajte USB uređajima</translation> <translation id="7375235221357833624">{0,plural, =1{Ažurirajte uređaj u roku od jednog sata}one{Ažurirajte uređaj u roku od # sata}few{Ažurirajte uređaj u roku od # sata}other{Ažurirajte uređaj u roku od # sati}}</translation> <translation id="7376553024552204454">Istakni kursor miša u pokretu</translation> +<translation id="737728204345822099">Evidencija o vašoj posjeti ovoj web lokaciji može se čuvati na vašem sigurnosnom ključu.</translation> <translation id="7377451353532943397">Nastavi blokirati pristup senzoru</translation> <translation id="7378611153938412599">Slabe lozinke je lako pogoditi. Vodite računa da kreirate jake lozinke. <ph name="BEGIN_LINK" />Pogledajte još sigurnosnih savjeta.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Otvorite Chrome Web trgovinu</translation> @@ -6179,6 +6195,7 @@ <translation id="8059417245945632445">&Pregledaj uređaje</translation> <translation id="8059456211585183827">Nema dostupnih štampača koje možete sačuvati.</translation> <translation id="8061091456562007989">Promijeni na prethodno</translation> +<translation id="8061991877177392872">Čini se da ste već postavili Voice Match za svojeg Asistenta na nekom drugom uređaju. Te su snimke iskorištene za izradu glasovnog modela na ovom uređaju.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 list papira}one{{COUNT} list papira}few{{COUNT} lista papira}other{{COUNT} listova papira}}</translation> <translation id="8062879968880283306">Skenirajte QR kôd kamerom uređaja ili unesite kôd za aktivaciju koji pruža vaš mobilni operater.</translation> <translation id="8063235345342641131">Zadani zeleni avatar</translation> @@ -6450,6 +6467,7 @@ <translation id="8379991678458444070">Označite karticu da se lakše vratite</translation> <translation id="8382913212082956454">Kopiraj adresu &e-pošte</translation> <translation id="8386091599636877289">Pravilo nije pronađeno.</translation> +<translation id="8386819192691131213">Dopustite Asistentu da koristi informacije na zaslonu kako bi pružio brze odgovore kao što su prijevodi, definicije, pretvorba jedinica i brojne druge informacije</translation> <translation id="8386903983509584791">Skeniranje je dovršeno</translation> <translation id="8387361103813440603">Nije dozvoljen pregled vaše lokacije</translation> <translation id="8389264703141926739">Blokiraj obavještenja</translation> @@ -6934,6 +6952,7 @@ <translation id="8915370057835397490">Učitavanje prijedloga</translation> <translation id="8916476537757519021">Podokvir anonimnog načina: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138">Uređaj <ph name="DEVICE_TYPE" /> koji koristi <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Pomiči zaslon kad miš dodiruje rubove zaslona</translation> <translation id="8923880975836399332">Tamnotirkizna</translation> <translation id="8925458182817574960">&Postavke</translation> <translation id="8926389886865778422">Ne pitaj ponovo</translation> @@ -7012,6 +7031,7 @@ <translation id="9009708085379296446">Jeste li namjeravali promijeniti ovu stranicu?</translation> <translation id="9011163749350026987">Uvijek prikaži ikonu</translation> <translation id="9011393886518328654">Napomene o izdanju</translation> +<translation id="9012122671773859802">Pomiči zaslon kontinuirano dok se miš kreće</translation> <translation id="9013037634206938463">Za instaliranje Linuxa je potrebno <ph name="INSTALL_SIZE" /> slobodnog prostora. Da oslobodite prostor, izbrišite fajlove s uređaja.</translation> <translation id="9013707997379828817">Administrator je vratio uređaj na prethodnu verziju. Sačuvajte važne fajlove pa ponovo pokrenite uređaj. Svi podaci će se izbrisati s ovog uređaja.</translation> <translation id="901668144954885282">Izrada sigurnosnih kopija na Google Disku</translation> @@ -7056,6 +7076,7 @@ <translation id="9052404922357793350">Nastavi blokirati</translation> <translation id="9053563360605707198">Štampaj obostrano</translation> <translation id="9053893665344928494">Zapamti moj izbor</translation> +<translation id="9055278955535611574">Pristupajte Asistentu tako što ćete reći "Hey Google"</translation> <translation id="9055636786322918818">Nametni RC4 šifriranje. Koristeći ovu opciju povećavate rizik jer je RCR4 šifriranje nesigurno.</translation> <translation id="9056810968620647706">Nije pronađeno nijedno podudaranje.</translation> <translation id="9057354806206861646">Ažuriranje rasporeda</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index d0f50d3..8254b6e1 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Accedeix als dispositius en sèrie i Bluetooth</translation> <translation id="114036956334641753">Àudio i subtítols</translation> <translation id="1140746652461896221">Bloqueja el contingut en totes les pàgines que visitis</translation> +<translation id="1141953877381847186">Permet que l'Assistent utilitzi informació de la pantalla per oferir-te respostes ràpides, com ara traduccions, definicions, unitats de conversió i més. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Tingues en compte:<ph name="END_BOLD" /> pots canviar aquesta opció més endavant a la configuració de l'Assistent de Google > Informació relacionada.</translation> <translation id="1143142264369994168">Signant del certificat</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome no ha trobat programari nociu a l'ordinador • S'ha comprovat fa 1 minut}other{Chrome no ha trobat programari nociu a l'ordinador • S'ha comprovat fa {NUM_MINS} minuts}}</translation> <translation id="1145593918056169051">La impressora s'ha aturat</translation> @@ -1435,7 +1438,9 @@ <translation id="2594999711683503743">Cerca a Google o escriu l'URL</translation> <translation id="2602501489742255173">Llisca cap amunt per començar</translation> <translation id="2603115962224169880">Neteja l'ordinador</translation> +<translation id="2603355571917519942">Voice Match està a punt</translation> <translation id="2603463522847370204">Obre-ho en una &finestra d'incògnit</translation> +<translation id="2604138917550693049">Cerca una imatge amb Google Lens</translation> <translation id="2604255671529671813">Error de connexió a la xarxa</translation> <translation id="2606246518223360146">Enllaça les dades</translation> <translation id="2606454609872547359">No, continua sense ChromeVox</translation> @@ -1778,6 +1783,7 @@ <translation id="2963151496262057773">El connector següent no respon: <ph name="PLUGIN_NAME" />. Voleu aturar-lo?</translation> <translation id="2964193600955408481">Desactiva la Wi-Fi</translation> <translation id="2964245677645334031">Visibilitat de Compartició Nearby</translation> +<translation id="2966216232069818096">Permet que l'Assistent utilitzi informació de la pantalla per ajudar-te</translation> <translation id="2966937470348689686">Gestiona les preferències d'Android</translation> <translation id="2972581237482394796">&Refés</translation> <translation id="2973324205039581528">Silencia el lloc web</translation> @@ -1874,6 +1880,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Aquesta pestanya utilitza la càmera o el micròfon.</translation> <translation id="3083193146044397360">S'ha bloquejat de manera temporal per protegir la teva seguretat</translation> +<translation id="3083899879156272923">Mou la pantalla i mantén el ratolí al centre</translation> <translation id="3084548735795614657">Desplegueu per instal·lar</translation> <translation id="3084771660770137092">Chrome s'ha quedat sense memòria, o bé el procés de la pàgina web s'ha cancel·lat per algun altre motiu. Per continuar, torneu-la a carregar o aneu a una altra pàgina.</translation> <translation id="3084958266922136097">Desactiva l'estalvi de pantalla</translation> @@ -2369,6 +2376,9 @@ <translation id="3654045516529121250">Consultar la configuració d'accessibilitat</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Té accés permanent a un fitxer.}other{Té accés permanent a # fitxers.}}</translation> <translation id="3658871634334445293">Acceleració TrackPoint</translation> +<translation id="3659830472545192450">Voice Match ajuda l'Assistent de Google a identificar la teva veu al teu Chromebook i a distingir-te d'altres persones. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Tingues en compte:<ph name="END_BOLD" /> és possible que una veu o una gravació similars també tinguin accés als teus resultats personals. Pots suprimir el permís de Voice Match més tard desactivant-lo a Configuració de l'Assistent.</translation> <translation id="3660234220361471169">No és de confiança</translation> <translation id="3664511988987167893">Icona de l'extensió</translation> <translation id="3665589677786828986">Chrome ha detectat que un altre programa ha malmès alguns dels paràmetres de configuració i els ha restablert als valors predeterminats originals.</translation> @@ -2976,7 +2986,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> està compartint una finestra.</translation> <translation id="4364830672918311045">Mostra les notificacions</translation> <translation id="4366138410738374926">La impressió ha començat</translation> -<translation id="437004882363131692">Obtén consells, ofertes i informació sobre <ph name="DEVICE_TYPE" />, i envia suggeriments. Pots cancel·lar la subscripció en qualsevol moment.</translation> <translation id="4370425812909262207">Els carretons s'han amagat. Es tornaran a mostrar quan facis canvis.</translation> <translation id="4370975561335139969">El correu electrònic i la contrasenya indicats no coincideixen</translation> <translation id="4374831787438678295">Instal·lador de Linux</translation> @@ -3556,6 +3565,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">El corrector ortogràfic no és compatible amb els idiomes que has seleccionat</translation> <translation id="5052499409147950210">Edita el lloc</translation> +<translation id="5053962746715621840">Cerca una imatge amb Google Lens</translation> <translation id="5057110919553308744">Quan facis clic a l'extensió</translation> <translation id="5057403786441168405">Gestiona els comptes en què tens la sessió iniciada. És possible que els llocs web, les aplicacions i les extensions de Chrome i Google Play utilitzin aquests comptes per personalitzar la teva experiència, en funció dels permisos. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Restringeix l'inici de sessió</translation> @@ -4041,6 +4051,9 @@ <translation id="5610038042047936818">Canvia al mode de càmera</translation> <translation id="561030196642865721">Les galetes de tercers es permeten en aquest lloc web</translation> <translation id="5612734644261457353">Encara no s'ha pogut verificar la contrasenya. Nota: Si l'has canviat fa poc, la contrasenya nova s'aplicarà un cop hagis tancat la sessió. Fes servir la contrasenya anterior aquí.</translation> +<translation id="561308544008485315">Voice Match ajuda l'Assistent de Google a identificar la teva veu al teu Chromebook i a distingir-te d'altres persones. Per estalviar bateria, la funció "Hey Google" només estarà activada quan el dispositiu estigui connectat a una font d'alimentació. Per fer canvis, ves a Configuració. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Tingues en compte:<ph name="END_BOLD" /> és possible que una veu o una gravació similars també tinguin accés als teus resultats personals. Pots suprimir el permís de Voice Match més tard desactivant-lo a Configuració de l'Assistent.</translation> <translation id="5614190747811328134">Avís per a l'usuari </translation> <translation id="5614553682702429503">Vols desar la contrasenya?</translation> <translation id="5616726534702877126">Reserva la mida</translation> @@ -5072,6 +5085,7 @@ <translation id="6824584962142919697">&Inspecciona els elements</translation> <translation id="6825184156888454064">Ordena per nom</translation> <translation id="6826872289184051766">Verifica la teva identitat per USB</translation> +<translation id="6827604573767207488">Sembla que ja has configurat un Assistent personalitzat en un altre dispositiu. Treu encara més partit del teu Assistent activant l'opció de configuració següent.</translation> <translation id="6828153365543658583">Restringeix l'inici de sessió als usuaris següents:</translation> <translation id="6828182567531805778">Introdueix la teva frase de contrasenya per sincronitzar les dades</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5507,6 +5521,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> ha desactivat la depuració d'ADB. Quan reiniciïs el teu dispositiu <ph name="DEVICE_TYPE" />, no podràs instal·lar aplicacions externament.</translation> <translation id="7328867076235380839">La combinació no és vàlida</translation> <translation id="7329154610228416156">S'ha produït un problema en iniciar la sessió perquè s'ha configurat per utilitzar un URL no segur (<ph name="BLOCKED_URL" />). Contacteu amb l'administrador.</translation> +<translation id="7329932885428707942">Aquesta acció pot fer que la xarxa mòbil es desconnecti breument.</translation> <translation id="7332053360324989309">Dedicated Worker: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Activa la lupa acoblada</translation> <translation id="7335974957018254119">Fes servir el corrector ortogràfic per a</translation> @@ -5550,6 +5565,7 @@ <translation id="7374376573160927383">Gestiona els dispositius USB</translation> <translation id="7375235221357833624">{0,plural, =1{Actualitza el dispositiu en 1 hora}other{Actualitza el dispositiu en # hores}}</translation> <translation id="7376553024552204454">Destaca el cursor del ratolí quan es mogui</translation> +<translation id="737728204345822099">La clau de seguretat pot conservar un registre de la teva visita en aquest lloc web.</translation> <translation id="7377451353532943397">Continua bloquejant l'accés als sensors</translation> <translation id="7378611153938412599">Les contrasenyes poc segures són fàcils d'endevinar. Assegura't de crear contrasenyes segures. <ph name="BEGIN_LINK" />Consulta més consells de seguretat<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Obre Chrome Web Store</translation> @@ -6177,6 +6193,7 @@ <translation id="8059417245945632445">&Inspecciona els dispositius</translation> <translation id="8059456211585183827">No hi ha cap impressora disponible per desar.</translation> <translation id="8061091456562007989">Torna-ho a canviar</translation> +<translation id="8061991877177392872">Sembla que ja has configurat Voice Match amb l'Assistent en un altre dispositiu. Aquestes gravacions anteriors s'han utilitzat per crear un model de veu en aquest dispositiu.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 full de paper}other{{COUNT} fulls de paper}}</translation> <translation id="8062879968880283306">Escaneja el codi QR amb la càmera del dispositiu o introdueix el codi d'activació que t'ha proporcionat l'operador.</translation> <translation id="8063235345342641131">Avatar verd predeterminat</translation> @@ -6448,6 +6465,7 @@ <translation id="8379991678458444070">Afegeix aquesta pestanya a les adreces d'interès per poder-hi tornar ràpidament</translation> <translation id="8382913212082956454">Copia l'&adreça electrònica</translation> <translation id="8386091599636877289">No s'ha trobat la política.</translation> +<translation id="8386819192691131213">Permet que l'Assistent utilitzi informació de la pantalla per oferir-te respostes ràpides, com ara traduccions, definicions, unitats de conversió i més</translation> <translation id="8386903983509584791">S'ha completat la cerca</translation> <translation id="8387361103813440603">Sense permís per veure la teva ubicació</translation> <translation id="8389264703141926739">Bloqueja les notificacions</translation> @@ -6930,6 +6948,7 @@ <translation id="8915370057835397490">S'estan carregant els suggeriments</translation> <translation id="8916476537757519021">Submarc d'incògnit: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Mou la pantalla quan el ratolí toqui les vores de la pantalla</translation> <translation id="8923880975836399332">Verd blavós fosc</translation> <translation id="8925458182817574960">&Configuració</translation> <translation id="8926389886865778422">No m'ho tornis a preguntar</translation> @@ -7008,6 +7027,7 @@ <translation id="9009708085379296446">Volies canviar aquesta pàgina?</translation> <translation id="9011163749350026987">Mostra sempre la icona</translation> <translation id="9011393886518328654">Notes de la versió</translation> +<translation id="9012122671773859802">Mou la pantalla contínuament mentre es mou el ratolí</translation> <translation id="9013037634206938463">Cal tenir almenys <ph name="INSTALL_SIZE" /> d'espai lliure per instal·lar Linux. Per augmentar l'espai lliure, suprimeix fitxers del dispositiu.</translation> <translation id="9013707997379828817">L'administrador ha canviat la versió del dispositiu a una d'anterior. Desa els fitxers importants i, després, reinicia el dispositiu. Se'n suprimiran totes les dades.</translation> <translation id="901668144954885282">Còpia de seguretat a Google Drive</translation> @@ -7052,6 +7072,7 @@ <translation id="9052404922357793350">Continua bloquejant</translation> <translation id="9053563360605707198">Imprimeix per les dues bandes</translation> <translation id="9053893665344928494">Recorda la meva tria</translation> +<translation id="9055278955535611574">Accedeix a l'Assistent amb "Hey Google"</translation> <translation id="9055636786322918818">Força l'encriptació RC4. L'ús d'aquesta opció augmenta el risc, ja que els xifratges RC4 no són segurs.</translation> <translation id="9056810968620647706">No s'ha trobat cap coincidència.</translation> <translation id="9057354806206861646">Actualitza la programació</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 0062278b..47eef67 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Přistupovat k zařízením připojeným přes Bluetooth a sériový port</translation> <translation id="114036956334641753">Zvuk a titulky</translation> <translation id="1140746652461896221">Blokovat obsah na každé navštívené stránce</translation> +<translation id="1141953877381847186">Povolí Asistentovi využívat informace na obrazovce k poskytování rychlých odpovědí, jako jsou překlady, definice, převody jednotek apod. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Mějte na paměti:<ph name="END_BOLD" /> Toto nastavení můžete později kdykoliv změnit v sekci Nastavení Asistenta Google > Související informace.</translation> <translation id="1143142264369994168">Autor podpisu certifikátu</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome v počítači nenašel žádný škodlivý software • Zkontrolováno před minutou}few{Chrome v počítači nenašel žádný známý škodlivý software • Zkontrolováno před {NUM_MINS} minutami}many{Chrome v počítači nenašel žádný známý škodlivý software • Zkontrolováno před {NUM_MINS} minuty}other{Chrome v počítači nenašel žádný známý škodlivý software • Zkontrolováno před {NUM_MINS} minutami}}</translation> <translation id="1145593918056169051">Tiskárna přestala fungovat</translation> @@ -1437,7 +1440,9 @@ <translation id="2594999711683503743">Vyhledávejte na Googlu nebo zadejte adresu URL</translation> <translation id="2602501489742255173">Začněte přejetím nahoru</translation> <translation id="2603115962224169880">Vyčištění počítače</translation> +<translation id="2603355571917519942">Funkce Voice Match je připravena</translation> <translation id="2603463522847370204">Otevřít v &anonymním okně</translation> +<translation id="2604138917550693049">Vyhledat obrázek pomocí Google Lens</translation> <translation id="2604255671529671813">Chyba připojení k síti</translation> <translation id="2606246518223360146">Propojit data</translation> <translation id="2606454609872547359">Ne, pokračovat bez čtečky ChromeVox</translation> @@ -1780,6 +1785,7 @@ <translation id="2963151496262057773">Následující plugin nereaguje: <ph name="PLUGIN_NAME" /> Chcete jej zastavit?</translation> <translation id="2964193600955408481">Vypnout Wi-Fi</translation> <translation id="2964245677645334031">Viditelnost pro sdílení na blízko</translation> +<translation id="2966216232069818096">Povolit Asistentovi číst informace na obrazovce, aby vám mohl pomáhat</translation> <translation id="2966937470348689686">Spravovat nastavení aplikací Android</translation> <translation id="2972581237482394796">&Opakovat</translation> <translation id="2973324205039581528">Ztlumit web</translation> @@ -1876,6 +1882,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Tato karta používá vaši kameru nebo mikrofon.</translation> <translation id="3083193146044397360">Dočasně zablokováno z důvodu ochrany vaší bezpečnosti</translation> +<translation id="3083899879156272923">Posouvat obrazovku tak, aby ukazatel myši zůstal uprostřed obrazovky</translation> <translation id="3084548735795614657">Nainstalujte přetažením</translation> <translation id="3084771660770137092">Buď má Google Chrome nedostatek paměti, nebo byl proces načítání webové stránky ukončen z jiného důvodu. Chcete-li pokračovat, načtěte stránku znovu, nebo přejděte na jinou stránku.</translation> <translation id="3084958266922136097">Deaktivovat spořič obrazovky</translation> @@ -2371,6 +2378,9 @@ <translation id="3654045516529121250">Čtení nastavení usnadnění přístupu</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Má trvalý přístup k jednomu souboru.}few{Má trvalý přístup ke # souborům.}many{Má trvalý přístup k # souboru.}other{Má trvalý přístup k # souborům.}}</translation> <translation id="3658871634334445293">Akcelerace TrackPointu</translation> +<translation id="3659830472545192450">Voice Match pomáhá Asistentovi Google identifikovat váš hlas a rozpoznat vás od ostatních. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Mějte na paměti:<ph name="END_BOLD" /> K vašim osobním výsledkům může získat přístup také někdo s podobným hlasem nebo nahrávkou vašeho hlasu. Oprávnění k rozpoznávání hlasu Voice Match můžete později odebrat tím, že je vypnete v nastavení Asistenta.</translation> <translation id="3660234220361471169">Nedůvěryhodný</translation> <translation id="3664511988987167893">Ikona rozšíření</translation> <translation id="3665589677786828986">Prohlížeč Chrome zjistil, že některá z vašich nastavení byla upravena jiným programem, a obnovil je na původní výchozí hodnoty.</translation> @@ -2978,7 +2988,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> sdílí okno.</translation> <translation id="4364830672918311045">Zobrazování oznámení</translation> <translation id="4366138410738374926">Tisk byl zahájen</translation> -<translation id="437004882363131692">Nechte si zasílat tipy, nabídky a aktuality týkající se zařízení <ph name="DEVICE_TYPE" /> a poskytujte nám zpětnou vazbu. Můžete se kdykoli odhlásit.</translation> <translation id="4370425812909262207">Nákupní košíky byly skryty. Znovu se objeví, když provedete změny.</translation> <translation id="4370975561335139969">Zadaný e-mail a heslo se neshodují.</translation> <translation id="4374831787438678295">Instalační program Linuxu</translation> @@ -3558,6 +3567,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">V jazycích, které jste zadali, není kontrola pravopisu podporována</translation> <translation id="5052499409147950210">Upravit web</translation> +<translation id="5053962746715621840">Vyhledat obrázek pomocí Google Lens</translation> <translation id="5057110919553308744">Když kliknete na rozšíření</translation> <translation id="5057403786441168405">Spravujte účty, ve kterých jste přihlášeni. V závislosti na oprávněních vám weby, aplikace a rozšíření v Chromu a na Google Play pomocí těchto účtů mohou přizpůsobovat prostředí. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Omezit přihlášení</translation> @@ -4042,6 +4052,9 @@ <translation id="5610038042047936818">Přepnout na režim fotoaparátu</translation> <translation id="561030196642865721">Soubory cookie třetích stran jsou na tomto webu povoleny</translation> <translation id="5612734644261457353">Je nám líto, vaše heslo se stále nedaří ověřit. Poznámka: Pokud jste heslo nedávno změnili, vaše nové heslo bude použitelné až po odhlášení. Použijte své staré heslo.</translation> +<translation id="561308544008485315">Voice Match pomáhá Asistentovi Google identifikovat váš hlas a rozpoznat vás od ostatních. Kvůli úspoře baterie je příkaz „Ok Google“ zapnutý, jen když je zařízení připojené ke zdroji napájení. Pokud chcete provést změny, přejděte do Nastavení. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Mějte na paměti:<ph name="END_BOLD" /> K vašim osobním výsledkům může získat přístup také někdo s podobným hlasem nebo nahrávkou vašeho hlasu. Oprávnění k rozpoznávání hlasu Voice Match můžete později odebrat tím, že je vypnete v nastavení Asistenta.</translation> <translation id="5614190747811328134">Sdělení pro uživatele</translation> <translation id="5614553682702429503">Uložit heslo?</translation> <translation id="5616726534702877126">Rezervovat</translation> @@ -5072,6 +5085,7 @@ <translation id="6824584962142919697">&Prozkoumat prvky</translation> <translation id="6825184156888454064">Seřadit podle názvu</translation> <translation id="6826872289184051766">Ověřit přes USB</translation> +<translation id="6827604573767207488">Zdá se, že už jste si personalizovaného Asistenta nastavili na jiném zařízení. Když zapnete následující nastavení, Asistent bude ještě užitečnější.</translation> <translation id="6828153365543658583">Omezit přihlášení na následující uživatele:</translation> <translation id="6828182567531805778">Chcete-li synchronizovat data, zadejte heslovou frázi</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5507,6 +5521,7 @@ <translation id="7327989755579928735">Web <ph name="MANAGER" /> deaktivoval ladění ADB. Až zařízení <ph name="DEVICE_TYPE" /> restartujete, nebudete moci instalovat aplikace z neznámého zdroje.</translation> <translation id="7328867076235380839">Neplatná kombinace</translation> <translation id="7329154610228416156">Přihlášení se nezdařilo, protože bylo nakonfigurováno k použití nezabezpečené adresy URL (<ph name="BLOCKED_URL" />). Obraťte se na svého administrátora.</translation> +<translation id="7329932885428707942">Tato akce může vést ke krátkému odpojení od mobilní sítě.</translation> <translation id="7332053360324989309">Vyhrazený pracovník: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Zapnout zabudovanou lupu</translation> <translation id="7335974957018254119">Používat kontrolu pravopisu pro</translation> @@ -5550,6 +5565,7 @@ <translation id="7374376573160927383">Spravovat zařízení USB</translation> <translation id="7375235221357833624">{0,plural, =1{Do hodiny zařízení aktualizujte}few{Do # hodin zařízení aktualizujte}many{Do # hodiny zařízení aktualizujte}other{Do # hodin zařízení aktualizujte}}</translation> <translation id="7376553024552204454">Zvýraznit ukazatel myši, když se pohybuje.</translation> +<translation id="737728204345822099">Na bezpečnostním klíči zůstane záznam o návštěvě tohoto webu.</translation> <translation id="7377451353532943397">I nadále blokovat přístup k senzorům</translation> <translation id="7378611153938412599">Slabá hesla lze snadno uhodnout. Vždy se snažte vytvářet silná hesla. <ph name="BEGIN_LINK" />Další tipy k zabezpečení<ph name="END_LINK" /></translation> <translation id="73786666777299047">Otevřít Internetový obchod Chrome</translation> @@ -6177,6 +6193,7 @@ <translation id="8059417245945632445">&Zkontrolovat zařízení</translation> <translation id="8059456211585183827">Nejsou k dispozici žádné tiskárny k uložení.</translation> <translation id="8061091456562007989">Vrátit změnu</translation> +<translation id="8061991877177392872">Funkci rozpoznání hlasu Voice Match jste u Asistenta už zřejmě nastavili v jiném zařízení. Dřívější nahrávky byly použity k vytvoření hlasového modelu v tomto zařízení.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 list papíru}few{{COUNT} listy papíru}many{{COUNT} listu papíru}other{{COUNT} listů papíru}}</translation> <translation id="8062879968880283306">Pomocí fotoaparátu zařízení naskenujte QR kód nebo zadejte aktivační kód, který vám poskytl operátor.</translation> <translation id="8063235345342641131">Výchozí zelený avatar</translation> @@ -6447,6 +6464,7 @@ <translation id="8379991678458444070">Přidejte si tuto kartu do záložek, abyste se sem mohli rychle vrátit</translation> <translation id="8382913212082956454">Kopírovat &e-mailovou adresu</translation> <translation id="8386091599636877289">Zásady nebyly nalezeny.</translation> +<translation id="8386819192691131213">Povolí Asistentovi využívat informace na obrazovce k poskytování rychlých odpovědí, jako jsou překlady, definice, převody jednotek apod.</translation> <translation id="8386903983509584791">Vyhledávání je dokončeno</translation> <translation id="8387361103813440603">Zákaz přístupu k vaší poloze</translation> <translation id="8389264703141926739">Blokovat oznámení</translation> @@ -6931,6 +6949,7 @@ <translation id="8915370057835397490">Načítá se návrh</translation> <translation id="8916476537757519021">Anonymní podrámec: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />: <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">Posunout obrazovku, když se myš dotkne okraje obrazovky</translation> <translation id="8923880975836399332">Tmavě tyrkysová</translation> <translation id="8925458182817574960">&Nastavení</translation> <translation id="8926389886865778422">Dotaz již nezobrazovat</translation> @@ -7009,6 +7028,7 @@ <translation id="9009708085379296446">Chtěli jste tuto stránku změnit?</translation> <translation id="9011163749350026987">Vždy zobrazovat ikonu</translation> <translation id="9011393886518328654">Poznámky k vydání</translation> +<translation id="9012122671773859802">Při pohybu myši posouvat obrazovku souvisle</translation> <translation id="9013037634206938463">K instalaci Linuxu je potřeba <ph name="INSTALL_SIZE" /> volného místa. Místo uvolníte smazáním souborů ze zařízení.</translation> <translation id="9013707997379828817">Administrátor v tomto zařízení obnovil předchozí verzi systému. Uložte důležité soubory a poté zařízení restartujte. Veškerá data v zařízení budou ztracena.</translation> <translation id="901668144954885282">Zálohovat na Disk Google</translation> @@ -7053,6 +7073,7 @@ <translation id="9052404922357793350">Pokračovat v blokování</translation> <translation id="9053563360605707198">Oboustranný tisk</translation> <translation id="9053893665344928494">Zapamatovat si výběr</translation> +<translation id="9055278955535611574">Aktivovat Asistenta povelem „Ok Google“</translation> <translation id="9055636786322918818">Vynutit šifrování RC4. Použití této možnosti zvyšuje riziko, protože šifry RC4 nejsou bezpečné.</translation> <translation id="9056810968620647706">Nebyly nalezeny žádné shody.</translation> <translation id="9057354806206861646">Plán aktualizací</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index ef9dd86..05063d88 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Få adgang til dine Bluetooth- og serieenheder</translation> <translation id="114036956334641753">Lyd og undertekster</translation> <translation id="1140746652461896221">Bloker indhold på en hvilken som helst side, du besøger</translation> +<translation id="1141953877381847186">Giv Google Assistent tilladelse til at anvende oplysninger på skærmen til at give hurtige svar, f.eks. i forbindelse med oversættelse, definitioner og enhedsomregning. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Husk!<ph name="END_BOLD" /> Du kan altid ændre dette på et senere tidspunkt i indstillingerne for Google Assistent > Relaterede oplysninger.</translation> <translation id="1143142264369994168">Certifikatunderskriver</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome registrerede ikke skadelig software på din computer • Tjekket for 1 minut siden}one{Chrome registrerede ikke skadelig software på din computer • Tjekket for {NUM_MINS} minut siden}other{Chrome registrerede ikke skadelig software på din computer • Tjekket for {NUM_MINS} minutter siden}}</translation> <translation id="1145593918056169051">Printeren er stoppet</translation> @@ -1437,7 +1440,9 @@ <translation id="2594999711683503743">Søg på Google, eller angiv webadressen</translation> <translation id="2602501489742255173">Stryg opad for at komme i gang</translation> <translation id="2603115962224169880">Ryd op på computeren</translation> +<translation id="2603355571917519942">Voice Match er klar</translation> <translation id="2603463522847370204">Åbn i &inkognitovindue</translation> +<translation id="2604138917550693049">Søg efter billede med Google Lens</translation> <translation id="2604255671529671813">Fejl i netværksforbindelsen</translation> <translation id="2606246518223360146">Tilknyt data</translation> <translation id="2606454609872547359">Nej, fortsæt uden ChromeVox</translation> @@ -1780,6 +1785,7 @@ <translation id="2963151496262057773">Følgende plugins svarer ikke: <ph name="PLUGIN_NAME" />Vil du stoppe det?</translation> <translation id="2964193600955408481">Deaktiver Wi-Fi</translation> <translation id="2964245677645334031">Synlighed for Deling tæt på</translation> +<translation id="2966216232069818096">Giv Google Assistent tilladelse til at anvende oplysninger på din skærm for at hjælpe dig</translation> <translation id="2966937470348689686">Administrer Android-præferencer</translation> <translation id="2972581237482394796">&Annuller fortryd</translation> <translation id="2973324205039581528">Slå lyden fra på dette website</translation> @@ -1876,6 +1882,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Denne fane anvender dit kamera eller din mikrofon.</translation> <translation id="3083193146044397360">Tilladelsen er midlertidigt blokeret for at beskytte dine personlige oplysninger</translation> +<translation id="3083899879156272923">Flyt skærmen, mens markøren forbliver midt på skærmen</translation> <translation id="3084548735795614657">Slip for at installere</translation> <translation id="3084771660770137092">Chrome løb tør for hukommelse, eller processen for websiden blev afbrudt af en anden grund. Genindlæs eller gå til en anden side for at fortsætte.</translation> <translation id="3084958266922136097">Deaktiver Pauseskærm</translation> @@ -2371,6 +2378,9 @@ <translation id="3654045516529121250">Læse dine indstillinger for hjælpefunktioner</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Den har permanent adgang til én fil.}one{Den har permanent adgang til # filer.}other{Den har permanent adgang til # filer.}}</translation> <translation id="3658871634334445293">TrackPoint-acceleration</translation> +<translation id="3659830472545192450">Voice Match hjælper Google Assistent med at identificere din stemme på din Chromebook, så den undgår at forveksle dig med andre. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Husk!<ph name="END_BOLD" /> En lignende stemme eller en optagelse af din stemme kan muligvis også bruges til at få adgang til dit personlige indhold. Du kan fjerne tilladelsen til Voice Match på et senere tidspunkt ved at deaktivere funktionen i indstillingerne for Google Assistent.</translation> <translation id="3660234220361471169">Ikke pålidelig</translation> <translation id="3664511988987167893">Udvidelsesikon</translation> <translation id="3665589677786828986">Chrome har registreret, at nogle af dine indstillinger er blevet ændret af et andet program, og har derfor gendannet standardindstillingerne.</translation> @@ -2979,7 +2989,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> deler et vindue.</translation> <translation id="4364830672918311045">Vis notifikationer</translation> <translation id="4366138410738374926">Udskriver</translation> -<translation id="437004882363131692">Få tips, tilbud og opdateringer i forbindelse med <ph name="DEVICE_TYPE" />, og giv feedback. Du kan til enhver tid afmelde dette.</translation> <translation id="4370425812909262207">Indkøbskurve er skjult. De vises igen, når du foretager ændringer.</translation> <translation id="4370975561335139969">Den mail og adgangskode, du indtastede, stemmer ikke overens</translation> <translation id="4374831787438678295">Linux-installationsprogram</translation> @@ -3559,6 +3568,7 @@ <translation id="5050330054928994520">Oplæsning</translation> <translation id="5051836348807686060">Stavekontrol understøttes ikke for de sprog, du har valgt</translation> <translation id="5052499409147950210">Rediger website</translation> +<translation id="5053962746715621840">Søg efter billede med Google Lens</translation> <translation id="5057110919553308744">Når du klikker på udvidelsen</translation> <translation id="5057403786441168405">Administrer de konti, hvor du er logget ind. Websites, apps og udvidelser i Chrome og Google Play kan bruge disse konti til at tilpasse din oplevelse afhængigt af tilladelserne. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Begræns login</translation> @@ -4043,6 +4053,9 @@ <translation id="5610038042047936818">Skift til kameratilstand</translation> <translation id="561030196642865721">Cookies fra tredjeparter er tilladt på dette website</translation> <translation id="5612734644261457353">Din adgangskode kunne desværre stadig ikke bekræftes. Bemærk! Hvis du har ændret din adgangskode for nylig, anvendes din nye adgangskode først, når du har logget ud. Du skal bruge den gamle adgangskode her.</translation> +<translation id="561308544008485315">Voice Match hjælper Google Assistent med at identificere din stemme på din Chromebook, så den undgår at forveksle dig med andre. "Hey Google" er kun aktiveret, når din enhed er sluttet til en strømkilde, så du sparer på batteriet. Gå til Indstillinger for at foretage ændringer. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Husk!<ph name="END_BOLD" /> En lignende stemme eller en optagelse af din stemme kan muligvis også bruges til at få adgang til dit personlige indhold. Du kan fjerne tilladelsen til Voice Match på et senere tidspunkt ved at deaktivere funktionen i indstillingerne for Google Assistent.</translation> <translation id="5614190747811328134">Brugerbesked</translation> <translation id="5614553682702429503">Vil du gemme adgangskoden?</translation> <translation id="5616726534702877126">Reservér størrelse</translation> @@ -5073,6 +5086,7 @@ <translation id="6824584962142919697">&Inspect elements (Undersøg elementer)</translation> <translation id="6825184156888454064">Sorter efter navn</translation> <translation id="6826872289184051766">Bekræft via USB</translation> +<translation id="6827604573767207488">Det ser ud til, at du allerede har konfigureret Google Assistent på en anden enhed. Du kan få endnu mere ud af Google Assistent ved at aktivere følgende indstilling.</translation> <translation id="6828153365543658583">Begræns login for følgende brugere:</translation> <translation id="6828182567531805778">Angiv din adgangssætning for at synkronisere dine data</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5508,6 +5522,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> har deaktiveret ADB-fejlretning. Når du har genstartet din <ph name="DEVICE_TYPE" />, vil du ikke kunne sideindlæse apps.</translation> <translation id="7328867076235380839">Ugyldig kombination</translation> <translation id="7329154610228416156">Login mislykkedes, da det er konfigureret til at anvende en webadresse, der ikke er sikker (<ph name="BLOCKED_URL" />). Kontakt din administrator.</translation> +<translation id="7329932885428707942">Dette kan medføre en kort afbrydelse fra mobilnetværket.</translation> <translation id="7332053360324989309">Dedicated Worker: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Aktivér fastgjort lupvindue</translation> <translation id="7335974957018254119">Brug stavekontrol for</translation> @@ -5551,6 +5566,7 @@ <translation id="7374376573160927383">Administrer USB-enheder</translation> <translation id="7375235221357833624">{0,plural, =1{Genstart enheden inden for en time}one{Genstart enheden inden for # time}other{Genstart enheden inden for # timer}}</translation> <translation id="7376553024552204454">Fremhæv musemarkøren, når den bevæger sig</translation> +<translation id="737728204345822099">En registrering af dit besøg på dette website gemmes muligvis på din sikkerhedsnøgle.</translation> <translation id="7377451353532943397">Fortsæt blokering af adgang til sensorer</translation> <translation id="7378611153938412599">Svage adgangskoder er nemme at gætte. Sørg for at oprette en stærk adgangskode. <ph name="BEGIN_LINK" />Se flere sikkerhedstips<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Åbn Chrome Webshop</translation> @@ -6177,6 +6193,7 @@ <translation id="8059417245945632445">&Inspicer enheder</translation> <translation id="8059456211585183827">Der er ingen printere, som kan gemmes.</translation> <translation id="8061091456562007989">Skift tilbage</translation> +<translation id="8061991877177392872">Det ser ud til, at du allerede har konfigureret Voice Match med Google-assistenten på en anden enhed. Disse tidligere optagelser blev brugt til at oprette en stemmemodel på denne enhed.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 ark papir}one{{COUNT} ark papir}other{{COUNT} ark papir}}</translation> <translation id="8062879968880283306">Scan QR-koden ved hjælp af kameraet på enheden, eller angiv aktiveringskoden fra dit mobilselskab.</translation> <translation id="8063235345342641131">Grøn standardavatar</translation> @@ -6448,6 +6465,7 @@ <translation id="8379991678458444070">Tilføj denne fane som bogmærke, så du hurtigt kan vende tilbage hertil</translation> <translation id="8382913212082956454">Kopier mailadress&e</translation> <translation id="8386091599636877289">Politikken blev ikke fundet.</translation> +<translation id="8386819192691131213">Giv Google Assistent tilladelse til at anvende oplysninger på skærmen til at give hurtige svar, f.eks. i forbindelse med oversættelse, definitioner og enhedsomregning</translation> <translation id="8386903983509584791">Scanningen er udført</translation> <translation id="8387361103813440603">Har ikke tilladelse til at se din placering</translation> <translation id="8389264703141926739">Bloker notifikationer</translation> @@ -6932,6 +6950,7 @@ <translation id="8915370057835397490">Indlæser forslag</translation> <translation id="8916476537757519021">Underramme for inkognitotilstand: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> tilhørende <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Flyt skærmen, når markøren rammer kanten af skærmen</translation> <translation id="8923880975836399332">Mørk turkis</translation> <translation id="8925458182817574960">&Indstillinger</translation> <translation id="8926389886865778422">Spørg ikke igen</translation> @@ -7010,6 +7029,7 @@ <translation id="9009708085379296446">Ville du ændre denne side?</translation> <translation id="9011163749350026987">Vis altid ikon</translation> <translation id="9011393886518328654">Produktbemærkninger</translation> +<translation id="9012122671773859802">Flyt skærmen kontinuerligt, samtidig med at markøren flyttes</translation> <translation id="9013037634206938463">Du skal have <ph name="INSTALL_SIZE" /> ledig plads for at installere Linux. Du kan frigøre plads ved at slette filer fra enheden.</translation> <translation id="9013707997379828817">Din administrator har gendannet en tidligere version på denne enhed. Gem vigtige filer, og genstart. Alle data på enheden slettes.</translation> <translation id="901668144954885282">Sikkerhedskopiér til Google Drev</translation> @@ -7054,6 +7074,7 @@ <translation id="9052404922357793350">Fortsæt blokering</translation> <translation id="9053563360605707198">Udskriv på begge sider</translation> <translation id="9053893665344928494">Husk mit valg</translation> +<translation id="9055278955535611574">Få adgang til Google Assistent ved at sige "Hey Google"</translation> <translation id="9055636786322918818">Gennemtving RC4-kryptering. Du løber en større risiko, hvis du vælger denne mulighed, da RC4-krypteringsalgoritmerne er usikre.</translation> <translation id="9056810968620647706">Der blev ikke fundet resultater.</translation> <translation id="9057354806206861646">Tidsplan for opdateringer</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index d3f2a4f..9c1d36c 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Auf Ihre Bluetooth- und seriellen Geräte zugreifen</translation> <translation id="114036956334641753">Audio und Untertitel</translation> <translation id="1140746652461896221">Inhalte auf allen Seiten blockieren, die Sie aufrufen</translation> +<translation id="1141953877381847186">Sie können Assistant erlauben, Informationen auf dem Bildschirm zu verwenden, um schnelle Antworten zu geben – beispielsweise Übersetzungen, Definitionen oder Umrechnung von Einheiten. + <ph name="BR" /> +<ph name="BEGIN_BOLD" />Hinweis<ph name="END_BOLD" />: Dies kann jederzeit in den Google Assistant-Einstellungen > „Bildschirmkontext verwenden“ geändert werden.</translation> <translation id="1143142264369994168">Signaturgeber des Zertifikats</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome hat auf Ihrem Computer keine schädliche Software gefunden • Vor 1 Minute geprüft}other{Chrome hat auf Ihrem Computer keine schädliche Software gefunden • Vor {NUM_MINS} Minuten geprüft}}</translation> <translation id="1145593918056169051">Drucker hat aufgehört</translation> @@ -1428,7 +1431,9 @@ <translation id="2594999711683503743">Bei Google suchen oder URL eingeben</translation> <translation id="2602501489742255173">Zum Starten nach oben wischen</translation> <translation id="2603115962224169880">Computer bereinigen</translation> +<translation id="2603355571917519942">Voice Match ist bereit</translation> <translation id="2603463522847370204">In &Inkognito-Fenster öffnen</translation> +<translation id="2604138917550693049">Bild mit Google Lens suchen</translation> <translation id="2604255671529671813">Fehler bei der Netzwerkverbindung</translation> <translation id="2606246518223360146">Daten verknüpfen</translation> <translation id="2606454609872547359">Nein, ohne ChromeVox fortfahren</translation> @@ -1770,6 +1775,7 @@ <translation id="2963151496262057773">Das folgende Plug-in reagiert nicht: <ph name="PLUGIN_NAME" />. Möchten Sie es anhalten?</translation> <translation id="2964193600955408481">WLAN deaktivieren</translation> <translation id="2964245677645334031">Nearby Share-Sichtbarkeit</translation> +<translation id="2966216232069818096">Zulassen, dass Assistant Informationen auf dem Bildschirm verwendet</translation> <translation id="2966937470348689686">Android-Einstellungen verwalten</translation> <translation id="2972581237482394796">&Wiederholen</translation> <translation id="2973324205039581528">Website stummschalten</translation> @@ -1865,6 +1871,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Dieser Tab verwendet Ihre Kamera oder Ihr Mikrofon.</translation> <translation id="3083193146044397360">Vorübergehend blockiert, um Ihre Privatsphäre zu schützen</translation> +<translation id="3083899879156272923">Maus beim Bewegen des Bildschirms in der Mitte halten</translation> <translation id="3084548735795614657">Zum Installieren ablegen</translation> <translation id="3084771660770137092">Entweder verfügt Google Chrome nicht mehr über genügend Arbeitsspeicher oder der Prozess für die Webseite wurde aus einem anderen Grund beendet. Aktualisieren Sie die Seite oder rufen Sie eine andere Seite auf.</translation> <translation id="3084958266922136097">Bildschirmschoner deaktivieren</translation> @@ -2358,6 +2365,9 @@ <translation id="3654045516529121250">Einstellungen für Bedienungshilfen lesen</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Dauerhafter Zugriff auf eine Datei}other{Dauerhafter Zugriff auf # Dateien}}</translation> <translation id="3658871634334445293">TrackPoint-Beschleunigung</translation> +<translation id="3659830472545192450">Mit Voice Match kann Google Assistant Ihre Stimme auf dem Chromebook erkennen und sie von anderen unterscheiden. + <ph name="BR" /> +<ph name="BEGIN_BOLD" />Hinweis<ph name="END_BOLD" />: Eine andere Person mit einer ähnlichen Stimme oder einer Aufnahme Ihrer Stimme kann möglicherweise auf Ihre persönlichen Ergebnisse zugreifen. Sie können die Voice Match-Berechtigung später in den Assistant-Einstellungen deaktivieren.</translation> <translation id="3660234220361471169">Nicht vertrauenswürdig</translation> <translation id="3664511988987167893">Erweiterungssymbol</translation> <translation id="3665589677786828986">Chrome hat festgestellt, dass einige Ihrer Einstellungen von einem anderen Programm manipuliert wurden, und hat sie auf die ursprünglichen Standardwerte zurückgesetzt.</translation> @@ -2964,7 +2974,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> hat ein Fenster freigegeben.</translation> <translation id="4364830672918311045">Benachrichtigungen einblenden</translation> <translation id="4366138410738374926">Druckvorgang gestartet</translation> -<translation id="437004882363131692">Hier können Sie angeben, ob Sie Tipps, Angebote und Neuigkeiten rund um <ph name="DEVICE_TYPE" /> erhalten und Feedback geben möchten. Sie können sich jederzeit wieder abmelden.</translation> <translation id="4370425812909262207">Einkaufswagen ausgeblendet. Sie werden wieder angezeigt, wenn Sie Änderungen vornehmen.</translation> <translation id="4370975561335139969">Die E-Mail-Adresse und das Passwort, die Sie eingegeben haben, stimmen nicht überein.</translation> <translation id="4374831787438678295">Linux-Installationsprogramm</translation> @@ -3541,6 +3550,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Die Rechtschreibprüfung wird für die ausgewählten Sprachen nicht unterstützt</translation> <translation id="5052499409147950210">Website bearbeiten</translation> +<translation id="5053962746715621840">Bild mit Google Lens suchen</translation> <translation id="5057110919553308744">Wenn die Erweiterung angeklickt wird</translation> <translation id="5057403786441168405">Hier können Sie Ihre angemeldeten Konten verwalten. Websites, Apps und Erweiterungen in Chrome und Google Play können diese Konten verwenden, um Ihnen – je nach den jeweiligen Berechtigungen – personalisierte Inhalte anzuzeigen. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Anmeldung beschränken</translation> @@ -4023,6 +4033,9 @@ <translation id="5610038042047936818">Zum Kameramodus wechseln</translation> <translation id="561030196642865721">Drittanbieter-Cookies sind auf dieser Website erlaubt</translation> <translation id="5612734644261457353">Ihr Passwort konnte leider immer noch nicht bestätigt werden. Hinweis: Falls Sie Ihr Passwort kürzlich geändert haben, wird Ihr neues Passwort übernommen, sobald Sie sich abmelden. Verwenden Sie hier das alte Passwort.</translation> +<translation id="561308544008485315">Mit Voice Match kann Google Assistant Ihre Stimme auf dem Chromebook erkennen und sie von anderen unterscheiden. Damit der Akku geschont wird, wird „Hey Google“ nur dann aktiviert, wenn Ihr Gerät an eine Stromquelle angeschlossen ist. Änderungen können Sie in den Einstellungen vornehmen. + <ph name="BR" /> +<ph name="BEGIN_BOLD" />Hinweis<ph name="END_BOLD" />: Eine andere Person mit einer ähnlichen Stimme oder einer Aufnahme Ihrer Stimme kann möglicherweise auf Ihre persönlichen Ergebnisse zugreifen. Sie können die Voice Match-Berechtigung später in den Assistant-Einstellungen deaktivieren.</translation> <translation id="5614190747811328134">Nutzerhinweis</translation> <translation id="5614553682702429503">Passwort speichern?</translation> <translation id="5616726534702877126">Speicherplatz reservieren</translation> @@ -5046,6 +5059,7 @@ <translation id="6824584962142919697">&Elemente untersuchen</translation> <translation id="6825184156888454064">Nach Name sortieren</translation> <translation id="6826872289184051766">Über USB bestätigen</translation> +<translation id="6827604573767207488">Sie haben den Assistant schon auf einem anderen Gerät eingerichtet und personalisiert. Wenn Sie die folgende Einstellung aktivieren, können Sie Assistant noch besser nutzen.</translation> <translation id="6828153365543658583">Anmeldung auf die folgenden Nutzer beschränken:</translation> <translation id="6828182567531805778">Geben Sie die Passphrase ein, um Ihre Daten zu synchronisieren</translation> <translation id="682871081149631693">QuickFix-Build</translation> @@ -5480,6 +5494,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> hat die ADB-Fehlerbehebung deaktiviert. Nachdem <ph name="DEVICE_TYPE" /> neu gestartet wurde, können keine Apps mehr per Sideload übertragen werden.</translation> <translation id="7328867076235380839">Ungültige Kombination</translation> <translation id="7329154610228416156">Sie konnten nicht angemeldet werden, weil in der Konfiguration eine unsichere URL angegeben ist (<ph name="BLOCKED_URL" />). Bitte wenden Sie sich an Ihren Administrator.</translation> +<translation id="7329932885428707942">Dies kann zu einer kurzen Unterbrechung der Verbindung zum Mobilfunknetz führen.</translation> <translation id="7332053360324989309">Dedicated Worker: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Angedockte Lupe aktivieren</translation> <translation id="7335974957018254119">Rechtschreibprüfung verwenden für</translation> @@ -5523,6 +5538,7 @@ <translation id="7374376573160927383">USB-Geräte verwalten</translation> <translation id="7375235221357833624">{0,plural, =1{Gerät innerhalb von einer Stunde aktualisieren}other{Gerät innerhalb von # Stunden aktualisieren}}</translation> <translation id="7376553024552204454">Cursor bei Bewegung hervorheben</translation> +<translation id="737728204345822099">Auf Ihrem Sicherheitsschlüssel kann zum Besuch dieser Website ein Datensatz angelegt werden.</translation> <translation id="7377451353532943397">Zugriff auf den Sensor weiterhin blockieren</translation> <translation id="7378611153938412599">Schwache Passwörter sind einfach zu erraten. Erstellen Sie deshalb am besten starke Passwörter. <ph name="BEGIN_LINK" />Weitere Sicherheitstipps ansehen.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome Web Store öffnen</translation> @@ -6149,6 +6165,7 @@ <translation id="8059417245945632445">&Geräte untersuchen</translation> <translation id="8059456211585183827">Es sind keine Drucker verfügbar, die gespeichert werden können.</translation> <translation id="8061091456562007989">Änderung rückgängig machen</translation> +<translation id="8061991877177392872">Sie haben Voice Match schon auf einem anderen Gerät mit Assistant eingerichtet. Diese vorherigen Aufnahmen wurden verwendet, um ein Sprachmodell auf diesem Gerät zu erstellen.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 Blatt Papier}other{{COUNT} Blätter Papier}}</translation> <translation id="8062879968880283306">Scannen Sie den QR-Code mit der Kamera Ihres Geräts oder geben Sie den von Ihrem Mobilfunkanbieter angegebenen Aktivierungscode ein.</translation> <translation id="8063235345342641131">Grüner Standardavatar</translation> @@ -6417,6 +6434,7 @@ <translation id="8379991678458444070">Sie können diesen Tab als Lesezeichen speichern, um schnell wieder hierher zurückzukehren</translation> <translation id="8382913212082956454">E-Mail-Adr&esse kopieren</translation> <translation id="8386091599636877289">Richtlinie nicht gefunden.</translation> +<translation id="8386819192691131213">Assistant darf Informationen auf dem Bildschirm verwenden, um schnelle Antworten zu geben – beispielsweise Übersetzungen, Definitionen oder Umrechnung von Einheiten.</translation> <translation id="8386903983509584791">Suche abgeschlossen</translation> <translation id="8387361103813440603">Dürfen meine Standortdaten nicht abrufen</translation> <translation id="8389264703141926739">Benachrichtigungen blockieren</translation> @@ -6894,6 +6912,7 @@ <translation id="8915370057835397490">Vorschläge werden geladen</translation> <translation id="8916476537757519021">Inkognito-Subframe: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> von <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Bildschirm bewegen, wenn die Maus den Bildschirmrand berührt</translation> <translation id="8923880975836399332">Dunkles Blaugrün</translation> <translation id="8925458182817574960">&Einstellungen</translation> <translation id="8926389886865778422">Nicht mehr fragen</translation> @@ -6971,6 +6990,7 @@ <translation id="9009708085379296446">Wollten Sie diese Seite ändern?</translation> <translation id="9011163749350026987">Symbol immer zeigen</translation> <translation id="9011393886518328654">Versionshinweise</translation> +<translation id="9012122671773859802">Bildschirm kontinuierlich mit den Bewegungen der Maus bewegen</translation> <translation id="9013037634206938463">Zur Installation von Linux sind mindestens <ph name="INSTALL_SIZE" /> freier Speicherplatz erforderlich. Löschen Sie Dateien von Ihrem Gerät, um Speicherplatz freizugeben.</translation> <translation id="9013707997379828817">Ihr Administrator hat dieses Gerät zurückgesetzt. Bitte speichern Sie wichtige Dateien und starten Sie es dann neu. Alle Daten auf dem Gerät werden gelöscht.</translation> <translation id="901668144954885282">In Google Drive sichern</translation> @@ -7015,6 +7035,7 @@ <translation id="9052404922357793350">Weiterhin blockieren</translation> <translation id="9053563360605707198">Beidseitig drucken</translation> <translation id="9053893665344928494">Meine Auswahl merken</translation> +<translation id="9055278955535611574">Mit „Hey Google“ auf Assistant zugreifen</translation> <translation id="9055636786322918818">RC4-Verschlüsselung durchsetzen. Mit dieser Option ist ein höheres Risiko verbunden, da RC4-Verschlüsselungen nicht sicher sind.</translation> <translation id="9056810968620647706">Keine Übereinstimmungen gefunden.</translation> <translation id="9057354806206861646">Aktualisierungszeitplan</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 03fe168..d328d28ca 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Πρόσβαση στις συσκευές Bluetooth και τις σειριακές συσκευές</translation> <translation id="114036956334641753">Ήχος και υπότιτλοι</translation> <translation id="1140746652461896221">Αποκλεισμός περιεχομένου σε οποιαδήποτε σελίδα που επισκέπτεστε</translation> +<translation id="1141953877381847186">Να επιτρέπεται στον Βοηθό να χρησιμοποιεί πληροφορίες στην οθόνη για να παρέχει γρήγορες απαντήσεις όπως μεταφράσεις, ορισμούς, μετατροπές μονάδων και άλλα. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Λάβετε υπόψη:<ph name="END_BOLD" /> Μπορείτε να αλλάξετε αυτήν την επιλογή στις Ρυθμίσεις του Βοηθού Google > Σχετικές πληροφορίες.</translation> <translation id="1143142264369994168">Υπηρεσία υπογραφής πιστοποιητικού</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Το Chrome δεν εντόπισε επιβλαβές λογισμικό στον υπολογιστή σας • Ο έλεγχος έγινε πριν από 1 λεπτό}other{Το Chrome δεν εντόπισε επιβλαβές λογισμικό στον υπολογιστή σας • Ο έλεγχος έγινε πριν από {NUM_MINS} λεπτά}}</translation> <translation id="1145593918056169051">Ο εκτυπωτής σταμάτησε να λειτουργεί</translation> @@ -1436,7 +1439,9 @@ <translation id="2594999711683503743">Κάντε αναζήτηση στο Google ή πληκτρολογήστε το URL</translation> <translation id="2602501489742255173">Σύρετε προς τα επάνω για να ξεκινήσετε</translation> <translation id="2603115962224169880">Εκκαθάριση υπολογιστή</translation> +<translation id="2603355571917519942">Το Voice Match είναι έτοιμο</translation> <translation id="2603463522847370204">Άνοιγμα σε παράθυρο για ανών&υμη περιήγηση</translation> +<translation id="2604138917550693049">Αναζήτηση εικόνας με το Google Lens</translation> <translation id="2604255671529671813">Σφάλμα σύνδεσης δικτύου</translation> <translation id="2606246518223360146">Σύνδεση δεδομένων</translation> <translation id="2606454609872547359">Όχι, συνέχεια χωρίς το ChromeVox</translation> @@ -1779,6 +1784,7 @@ <translation id="2963151496262057773">Η ακόλουθη προσθήκη δεν ανταποκρίνεται: <ph name="PLUGIN_NAME" />Θέλετε να την τερματίσετε;</translation> <translation id="2964193600955408481">Απενεργοποίηση Wi-Fi</translation> <translation id="2964245677645334031">Ορατότητα Κοινοποίησης κοντά</translation> +<translation id="2966216232069818096">Να επιτρέπεται στον Βοηθό σας να χρησιμοποιεί πληροφορίες στην οθόνη σας για να σας προσφέρει βοήθεια</translation> <translation id="2966937470348689686">Διαχείριση προτιμήσεων Android</translation> <translation id="2972581237482394796">&Επανάληψη ενέργειας</translation> <translation id="2973324205039581528">Σίγαση Ιστοτόπου</translation> @@ -1875,6 +1881,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Αυτή η καρτέλα χρησιμοποιεί την κάμερα ή το μικρόφωνό σας.</translation> <translation id="3083193146044397360">Αποκλείστηκε προσωρινά για την προστασία σας</translation> +<translation id="3083899879156272923">Μετακίνηση της οθόνης διατηρώντας το ποντίκι στο κέντρο της οθόνης</translation> <translation id="3084548735795614657">Απόθεση για εγκατάσταση</translation> <translation id="3084771660770137092">Είτε εξαντλήθηκε η μνήμη του Chrome ή η διαδικασία για την ιστοσελίδα τερματίστηκε για κάποιον άλλο λόγο. Για να συνεχίσετε, επαναλάβετε τη φόρτωση ή μεταβείτε σε άλλη σελίδα.</translation> <translation id="3084958266922136097">Απενεργοποίηση προφύλαξης οθόνης</translation> @@ -2370,6 +2377,9 @@ <translation id="3654045516529121250">Ανάγνωση των ρυθμίσεων προσβασιμότητας</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Έχει μόνιμη πρόσβαση σε ένα αρχείο.}other{Έχει μόνιμη πρόσβαση σε # αρχεία.}}</translation> <translation id="3658871634334445293">Επιτάχυνση TrackPoint</translation> +<translation id="3659830472545192450">Το Voice Match διευκολύνει τον Βοηθό σας Google να αναγνωρίζει τη φωνή σας στο Chromebook και να σας ξεχωρίζει από άλλα άτομα. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Λάβετε υπόψη:<ph name="END_BOLD" /> Μια παρόμοια φωνή ή εγγραφή μπορεί να έχει επίσης πρόσβαση στα προσωπικά αποτελέσματά σας. Μπορείτε να καταργήσετε την άδεια Voice Match αργότερα απενεργοποιώντας το στις Ρυθμίσεις Βοηθού.</translation> <translation id="3660234220361471169">Μη αξιόπιστα</translation> <translation id="3664511988987167893">Εικονίδιο επέκτασης</translation> <translation id="3665589677786828986">Το Chrome διαπιστώσαμε ότι ορισμένες από τις ρυθμίσεις σας καταστράφηκαν από άλλο πρόγραμμα και τις επανέφερε στις αρχικές τους προεπιλογές.</translation> @@ -2978,7 +2988,6 @@ <translation id="4364567974334641491">Η εφαρμογή <ph name="APP_NAME" /> μοιράζεται ένα παράθυρο.</translation> <translation id="4364830672918311045">Εμφάνιση ειδοποιήσεων</translation> <translation id="4366138410738374926">Έναρξη εκτύπωσης</translation> -<translation id="437004882363131692">Λάβετε συμβουλές, προσφορές και ενημερώσεις και μοιραστείτε τα σχόλιά σας σχετικά με τη συσκευή <ph name="DEVICE_TYPE" />. Καταργήστε την εγγραφή σας ανά πάσα στιγμή.</translation> <translation id="4370425812909262207">Έγινε απόκρυψη των καλαθιών. Θα εμφανιστούν ξανά όταν κάνετε αλλαγές.</translation> <translation id="4370975561335139969">Η διεύθυνση ηλεκτρονικού ταχυδρομείου και ο κωδικός πρόσβασης δεν ταιριάζουν</translation> <translation id="4374831787438678295">Πρόγραμμα εγκατάστασης Linux</translation> @@ -3558,6 +3567,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Δεν υποστηρίζεται ορθογραφικός έλεγχος για τις γλώσσες που επιλέξατε</translation> <translation id="5052499409147950210">Επεξεργασία ιστοτόπου</translation> +<translation id="5053962746715621840">Αναζήτηση εικόνας με το Google Lens</translation> <translation id="5057110919553308744">Όταν κάνετε κλικ στην επέκταση</translation> <translation id="5057403786441168405">Διαχειριστείτε τους συνδεδεμένους λογαριασμούς. Οι ιστότοποι, οι εφαρμογές και οι επεκτάσεις στο Chrome και στο Google Play μπορεί να χρησιμοποιούν αυτούς τους λογαριασμούς για να προσαρμόσουν την εμπειρία σας, ανάλογα με τις άδειες. <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Περιορισμός σύνδεσης</translation> @@ -4042,6 +4052,9 @@ <translation id="5610038042047936818">Εναλλαγή σε λειτουργία κάμερας</translation> <translation id="561030196642865721">Τα cookie τρίτου μέρους επιτρέπονται σε αυτόν τον ιστότοπο</translation> <translation id="5612734644261457353">Λυπούμαστε, η επαλήθευση του κωδικού πρόσβασής σας εξακολουθεί να μην είναι δυνατή. Λάβετε υπόψη σας: εάν έχετε αλλάξει πρόσφατα τον κωδικό πρόσβασής σας, ο νέος κωδικός πρόσβασής σας θα τεθεί σε ισχύ αφού αποσυνδεθείτε, χρησιμοποιήστε εδώ τον παλιό κωδικό πρόσβασης.</translation> +<translation id="561308544008485315">Το Voice Match διευκολύνει τον Βοηθό σας Google να αναγνωρίζει τη φωνή σας στο Chromebook και να σας ξεχωρίζει από άλλα άτομα. Για λόγους εξοικονόμησης μπαταρίας, η λειτουργία Ok Google ενεργοποιείται μόνο όταν η συσκευή σας είναι συνδεδεμένη σε κάποια πηγή ενέργειας. Για να κάνετε αλλαγές, μεταβείτε στις Ρυθμίσεις. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Λάβετε υπόψη:<ph name="END_BOLD" /> Μια παρόμοια φωνή ή εγγραφή μπορεί να έχει επίσης πρόσβαση στα προσωπικά αποτελέσματά σας. Μπορείτε να καταργήσετε την άδεια Voice Match αργότερα απενεργοποιώντας το στις Ρυθμίσεις Βοηθού.</translation> <translation id="5614190747811328134">Σημείωση για τους χρήστες</translation> <translation id="5614553682702429503">Αποθήκευση κωδικού πρόσβασης;</translation> <translation id="5616726534702877126">Μέγεθος δεσμευμένου χώρου</translation> @@ -5073,6 +5086,7 @@ <translation id="6824584962142919697">&Inspect elements</translation> <translation id="6825184156888454064">Ταξινόμηση κατά όνομα</translation> <translation id="6826872289184051766">Επαλήθευση μέσω USB</translation> +<translation id="6827604573767207488">Φαίνεται ότι έχετε ήδη ρυθμίσει και εξατομικεύση τον Βοηθό σε διαφορετική συσκευή. Αξιοποιήστε ακόμη περισσότερο τον Βοηθό σας ενεργοποιώντας την παρακάτω ρύθμιση.</translation> <translation id="6828153365543658583">Περιορισμός σύνδεσης στους ακόλουθους χρήστες:</translation> <translation id="6828182567531805778">Εισαγάγετε τη φράση πρόσβασης για να συγχρονίσετε τα δεδομένα σας</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5508,6 +5522,7 @@ <translation id="7327989755579928735">Ο τομέας <ph name="MANAGER" /> απενεργοποίησε τον εντοπισμό και τη διόρθωση σφαλμάτων adb. Όταν επανεκκινήσετε τη συσκευή <ph name="DEVICE_TYPE" />, δεν θα επιτρέπεται η παράπλευρη φόρτωση εφαρμογών.</translation> <translation id="7328867076235380839">Μη έγκυρος συνδυασμός</translation> <translation id="7329154610228416156">Η διαδικασία σύνδεσης απέτυχε γιατί είχε ρυθμιστεί να χρησιμοποιεί μια μη ασφαλή διεύθυνση URL (<ph name="BLOCKED_URL" />). Επικοινωνήστε με το διαχειριστή σας.</translation> +<translation id="7329932885428707942">Αυτό μπορεί να προκαλέσει σύντομη αποσύνδεση του δικτύου κινητής τηλεφωνίας.</translation> <translation id="7332053360324989309">Dedicated Worker: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Ενεργοποίηση μεγεθυντικού φακού σε παράθυρο</translation> <translation id="7335974957018254119">Χρήση ορθογραφικού ελέγχου για</translation> @@ -5551,6 +5566,7 @@ <translation id="7374376573160927383">Διαχείριση συσκευών USB</translation> <translation id="7375235221357833624">{0,plural, =1{Ενημέρωση συσκευής εντός μίας ώρας}other{Ενημέρωση συσκευής εντός # ωρών}}</translation> <translation id="7376553024552204454">Επισήμανση του δείκτη του ποντικιού όταν κινείται</translation> +<translation id="737728204345822099">Μια καταγραφή της επίσκεψής σας σε αυτόν τον ιστότοπο ενδέχεται να διατηρηθεί στο κλειδί ασφαλείας.</translation> <translation id="7377451353532943397">Να συνεχιστεί ο αποκλεισμός της πρόσβασης στους αισθητήρες</translation> <translation id="7378611153938412599">Είναι εύκολο να μαντέψει κανείς τους ασθενείς κωδικούς πρόσβασης. Βεβαιωθείτε ότι δημιουργείτε ισχυρούς κωδικούς πρόσβασης. <ph name="BEGIN_LINK" />Δείτε περισσότερες συμβουλές ασφάλειας.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Άνοιγμα του Chrome Web Store</translation> @@ -6178,6 +6194,7 @@ <translation id="8059417245945632445">&Επιθεώρηση συσκευών</translation> <translation id="8059456211585183827">Δεν υπάρχουν διαθέσιμοι εκτυπωτές για αποθήκευση.</translation> <translation id="8061091456562007989">Αναίρεση αλλαγής</translation> +<translation id="8061991877177392872">Φαίνεται πως έχετε ήδη ρυθμίσει το Voice Match με τον Βοηθό σας σε κάποια άλλη συσκευή. Αυτές οι προηγούμενες εγγραφές χρησιμοποιήθηκαν για τη δημιουργία ενός φωνητικού μοντέλου σε αυτήν τη συσκευή.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 φύλλο χαρτιού}other{{COUNT} φύλλα χαρτιού}}</translation> <translation id="8062879968880283306">Σαρώστε τον κωδικό QR με την κάμερα της συσκευής ή καταχωρίστε τον κωδικό ενεργοποίησης που παρέχεται από την εταιρεία κινητής τηλεφωνίας.</translation> <translation id="8063235345342641131">Προεπιλεγμένο πράσινο avatar</translation> @@ -6449,6 +6466,7 @@ <translation id="8379991678458444070">Προσθέστε σελιδοδείκτη σε αυτήν την καρτέλα για να επιστρέψετε εδώ γρήγορα</translation> <translation id="8382913212082956454">Αντιγραφή διεύθυνσης &ηλεκτρονικού ταχυδρομείου</translation> <translation id="8386091599636877289">Η πολιτική δεν βρέθηκε.</translation> +<translation id="8386819192691131213">Να επιτρέπεται στον Βοηθό να χρησιμοποιεί πληροφορίες στην οθόνη για να παρέχει γρήγορες απαντήσεις όπως μεταφράσεις, ορισμούς, μετατροπές μονάδων και άλλα.</translation> <translation id="8386903983509584791">Η σάρωση ολοκληρώθηκε</translation> <translation id="8387361103813440603">Δεν επιτρέπεται να βλέπουν την τοποθεσία σας</translation> <translation id="8389264703141926739">Αποκλεισμός ειδοποιήσεων</translation> @@ -6929,6 +6947,7 @@ <translation id="8915370057835397490">Φόρτωση πρότασης</translation> <translation id="8916476537757519021">Υποπλαίσιο ανώνυμης περιήγησης: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> του/της <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Μετακίνηση οθόνης όταν το ποντίκι αγγίζει τις άκρες της οθόνης</translation> <translation id="8923880975836399332">Σκούρο γαλαζοπράσινο</translation> <translation id="8925458182817574960">&Ρυθμίσεις</translation> <translation id="8926389886865778422">Να μην ερωτηθώ ξανά</translation> @@ -7007,6 +7026,7 @@ <translation id="9009708085379296446">Θέλατε να αλλάξετε αυτήν τη σελίδα;</translation> <translation id="9011163749350026987">Να εμφανίζεται πάντα το εικονίδιο</translation> <translation id="9011393886518328654">Σημειώσεις έκδοσης</translation> +<translation id="9012122671773859802">Μετακίνηση οθόνης συνεχώς καθώς κινείται το ποντίκι</translation> <translation id="9013037634206938463">Για την εγκατάσταση του Linux απαιτούνται τουλάχιστον <ph name="INSTALL_SIZE" /> ελεύθερου αποθηκευτικού χώρου. Για να αυξήσετε τον δωρεάν αποθηκευτικό χώρο, διαγράψτε αρχεία από τη συσκευή σας.</translation> <translation id="9013707997379828817">Ο διαχειριστής σας έκανε επαναφορά σε αυτήν τη συσκευή. Αποθηκεύστε σημαντικά αρχεία και κάντε επανεκκίνηση. Όλα τα δεδομένα στη συσκευή θα διαγραφούν.</translation> <translation id="901668144954885282">Δημιουργία αντιγράφου ασφαλείας στο Google Drive</translation> @@ -7051,6 +7071,7 @@ <translation id="9052404922357793350">Συνέχιση αποκλεισμού</translation> <translation id="9053563360605707198">Εκτύπωση και στις δύο πλευρές</translation> <translation id="9053893665344928494">Απομνημόνευση της επιλογής μου</translation> +<translation id="9055278955535611574">Αποκτήστε πρόσβαση στον Βοηθό με την εντολή Ok Google</translation> <translation id="9055636786322918818">Να επιβάλλεται η κρυπτογράφηση RC4. Η χρήση αυτής της επιλογής αυξάνει τον κίνδυνο, επειδή η κρυπτογράφηση RC4 δεν είναι ασφαλής.</translation> <translation id="9056810968620647706">Δεν βρέθηκαν αντιστοιχίες.</translation> <translation id="9057354806206861646">Ενημέρωση χρονοδιαγράμματος</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 579e59d..74408e6 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -2978,7 +2978,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> is sharing a window.</translation> <translation id="4364830672918311045">Display notifications</translation> <translation id="4366138410738374926">Printing started</translation> -<translation id="437004882363131692">Get <ph name="DEVICE_TYPE" /> tips, offers and updates, and share feedback. Unsubscribe at any time.</translation> <translation id="4370425812909262207">Baskets hidden. They’ll reappear when you make changes.</translation> <translation id="4370975561335139969">The email and password that you entered don't match.</translation> <translation id="4374831787438678295">Linux installer</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index becc4b7..3cbeed1 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Acceder a los dispositivos en serie y Bluetooth</translation> <translation id="114036956334641753">Audio y subtítulos</translation> <translation id="1140746652461896221">Bloquear contenido en cualquier página que visites</translation> +<translation id="1141953877381847186">Permite que Asistente use la información en pantalla para proporcionar respuestas rápidas, como una traducción, definición, conversión de unidades y mucho más. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Ten en cuenta<ph name="END_BOLD" /> que puedes cambiar esta configuración en cualquier momento desde Configuración del Asistente de Google > Información relacionada.</translation> <translation id="1143142264369994168">Firmante del certificado</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome no encontró software dañino en la computadora • Se verificó hace 1 minuto}other{Chrome no encontró software dañino en la computadora • Se verificó hace {NUM_MINS} minutos}}</translation> <translation id="1145593918056169051">Se detuvo la impresora</translation> @@ -1429,7 +1432,9 @@ <translation id="2594999711683503743">Buscar en Google o escribir una URL</translation> <translation id="2602501489742255173">Desliza hacia arriba para comenzar</translation> <translation id="2603115962224169880">Limpiar la computadora</translation> +<translation id="2603355571917519942">Voice Match está listo</translation> <translation id="2603463522847370204">Abrir en una ventana de &incógnito</translation> +<translation id="2604138917550693049">Buscar imagen con Google Lens</translation> <translation id="2604255671529671813">Error de conexión de red</translation> <translation id="2606246518223360146">Vincular datos</translation> <translation id="2606454609872547359">No, continuar sin ChromeVox</translation> @@ -1771,6 +1776,7 @@ <translation id="2963151496262057773">El siguiente complemento no responde: <ph name="PLUGIN_NAME" /> ¿Quieres detenerlo?</translation> <translation id="2964193600955408481">Desactivar Wi-Fi</translation> <translation id="2964245677645334031">Visibilidad de Compartir con Nearby</translation> +<translation id="2966216232069818096">Permite que tu Asistente use la información que aparece en pantalla para ayudarte</translation> <translation id="2966937470348689686">Administrar las preferencias de Android</translation> <translation id="2972581237482394796">&Rehacer</translation> <translation id="2973324205039581528">Silenciar el sitio</translation> @@ -1866,6 +1872,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Esta pestaña está utilizando tu cámara o micrófono.</translation> <translation id="3083193146044397360">Se bloqueó temporalmente para proteger tu seguridad</translation> +<translation id="3083899879156272923">Mover pantalla mientras el mouse se mantiene en el centro</translation> <translation id="3084548735795614657">Soltar para instalar</translation> <translation id="3084771660770137092">El proceso de la página web puede haber finalizado por agotamiento de la memoria de Chrome o por algún otro motivo. Para continuar, reinicia la página o accede a otra página.</translation> <translation id="3084958266922136097">Inhabilitar el protector de pantalla</translation> @@ -2359,6 +2366,9 @@ <translation id="3654045516529121250">Leer la configuración de accesibilidad</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Tiene acceso permanente a un archivo.}other{Tiene acceso permanente a # archivos.}}</translation> <translation id="3658871634334445293">Aceleración del TrackPoint</translation> +<translation id="3659830472545192450">Voice Match permite que Asistente de Google identifique tu voz en la Chromebook y te distinga de otras personas. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Ten en cuenta<ph name="END_BOLD" /> que una voz o grabación similar también podría acceder a tus resultados personales. Para quitar el permiso de Voice Match, desactívalo desde Configuración del Asistente.</translation> <translation id="3660234220361471169">No es de confianza</translation> <translation id="3664511988987167893">Ícono de extensión</translation> <translation id="3665589677786828986">Chrome detectó que otro programa dañó algunas opciones de configuración, por lo que la restableció a los valores predeterminados.</translation> @@ -2965,7 +2975,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> comparte una ventana.</translation> <translation id="4364830672918311045">Mostrar notificaciones</translation> <translation id="4366138410738374926">Se inició la impresión</translation> -<translation id="437004882363131692">Obtén sugerencias, ofertas y actualizaciones relacionadas con <ph name="DEVICE_TYPE" />, y comparte tus comentarios. Puedes anular la suscripción en cualquier momento.</translation> <translation id="4370425812909262207">Se ocultaron los carritos. Se volverán a mostrar cuando realices cambios.</translation> <translation id="4370975561335139969">El correo electrónico y la contraseña que ingresaste no coinciden.</translation> <translation id="4374831787438678295">Instalador de Linux</translation> @@ -3118,6 +3127,7 @@ <translation id="4538417792467843292">Eliminar palabra</translation> <translation id="4538684596480161368">Siempre bloquear los complementos no incluidos en la zona de pruebas en <ph name="HOST" /></translation> <translation id="4538792345715658285">Instalada por una política empresarial</translation> +<translation id="4541123282641193691">No se pudo verificar la cuenta. Vuelve a intentarlo o reinicia la Chromebook.</translation> <translation id="4541662893742891060">No se pudo conectar a este perfil. Para obtener asistencia técnica, comunícate con tu proveedor.</translation> <translation id="4542520061254486227">Leer los datos en <ph name="WEBSITE_1" /> y <ph name="WEBSITE_2" /></translation> <translation id="4543778593405494224">Administrador de certificados</translation> @@ -3542,6 +3552,7 @@ <translation id="5050330054928994520">Texto a voz</translation> <translation id="5051836348807686060">Los idiomas seleccionados no son compatibles con el corrector ortográfico</translation> <translation id="5052499409147950210">Editar sitio</translation> +<translation id="5053962746715621840">Buscar imagen con Google Lens</translation> <translation id="5057110919553308744">Cuando haces clic en la extensión</translation> <translation id="5057403786441168405">Administra las cuentas en las que accediste. En función de los permisos, es posible que los sitios web, las apps y las extensiones en Chrome y Google Play usen estas cuentas para personalizar tu experiencia. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Restringir el acceso</translation> @@ -4024,6 +4035,9 @@ <translation id="5610038042047936818">Cambiar al modo de cámara</translation> <translation id="561030196642865721">Se permiten cookies de terceros en este sitio</translation> <translation id="5612734644261457353">Aún no se pudo verificar tu contraseña. Ten en cuenta que si cambiaste tu contraseña recientemente, podrás usar tu nueva contraseña cuando salgas. Usa la contraseña antigua aquí.</translation> +<translation id="561308544008485315">Voice Match permite que Asistente de Google identifique tu voz en la Chromebook y te distinga de otras personas. Para ahorrar batería, "Hey Google" solo se activa cuando tu dispositivo está conectado a una fuente de alimentación. Para hacer cambios, ve a Configuración. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Ten en cuenta<ph name="END_BOLD" /> que una voz o grabación similar también podría acceder a tus resultados personales. Para quitar el permiso de Voice Match, desactívalo desde Configuración del Asistente.</translation> <translation id="5614190747811328134">Aviso de usuario</translation> <translation id="5614553682702429503">¿Quieres guardar la contraseña?</translation> <translation id="5616726534702877126">Reservar espacio</translation> @@ -4136,6 +4150,7 @@ <translation id="574209121243317957">Tono</translation> <translation id="5742505912938664543">Si agregas una cuenta secundaria aquí, podrás navegar por la Web, descargar apps, revisar tu Cuenta de Gmail y usar otros servicios de Google.</translation> <translation id="5746169159649715125">Guardar como PDF</translation> +<translation id="5746261205461426123">Abrir guía de configuración</translation> <translation id="5747552184818312860">Caduca</translation> <translation id="5747785204778348146">Programador: versión inestable</translation> <translation id="5747809636523347288">&Pegar y dirigirse a <ph name="URL" /></translation> @@ -5047,6 +5062,7 @@ <translation id="6824584962142919697">Analizar elementos</translation> <translation id="6825184156888454064">Ordenar por nombre</translation> <translation id="6826872289184051766">Verificar mediante USB</translation> +<translation id="6827604573767207488">Al parecer, ya configuraste el Asistente personalizado en otro dispositivo. Activa la siguiente configuración para sacarle aún más provecho a tu Asistente.</translation> <translation id="6828153365543658583">Restringir el inicio de sesión a los siguientes usuarios:</translation> <translation id="6828182567531805778">Ingresa la frase de contraseña para sincronizar tus datos</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5287,6 +5303,7 @@ <translation id="708278670402572152">Desactiva la conexión para habilitar el análisis</translation> <translation id="7084321615353200053">Permitir que los sitios soliciten permiso para usar la cámara (recomendado)</translation> <translation id="7085389578340536476">¿Permitir que Chrome grabe audio?</translation> +<translation id="7085805695634549980">No se pudo establecer conexión con los servicios de Google. Código de error: <ph name="ERROR_CODE" />.</translation> <translation id="7086672505018440886">Incluye los archivos de registro de Chrome en el archivo.</translation> <translation id="7088434364990739311">Error al iniciar la verificación de actualizaciones (código de error <ph name="ERROR" />).</translation> <translation id="7088561041432335295">Zip Archiver: Abre y crea archivos ZIP en la app de Archivos.</translation> @@ -5481,6 +5498,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> inhabilitó la depuración de ADB. Cuando reinicies tu <ph name="DEVICE_TYPE" />, no podrás transferir apps.</translation> <translation id="7328867076235380839">La combinación no es válida</translation> <translation id="7329154610228416156">Se produjo un error de acceso porque está configurado para usar una URL no segura (<ph name="BLOCKED_URL" />). Comunícate con el administrador.</translation> +<translation id="7329932885428707942">Esto puede ocasionar una breve desconexión de la red móvil.</translation> <translation id="7332053360324989309">Trabajador dedicado: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Habilitar lupa con vista acoplada</translation> <translation id="7335974957018254119">Usar el corrector ortográfico para</translation> @@ -5524,6 +5542,7 @@ <translation id="7374376573160927383">Administrar dispositivos USB</translation> <translation id="7375235221357833624">{0,plural, =1{Actualiza el dispositivo en el transcurso de una hora}other{Actualiza el dispositivo en el transcurso de # horas}}</translation> <translation id="7376553024552204454">Resaltar el cursor del mouse cuando se mueve</translation> +<translation id="737728204345822099">Es posible que se guarde un registro de tu visita a este sitio en tu llave de seguridad.</translation> <translation id="7377451353532943397">Seguir bloqueando el acceso a los sensores</translation> <translation id="7378611153938412599">Las contraseñas poco seguras son fáciles de adivinar. Asegúrate de crear contraseñas seguras. <ph name="BEGIN_LINK" />Obtén más sugerencias de seguridad.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Abrir Chrome Web Store</translation> @@ -6150,6 +6169,7 @@ <translation id="8059417245945632445">&Inspeccionar dispositivos</translation> <translation id="8059456211585183827">No hay impresoras disponibles para guardar.</translation> <translation id="8061091456562007989">Deshacer el cambio</translation> +<translation id="8061991877177392872">Parece que ya configuraste Voice Match con tu Asistente en otro dispositivo. Se usaron las grabaciones anteriores para crear un modelo de voz en este dispositivo.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 hoja de papel}other{{COUNT} hojas de papel}}</translation> <translation id="8062879968880283306">Escanea el código QR con la cámara del dispositivo o ingresa el código de activación que te brindó tu proveedor.</translation> <translation id="8063235345342641131">Avatar verde predeterminado</translation> @@ -6419,6 +6439,7 @@ <translation id="8379991678458444070">Para regresar aquí rápidamente, agrega esta pestaña a favoritos</translation> <translation id="8382913212082956454">Copiar dir&ección de correo electrónico</translation> <translation id="8386091599636877289">No se encontró la política.</translation> +<translation id="8386819192691131213">Permite que Asistente use la información en pantalla para proporcionar respuestas rápidas, como una traducción, definición, conversión de unidades y mucho más.</translation> <translation id="8386903983509584791">Finalizó la búsqueda</translation> <translation id="8387361103813440603">No puede ver tu ubicación</translation> <translation id="8389264703141926739">Bloquear las notificaciones</translation> @@ -6896,6 +6917,7 @@ <translation id="8915370057835397490">Cargando sugerencia</translation> <translation id="8916476537757519021">Submarco incógnito: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Mover la pantalla cuando el mouse toca los bordes</translation> <translation id="8923880975836399332">Verde azulado oscuro</translation> <translation id="8925458182817574960">&Configuración</translation> <translation id="8926389886865778422">No volver a preguntar</translation> @@ -6973,6 +6995,7 @@ <translation id="9009708085379296446">¿Querías cambiar esta página?</translation> <translation id="9011163749350026987">Mostrar siempre el ícono</translation> <translation id="9011393886518328654">Notas de la versión</translation> +<translation id="9012122671773859802">Mover la pantalla continuamente mientras se mueve el mouse</translation> <translation id="9013037634206938463">Se necesitan <ph name="INSTALL_SIZE" /> de espacio libre para instalar Linux. Si necesitas liberar espacio, borra archivos del dispositivo.</translation> <translation id="9013707997379828817">El administrador restableció este dispositivo. Antes de reiniciarlo, guarda los archivos importantes, ya que se borrarán todos los datos.</translation> <translation id="901668144954885282">Crear una copia de seguridad en Google Drive</translation> @@ -7017,6 +7040,7 @@ <translation id="9052404922357793350">Seguir bloqueando</translation> <translation id="9053563360605707198">Imprimir de ambos lados</translation> <translation id="9053893665344928494">Recordar mi selección</translation> +<translation id="9055278955535611574">Accede a tu Asistente mediante "Hey Google"</translation> <translation id="9055636786322918818">Aplica la encriptación RC4. Esta opción es riesgosa, ya que los cifrados RC4 son inseguros.</translation> <translation id="9056810968620647706">No se encontraron coincidencias.</translation> <translation id="9057354806206861646">Cronograma de actualizaciones</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 04632bb..1837e14c 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -2967,7 +2967,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> está compartiendo una ventana.</translation> <translation id="4364830672918311045">Mostrar notificaciones</translation> <translation id="4366138410738374926">Impresión iniciada</translation> -<translation id="437004882363131692">Recibe consejos, ofertas y novedades sobre <ph name="DEVICE_TYPE" /> y comparte tu opinión. Puedes cancelar la suscripción en cualquier momento.</translation> <translation id="4370425812909262207">Carritos ocultos. Volverán a aparecer cuando hagas cambios.</translation> <translation id="4370975561335139969">La dirección de correo electrónico y la contraseña que has introducido no coinciden</translation> <translation id="4374831787438678295">Instalador de Linux</translation> @@ -5526,6 +5525,7 @@ <translation id="7374376573160927383">Gestionar dispositivos USB</translation> <translation id="7375235221357833624">{0,plural, =1{Actualizar dispositivo dentro de 1 hora}other{Actualizar dispositivo dentro de # horas}}</translation> <translation id="7376553024552204454">Resaltar el cursor del ratón al moverlo</translation> +<translation id="737728204345822099">Se guardará un registro de tu visita a este sitio web en tu llave de seguridad.</translation> <translation id="7377451353532943397">Seguir bloqueando el acceso a los sensores</translation> <translation id="7378611153938412599">Las contraseñas poco seguras son fáciles de adivinar. Asegúrate de que tus contraseñas sean seguras. <ph name="BEGIN_LINK" />Ver más consejos de seguridad<ph name="END_LINK" /></translation> <translation id="73786666777299047">Abrir Chrome Web Store</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 2404e02..4d67d71 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -2978,7 +2978,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> jagab akent.</translation> <translation id="4364830672918311045">Kuva märguanded</translation> <translation id="4366138410738374926">Alustati printimist</translation> -<translation id="437004882363131692">Hankige seadme <ph name="DEVICE_TYPE" /> nõuandeid, pakkumisi ja värskendusi ning jagage tagasisidet. Saate tellimuse alati tühistada.</translation> <translation id="4370425812909262207">Ostukorvid on peidetud. Need kuvatakse uuesti, kui muudatused teete.</translation> <translation id="4370975561335139969">Sisestatud e-posti aadress ja parool ei ühildu</translation> <translation id="4374831787438678295">Linuxi installiprogramm</translation> @@ -5550,6 +5549,7 @@ <translation id="7374376573160927383">USB-seadmete haldamine</translation> <translation id="7375235221357833624">{0,plural, =1{Värskendage seadet tunni jooksul}other{Värskendage seadet # tunni jooksul}}</translation> <translation id="7376553024552204454">Tõsta hiirekursor esile, kui see liigub</translation> +<translation id="737728204345822099">Kirje teie külastusest sellele saidile võidakse säilitada teie turvavõtmes.</translation> <translation id="7377451353532943397">Blokeeri ka edaspidi juurdepääs anduritele</translation> <translation id="7378611153938412599">Nõrku paroole on lihtne ära arvata. Veenduge, et looksite tugevad paroolid. <ph name="BEGIN_LINK" />Vaadake rohkem turvanõuandeid.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Ava Chrome'i veebipood</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index e18daf5..d443dc85 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -60,7 +60,7 @@ <translation id="1060292118287751956">Pantaila eguneratzeko maiztasuna zehazten du</translation> <translation id="1061904396131502319">Atseden hartzeko garaia izango da laster</translation> <translation id="1067048845568873861">Sortze-data</translation> -<translation id="1067922213147265141">Beste Google-ren zerbitzu batzuk</translation> +<translation id="1067922213147265141">Google-ren beste zerbitzu batzuk</translation> <translation id="1070377999570795893">Ordenagailuko beste programa batek Chrome-ren funtzionamenduari eragin diezaiokeen luzapen bat gehitu du. <ph name="EXTENSION_NAME" /></translation> @@ -127,6 +127,9 @@ <translation id="1140351953533677694">Atzitu Bluetooth bidezko gailuak eta seriekoak</translation> <translation id="114036956334641753">Audioa eta azpitituluak</translation> <translation id="1140746652461896221">Blokeatu edukiak ikusten dituzun orrietan</translation> +<translation id="1141953877381847186">Eman pantailako informazioa erabiltzeko baimena Laguntzailea eginbideari erantzun bizkorrak eskaintze aldera (esaterako, itzulpenak, definizioak, unitate-bihurketak eta beste). + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Gogoan izan:<ph name="END_BOLD" /> ezarpena aldatzeko, joan Google-ren Laguntzailea eginbidearen ezarpenak > Erlazionatutako informazioa atalera.</translation> <translation id="1143142264369994168">Ziurtagiriaren sinatzailea</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome-k ez du aurkitu software kaltegarririk ordenagailuan • Duela minutu bat egiaztatu du}other{Chrome-k ez du aurkitu software kaltegarririk ordenagailuan • Duela {NUM_MINS} minutu egiaztatu du}}</translation> <translation id="1145593918056169051">Inprimagailua gelditu egin da</translation> @@ -160,7 +163,7 @@ <translation id="1174073918202301297">Gehitu da lasterbidea</translation> <translation id="117445914942805388">Sinkronizatutako gailu guztietako eta zure Google-ko kontuko arakatze-datuak garbitzeko, <ph name="BEGIN_LINK" />joan sinkronizazio-ezarpenetara<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">In&primatu…</translation> -<translation id="1177138678118607465">Baliteke Google-k arakatze-historia erabiltzea Bilaketa, iragarkiak eta beste Google-ren zerbitzu batzuk pertsonalizatzeko. Hori aldatzeko, joan myaccount.google.com/activitycontrols/search helbidera.</translation> +<translation id="1177138678118607465">Baliteke Google-k arakatze-historia erabiltzea Bilaketa, iragarkiak eta Google-ren beste zerbitzu batzuk pertsonalizatzeko. Hori aldatzeko, joan myaccount.google.com/activitycontrols/search helbidera.</translation> <translation id="1177863135347784049">Pertsonalizatua</translation> <translation id="1178581264944972037">Pausatu</translation> <translation id="117916940443676133">Segurtasun-giltza ez daukazu PIN kodearekin babestuta. Saioa hasteko datuak kudeatzeko, sortu PIN bat.</translation> @@ -1436,7 +1439,9 @@ <translation id="2594999711683503743">Bilatu Google-n edo idatzi URLa</translation> <translation id="2602501489742255173">Hasteko, pasatu hatza gorantz</translation> <translation id="2603115962224169880">Garbitu ordenagailua</translation> +<translation id="2603355571917519942">Prest dago Voice Match</translation> <translation id="2603463522847370204">Ireki &ezkutuko nabigazio-leihoan</translation> +<translation id="2604138917550693049">Bilatu irudia Google Lens erabilita</translation> <translation id="2604255671529671813">Sareko konexioaren errorea</translation> <translation id="2606246518223360146">Lotu datuak</translation> <translation id="2606454609872547359">Ez, egin aurrera ChromeVox gabe</translation> @@ -1779,6 +1784,7 @@ <translation id="2963151496262057773"><ph name="PLUGIN_NAME" /> pluginak ez du erantzuten. Gelditu egin nahi duzu?</translation> <translation id="2964193600955408481">Desgaitu Wi-Fi konexioa</translation> <translation id="2964245677645334031">Nearby Share-ko ikusgaitasuna</translation> +<translation id="2966216232069818096">Eman pantailako informazioa erabiltzeko baimena Laguntzailea eginbideari laguntza jasotze aldera</translation> <translation id="2966937470348689686">Kudeatu Android hobespenak</translation> <translation id="2972581237482394796">&Berregin</translation> <translation id="2973324205039581528">Desaktibatu webguneko audioa</translation> @@ -1875,6 +1881,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Fitxa hau kamera eta mikrofonoa erabiltzen ari da.</translation> <translation id="3083193146044397360">Aldi baterako blokeatu da zure segurtasuna babesteko</translation> +<translation id="3083899879156272923">Mugitu pantaila sagua pantailaren erdian mantentzeko</translation> <translation id="3084548735795614657">Instalatzeko, jaregin</translation> <translation id="3084771660770137092">Edo Chrome memoriarik gabe geratu da, edo web-orriaren prozesua beste arrazoi batengatik amaitu da. Jarraitzeko, kargatu orria berriro edo joan beste batera.</translation> <translation id="3084958266922136097">Desgaitu pantaila-babeslea</translation> @@ -2370,6 +2377,9 @@ <translation id="3654045516529121250">Irakurri erabilerraztasun-ezarpenak</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Sarbide iraunkorra du fitxategi batetara.}other{Sarbide iraunkorra du # fitxategitara.}}</translation> <translation id="3658871634334445293">TrackPoint-aren azelerazioa</translation> +<translation id="3659830472545192450">Voice Match-i esker, Google-ren Laguntzailea eginbideak zure ahotsa identifikatzen du Chromebook-ean, eta gainerakoetatik bereizi. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Kontuan izan:<ph name="END_BOLD" /> baliteke grabaketa edo antzeko ahots batekin ere zure emaitza pertsonalak atzitu ahal izatea. Voice Match erabiltzeko baimena kendu nahi baduzu, desaktiba ezazu Laguntzailea eginbidearen ezarpenetan.</translation> <translation id="3660234220361471169">Ez-fidagarria</translation> <translation id="3664511988987167893">Luzapenaren ikonoa</translation> <translation id="3665589677786828986">Beste programa batek ezarpen batzuk hondatu dituela hauteman du Chrome-k. Ezarpen horien jatorrizko balio lehenetsiak berrezarri dira.</translation> @@ -2978,7 +2988,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> leiho bat partekatzen ari da.</translation> <translation id="4364830672918311045">Bistaratu jakinarazpenak</translation> <translation id="4366138410738374926">Inprimatzen hasi da</translation> -<translation id="437004882363131692">Lortu <ph name="DEVICE_TYPE" /> gailuari buruzko aholkuak, eskaintzak eta berritasunak, eta partekatu zure iritzia. Edonoiz ken dezakezu harpidetza.</translation> <translation id="4370425812909262207">Ezkutatu dira saskiak. Aldaketak egiten dituzunean agertuko dira berriro.</translation> <translation id="4370975561335139969">Idatzitako helbide elektronikoa eta pasahitza ez datoz bat</translation> <translation id="4374831787438678295">Linux-en instalatzailea</translation> @@ -3558,6 +3567,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Ortografia-zuzentzailea ez dago erabilgarri hautatu dituzun hizkuntzetan</translation> <translation id="5052499409147950210">Editatu webgunea</translation> +<translation id="5053962746715621840">Bilatu irudia Google Lens erabilita</translation> <translation id="5057110919553308744">Luzapena sakatzen duzunean</translation> <translation id="5057403786441168405">Kudeatu saioa hasita daukaten kontuak. Baimenen arabera, Chrome eta Google Play-ko webgune, aplikazio eta luzapenek kontu horiek erabil ditzakete zerbitzua pertsonalizatzeko. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Murriztu saioa hasteko aukera</translation> @@ -4041,6 +4051,9 @@ <translation id="5610038042047936818">Aldatu kamera modura</translation> <translation id="561030196642865721">Webgune honek onartu egiten ditu hirugarrenen cookieak</translation> <translation id="5612734644261457353">Orain ere, ezin izan da egiaztatu pasahitza. Oharra: pasahitza duela gutxi aldatu baduzu, saioa amaitu eta gero aplikatuko da pasahitz berria, beraz, erabili pasahitz zaharra hemen.</translation> +<translation id="561308544008485315">Voice Match-i esker, Google-ren Laguntzailea eginbideak zure ahotsa identifikatzen du Chromebook-ean, eta gainerakoetatik bereizi. Bateria aurrezteko, gailua energia-iturri batera konektatuta dagoenean soilik aktibatzen da "Ok Google". Aldaketak egiteko, joan Ezarpenak atalera. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Kontuan izan:<ph name="END_BOLD" /> baliteke grabaketa edo antzeko ahots batekin ere zure emaitza pertsonalak atzitu ahal izatea. Voice Match erabiltzeko baimena kendu nahi baduzu, desaktiba ezazu Laguntzailea eginbidearen ezarpenetan.</translation> <translation id="5614190747811328134">Erabiltzaileentzako oharra</translation> <translation id="5614553682702429503">Pasahitza gorde nahi duzu?</translation> <translation id="5616726534702877126">Gorde tamaina</translation> @@ -4193,7 +4206,7 @@ <translation id="5794476117027678724">Ez utzi webguneei arbeleko testua eta irudiak ikusten</translation> <translation id="5794700615121138172">Linux-eko karpeta partekatuak</translation> <translation id="5794786537412027208">Irten Chrome-ren aplikazio guztietatik</translation> -<translation id="5797070761912323120">Baliteke Google-k historia erabiltzea Bilaketa, iragarkiak eta beste Google-ren zerbitzu batzuk pertsonalizatzeko</translation> +<translation id="5797070761912323120">Baliteke Google-k historia erabiltzea Bilaketa, iragarkiak eta Google-ren beste zerbitzu batzuk pertsonalizatzeko</translation> <translation id="5798301976526354562">Testuaren tamaina (Istanteko azpitituluak eginbideari ere aplikatzen zaio)</translation> <translation id="579907812742603813">eduki babestua</translation> <translation id="579915268381781820">Kendu egin da segurtasun-giltza.</translation> @@ -4481,7 +4494,7 @@ <translation id="6124650939968185064">Luzapen hauek beste honen menpe daude:</translation> <translation id="6124698108608891449">Webgune honek baimen gehiago behar ditu.</translation> <translation id="6125479973208104919">Kontua berriro gehitu beharko duzu <ph name="DEVICE_TYPE" /> gailuan.</translation> -<translation id="6129691635767514872">Kendu dira hautatutako datuak Chrome-tik eta sinkronizatutako gailuetatik. Hala ere, Google-ko kontuaren arakatze-historiako bestelako datu batzuk (adibidez, bilaketak eta beste Google-ren zerbitzu batzuetako jarduerak) gera litezke <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> webgunean.</translation> +<translation id="6129691635767514872">Kendu dira hautatutako datuak Chrome-tik eta sinkronizatutako gailuetatik. Hala ere, Google-ko kontuaren arakatze-historiako bestelako datu batzuk (adibidez, bilaketak eta Google-ren beste zerbitzu batzuetako jarduerak) gera litezke <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> webgunean.</translation> <translation id="6129938384427316298">Netscape ziurtagiriaren iruzkina</translation> <translation id="6129953537138746214">Zuriunea</translation> <translation id="6130692320435119637">Gehitu wifi-sarea</translation> @@ -5071,6 +5084,7 @@ <translation id="6824584962142919697">&Aztertu elementuak</translation> <translation id="6825184156888454064">Ordenatu izenaren arabera</translation> <translation id="6826872289184051766">Egiaztatu USB bidez</translation> +<translation id="6827604573767207488">Laguntzailea konfiguratuta eta pertsonalizatuta daukazu beste gailu batean. Eginbide horri are etekin handiagoa ateratzeko, aktibatu jarraian ageri den ezarpena.</translation> <translation id="6828153365543658583">Mugatu erabiltzaile hauen saio-hasiera:</translation> <translation id="6828182567531805778">Datuak sinkronizatzeko, idatzi pasaesaldia</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5506,6 +5520,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> domeinuak ADB arazketa desgaitu du. <ph name="DEVICE_TYPE" /> berrabiarazi ondoren, ezingo dituzu instalatu iturburu ezezagunetako aplikazioak.</translation> <translation id="7328867076235380839">Konbinazioak ez du balio</translation> <translation id="7329154610228416156">Ezin izan da hasi saioa, segurua ez den URL bat (<ph name="BLOCKED_URL" />) erabiltzeko konfiguratu delako. Jarri administratzailearekin harremanetan.</translation> +<translation id="7329932885428707942">Baliteke horren eraginez sare mugikorra une batez deskonektatzea.</translation> <translation id="7332053360324989309">Langile espezifikoa: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Gaitu lupa ainguratzeko aukera</translation> <translation id="7335974957018254119">Erabili ortografia-zuzentzailea hizkuntza hauetan:</translation> @@ -5549,6 +5564,7 @@ <translation id="7374376573160927383">Kudeatu USB bidezko gailuak</translation> <translation id="7375235221357833624">{0,plural, =1{Eguneratu gailua ordubeteko epean}other{Eguneratu gailua # orduko epean}}</translation> <translation id="7376553024552204454">Mugitzen ari denean, nabarmendu saguaren erakuslea</translation> +<translation id="737728204345822099">Baliteke webgune hau bisitatu izana erregistratzea segurtasun-giltzan.</translation> <translation id="7377451353532943397">Jarraitu sentsoreetarako sarbidea blokeatzen</translation> <translation id="7378611153938412599">Seguruak ez diren pasahitzak erraz asmatzen dira. Ziurtatu pasahitz seguruak sortzen dituzula. <ph name="BEGIN_LINK" />Ikusi segurtasun-aholku gehiago.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Ireki Chrome Web Store</translation> @@ -6175,6 +6191,7 @@ <translation id="8059417245945632445">&Aztertu gailuak</translation> <translation id="8059456211585183827">Ez dago inprimagailurik gordetzeko.</translation> <translation id="8061091456562007989">Leheneratu</translation> +<translation id="8061991877177392872">Voice Match konfiguratuta daukazu beste gailu batean Laguntzailea eginbidearen bidez. Lehendik zeneuzkan grabaketa horiekin ahots-eredu bat sortu da gailu honetan.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 orri}other{{COUNT} orri}}</translation> <translation id="8062879968880283306">Eskaneatu QR kodea gailuaren kamera erabiliz edo idatzi operadoreak emandako aktibazio-kodea.</translation> <translation id="8063235345342641131">Abatar berde lehenetsia</translation> @@ -6446,6 +6463,7 @@ <translation id="8379991678458444070">Hona bizkor itzuli ahal izateko, egin fitxa honen laster-marka</translation> <translation id="8382913212082956454">Kopiatu &helbide elektronikoa</translation> <translation id="8386091599636877289">Ez da aurkitu gidalerroa.</translation> +<translation id="8386819192691131213">Eman pantailako informazioa erabiltzeko baimena Laguntzailea eginbideari erantzun bizkorrak eskaintze aldera (esaterako, itzulpenak, definizioak, unitate-bihurketak eta beste)</translation> <translation id="8386903983509584791">Amaitu da bilaketa</translation> <translation id="8387361103813440603">Ezin dute ikusi zure kokapena</translation> <translation id="8389264703141926739">Blokeatu jakinarazpenak</translation> @@ -6928,6 +6946,7 @@ <translation id="8915370057835397490">Iradokizuna kargatzen</translation> <translation id="8916476537757519021">Ezkutuko moduko azpimarkoa: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> erabiltzailearen <ph name="DEVICE_TYPE" /> gailua</translation> +<translation id="8922624386829239660">Mugitu pantaila sagua pantailaren ertzera iristen denean</translation> <translation id="8923880975836399332">Anil iluna</translation> <translation id="8925458182817574960">&Ezarpenak</translation> <translation id="8926389886865778422">Ez galdetu berriro</translation> @@ -7006,6 +7025,7 @@ <translation id="9009708085379296446">Aldaketak egin nahi zenizkion orriari?</translation> <translation id="9011163749350026987">Erakutsi beti ikonoa</translation> <translation id="9011393886518328654">Bertsioaren oharrak</translation> +<translation id="9012122671773859802">Mugitu pantaila saguari jarraikiz</translation> <translation id="9013037634206938463"><ph name="INSTALL_SIZE" /> eduki behar dira libre Linux instalatzeko. Tokia egiteko, ezabatu gailuan dauden fitxategiak.</translation> <translation id="9013707997379828817">Administratzaileak gailua leheneratu du. Gorde fitxategi garrantzitsuak eta berrabiarazi gailua. Bertako datu guztiak ezabatu egingo dira.</translation> <translation id="901668144954885282">Egin babeskopia Google Drive-n</translation> @@ -7050,6 +7070,7 @@ <translation id="9052404922357793350">Jarraitu blokeatzen</translation> <translation id="9053563360605707198">Inprimatu bi aldeetatik</translation> <translation id="9053893665344928494">Gogoratu nire aukera</translation> +<translation id="9055278955535611574">Atzitu Laguntzailea "Ok Google" esanda</translation> <translation id="9055636786322918818">Aplikatu RC4 enkriptatzea. Aukera honek arriskua areagotzen du, RC4 enkriptatze-kateak ez baitira seguruak.</translation> <translation id="9056810968620647706">Ez da emaitzarik aurkitu.</translation> <translation id="9057354806206861646">Eguneratu programazioa</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 6dc779a..0f9c9f7 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -2976,7 +2976,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> در حال اشتراکگذاری یک پنجره است.</translation> <translation id="4364830672918311045">نمایش اعلانها</translation> <translation id="4366138410738374926">چاپ شروع شد</translation> -<translation id="437004882363131692">نکتهها، پیشنهادها، و بهروزرسانیهای مربوط به <ph name="DEVICE_TYPE" /> را دریافت کنید و بازخورد ارائه دهید. هرزمان خواستید اشتراک را لغو کنید.</translation> <translation id="4370425812909262207">سبدها پنهان شد. هروقت تغییری ایجاد کنید ظاهر میشود.</translation> <translation id="4370975561335139969">ایمیل و گذرواژهای که وارد کردهاید، مطابقت ندارند</translation> <translation id="4374831787438678295">نصبکننده Linux</translation> @@ -5548,6 +5547,7 @@ <translation id="7374376573160927383">مدیریت دستگاههای USB</translation> <translation id="7375235221357833624">{0,plural, =1{دستگاه را تا یک ساعت دیگر بهروزرسانی کنید}one{دستگاه را تا # ساعت دیگر بهروزرسانی کنید}other{دستگاه را تا # ساعت دیگر بهروزرسانی کنید}}</translation> <translation id="7376553024552204454">برجسته کردن نشانگر موشواره هنگامی که حرکت میکند</translation> +<translation id="737728204345822099">ممکن است سابقه بازدیدتان از این سایت در کلید امنیتیتان نگهداری شود.</translation> <translation id="7377451353532943397">دسترسی به حسگر همچنان مسدود شود</translation> <translation id="7378611153938412599">گذرواژههای ضعیف را میتوان بهراحتی حدس زد. مطمئن شوید گذرواژههایی که ایجاد میکنید قوی باشند. <ph name="BEGIN_LINK" />نکتههای امنیتی بیشتری ببینید.<ph name="END_LINK" /></translation> <translation id="73786666777299047">باز کردن نتبازار Chrome</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index dcfce01..97a8df0 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -2965,7 +2965,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> jakaa ikkunan.</translation> <translation id="4364830672918311045">Näytä ilmoitukset</translation> <translation id="4366138410738374926">Tulostus aloitettu</translation> -<translation id="437004882363131692">Tilaa vinkkejä, tarjouksia ja päivityksiä (<ph name="DEVICE_TYPE" />) ja anna palautetta. Voit peruuttaa tilauksen milloin tahansa.</translation> <translation id="4370425812909262207">Ostoskorit on piilotettu. Ne tulevat takaisin näkyviin, kun teet muutoksia.</translation> <translation id="4370975561335139969">Antamasi sähköpostiosoite ja salasana eivät vastaa toisiaan.</translation> <translation id="4374831787438678295">Linux-asennusohjelma</translation> @@ -5524,6 +5523,7 @@ <translation id="7374376573160927383">USB-laitteiden valinnat</translation> <translation id="7375235221357833624">{0,plural, =1{Päivitä laite tunnin kuluessa}other{Päivitä laite # tunnin kuluessa}}</translation> <translation id="7376553024552204454">Korosta hiiren osoitinta, kun se liikkuu</translation> +<translation id="737728204345822099">Tieto käynnistäsi tällä sivustolla voi tallentua suojausavaimeesi.</translation> <translation id="7377451353532943397">Estä edelleen tunnistimien käyttö</translation> <translation id="7378611153938412599">Heikko salasana on helppo arvata. Muista käyttää vahvoja salasanoja. <ph name="BEGIN_LINK" />Katso muita tietoturvavinkkejä.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Avaa Chrome Web Store</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index dbfcfa4..3e24585 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">I-access ang iyong mga Bluetooth at Serial device</translation> <translation id="114036956334641753">Audio at mga caption</translation> <translation id="1140746652461896221">I-block ang content sa anumang page na binibisita mo</translation> +<translation id="1141953877381847186">Payagan ang Assistant na gamitin ang impormasyon sa screen para makapagbigay ng mga mabilisang sagot gaya ng pagsasalin, kahulugan, conversion ng yunit, at higit pa. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Tandaan:<ph name="END_BOLD" /> Puwede mo itong baguhin anumang oras sa ibang pagkakataon sa Mga Setting ng Google Assistant > Nauugnay na impormasyon.</translation> <translation id="1143142264369994168">Tagapaglagda ng Certificate</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Walang nakitang mapaminsalang software ang Chrome sa iyong computer • Tiningnan 1 minuto ang nakalipas}one{Walang nakitang mapaminsalang software ang Chrome sa iyong computer • Tiningnan {NUM_MINS} minuto ang nakalipas}other{Walang nakitang mapaminsalang software ang Chrome sa iyong computer • Tiningnan {NUM_MINS} na minuto ang nakalipas}}</translation> <translation id="1145593918056169051">Huminto ang printer</translation> @@ -1433,7 +1436,9 @@ <translation id="2594999711683503743">Hanapin sa Google o i-type ang URL</translation> <translation id="2602501489742255173">Mag-swipe pataas para makapagsimula</translation> <translation id="2603115962224169880">Linisin ang computer</translation> +<translation id="2603355571917519942">Handa na ang Voice Match</translation> <translation id="2603463522847370204">Buksan sa &incognito window</translation> +<translation id="2604138917550693049">Maghanap ng larawan gamit ang Google Lens</translation> <translation id="2604255671529671813">Error sa koneksyon ng network</translation> <translation id="2606246518223360146">I-link ang Data</translation> <translation id="2606454609872547359">Hindi, magpatuloy nang walang ChromeVox</translation> @@ -1775,6 +1780,7 @@ <translation id="2963151496262057773">Hindi tumutugon ang sumusunod na plugin: <ph name="PLUGIN_NAME" />Gusto mo bang ihinto ito?</translation> <translation id="2964193600955408481">Huwag paganahin ang Wi-Fi</translation> <translation id="2964245677645334031">Visibility sa Nearby Share</translation> +<translation id="2966216232069818096">Hayaan ang iyong Assistant na gamitin ang impormasyon sa iyong screen para makatulong</translation> <translation id="2966937470348689686">Pamahalaan ang mga kagustuhan sa Android</translation> <translation id="2972581237482394796">&I-redo</translation> <translation id="2973324205039581528">I-mute ang Site</translation> @@ -1870,6 +1876,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Ginagamit ng tab na ito ang iyong camera o mikropono.</translation> <translation id="3083193146044397360">Pansamantalang na-block upang protektahan ang iyong seguridad</translation> +<translation id="3083899879156272923">Igalaw ang screen habang pinapanatili ang mouse sa gitna ng screen</translation> <translation id="3084548735795614657">I-drop upang i-install</translation> <translation id="3084771660770137092">Naubusan ng memorya ang Chrome o winakasan ang proseso para sa webpage dahil sa ilang kadahilanan. Upang magpatuloy, mag-reload o pumunta sa isa pang pahina.</translation> <translation id="3084958266922136097">I-disable ang screen saver</translation> @@ -2363,6 +2370,9 @@ <translation id="3654045516529121250">Basahin ang iyong mga setting ng pagiging naa-access</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{May permanenteng access ito sa isang file.}one{May permanenteng access ito sa # file.}other{May permanenteng access ito sa # na file.}}</translation> <translation id="3658871634334445293">Pag-accelerate ng TrackPoint</translation> +<translation id="3659830472545192450">Tinutulungan ng Voice Match ang iyong Google Assistant na tukuyin ang boses mo sa iyong Chromebook at makilala ka mula sa iba. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Tandaan:<ph name="END_BOLD" /> Posibleng ma-access din ng katulad na boses o recording ang iyong mga personal na resulta. Puwede mong alisin ang pahintulot sa Voice Match sa ibang pagkakataon sa pamamagitan ng pag-off nito sa Mga Setting ng Assistant.</translation> <translation id="3660234220361471169">Hindi pinagkakatiwalaan</translation> <translation id="3664511988987167893">Icon ng Extension</translation> <translation id="3665589677786828986">Natunton ng Chrome na ilan sa iyong mga setting ay nasira ng isa pang program at ni-reset ang mga ito sa kanilang mga orihinal na default.</translation> @@ -2969,7 +2979,6 @@ <translation id="4364567974334641491">Nagbabahagi ng window ang <ph name="APP_NAME" />.</translation> <translation id="4364830672918311045">Ipakita ang mga notification</translation> <translation id="4366138410738374926">Nagsimula ang pag-print</translation> -<translation id="437004882363131692">Makatanggap ng mga tip, alok, at update sa <ph name="DEVICE_TYPE" />, at magbahagi ng feedback. Mag-unsubscribe anumang oras.</translation> <translation id="4370425812909262207">Itinago ang mga cart. Lalabas ulit ang mga ito kapag gumawa ka ng mga pagbabago.</translation> <translation id="4370975561335139969">Hindi nagtutugma ang inilagay mong email at password</translation> <translation id="4374831787438678295">Installer ng Linux</translation> @@ -3546,6 +3555,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Hindi sinusuportahan ang spellcheck para sa mga pinili mong wika</translation> <translation id="5052499409147950210">I-edit ang site</translation> +<translation id="5053962746715621840">Maghanap ng Larawan gamit ang Google Lens</translation> <translation id="5057110919553308744">Kapag iki-click mo ang extension</translation> <translation id="5057403786441168405">Pamahalaan ang iyong mga naka-sign in na account. Puwedeng gamitin ng mga website, app, at extension sa Chrome at Google Play ang mga account na ito para i-customize ang iyong karanasan, depende sa mga pahintulot. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Paghigpitan ang pag-sign in</translation> @@ -4028,6 +4038,9 @@ <translation id="5610038042047936818">Lumipat sa camera mode</translation> <translation id="561030196642865721">Pinapayagan ang third-party na cookies sa site na ito</translation> <translation id="5612734644261457353">Paumanhin, hindi pa rin ma-verify ang iyong password. Tandaan: kung pinalitan mo kamakailan ang iyong password, malalapat ang iyong bagong password sa sandaling mag-sign out ka, pakigamit ang lumang password dito.</translation> +<translation id="561308544008485315">Tinutulungan ng Voice Match ang iyong Google Assistant na tukuyin ang boses mo sa iyong Chromebook at makilala ka mula sa iba. Para makatipid ng baterya, naka-on lang ang "Hey Google" kapag nakakonekta ang iyong device sa isang source ng kuryente. Para gumawa ng mga pagbabago, pumunta sa Mga Setting. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Tandaan:<ph name="END_BOLD" /> Posibleng ma-access din ng katulad na boses o recording ang iyong mga personal na resulta. Puwede mong alisin ang pahintulot sa Voice Match sa ibang pagkakataon sa pamamagitan ng pag-off nito sa Mga Setting ng Assistant.</translation> <translation id="5614190747811328134">Notice sa User</translation> <translation id="5614553682702429503">I-save ang password?</translation> <translation id="5616726534702877126">Magreserba ng espasyo</translation> @@ -5051,6 +5064,7 @@ <translation id="6824584962142919697">&Siyasatin ang mga element</translation> <translation id="6825184156888454064">Uriin ayon sa pangalan</translation> <translation id="6826872289184051766">I-verify sa pamamagitan ng USB</translation> +<translation id="6827604573767207488">Mukhang na-set up mo na ang naka-personalize na Assistant sa ibang device. Mas sulitin ang iyong Assistant sa pamamagitan ng pag-on sa sumusunod na setting.</translation> <translation id="6828153365543658583">Higpitan ang pag-sign-in sa mga sumusunod na user:</translation> <translation id="6828182567531805778">Ilagay ang iyong passphrase para i-sync ang data mo</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5485,6 +5499,7 @@ <translation id="7327989755579928735">Na-disable ng <ph name="MANAGER" /> ang pag-debug ng ADB. Kapag na-restart mo ang iyong <ph name="DEVICE_TYPE" />, hindi ka makakapag-sideload ng mga app.</translation> <translation id="7328867076235380839">Invalid ang kumbinasyon</translation> <translation id="7329154610228416156">Hindi nakapag-sign in dahil naka-configure ito sa paggamit ng isang hindi secure na URL (<ph name="BLOCKED_URL" />). Mangyaring makipag-ugnayan sa iyong administrator.</translation> +<translation id="7329932885428707942">Posible itong magdulot ng maikling pagdiskonekta ng cellular network.</translation> <translation id="7332053360324989309">Nakalaang Worker: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">I-enable ang naka-dock na magnifier</translation> <translation id="7335974957018254119">Gumamit ng pang-check ng pagbabaybay para sa</translation> @@ -5528,6 +5543,7 @@ <translation id="7374376573160927383">Pamahalaan ang mga USB device</translation> <translation id="7375235221357833624">{0,plural, =1{I-update ang device sa loob ng isang oras}one{I-update ang device sa loob ng # oras}other{I-update ang device sa loob ng # na oras}}</translation> <translation id="7376553024552204454">I-highlight ang cursor ng mouse kapag gumagalaw ito</translation> +<translation id="737728204345822099">Posibleng papanatilihin sa iyong security key ang tala ng pagbisita mo sa site na ito.</translation> <translation id="7377451353532943397">Patuloy na i-block ang access sa sensor</translation> <translation id="7378611153938412599">Madaling hulaan ang mahihinang password. Tiyaking malalakas na password ang gagawin mo. <ph name="BEGIN_LINK" />Tumingin pa ng mga tip sa seguridad.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Buksan ang Chrome Web Store</translation> @@ -6154,6 +6170,7 @@ <translation id="8059417245945632445">&Inspeksyunin ang mga device</translation> <translation id="8059456211585183827">Walang printer na available na i-save.</translation> <translation id="8061091456562007989">Ibalik ito sa dati</translation> +<translation id="8061991877177392872">Mukhang na-set up mo na ang Voice Match sa iyong Assistant sa isa pang device. Ginamit ang mga nakaraang recording na ito para gumawa ng voice model sa device na ito.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 pirasong papel}one{{COUNT} pirasong papel}other{{COUNT} na pirasong papel}}</translation> <translation id="8062879968880283306">I-scan ang QR code gamit ang camera ng device o ilagay ang code sa pag-activate na ibinigay ng iyong carrier.</translation> <translation id="8063235345342641131">Default na berdeng avatar</translation> @@ -6423,6 +6440,7 @@ <translation id="8379991678458444070">Makabalik kaagad dito sa pamamagitan ng pag-bookmark sa tab na ito</translation> <translation id="8382913212082956454">Kopyahin ang &email address</translation> <translation id="8386091599636877289">Hindi nakita ang patakaran.</translation> +<translation id="8386819192691131213">Payagan ang Assistant na gamitin ang impormasyon sa screen para makapagbigay ng mga mabilisang sagot gaya ng pagsasalin, kahulugan, conversion ng yunit, at higit pa</translation> <translation id="8386903983509584791">Nakumpleto ang pag-scan</translation> <translation id="8387361103813440603">Hindi pinapayagang makita ang iyong lokasyon</translation> <translation id="8389264703141926739">I-block ang mga notification</translation> @@ -6903,6 +6921,7 @@ <translation id="8915370057835397490">Nilo-load ang suhestiyon</translation> <translation id="8916476537757519021">Incognito na Subframe: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> ni <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Igalaw ang screen kapag napunta ang mouse sa mga gilid ng screen</translation> <translation id="8923880975836399332">Dark teal</translation> <translation id="8925458182817574960">&Mga Setting</translation> <translation id="8926389886865778422">Huwag nang itanong ulit</translation> @@ -6980,6 +6999,7 @@ <translation id="9009708085379296446">Gusto mo bang baguhin ang page na ito?</translation> <translation id="9011163749350026987">Palaging ipakita ang icon</translation> <translation id="9011393886518328654">Mga tala sa pag-release</translation> +<translation id="9012122671773859802">Tuloy-tuloy na igalaw ang screen habang gumagalaw ang mouse</translation> <translation id="9013037634206938463">Kinakailangan ng <ph name="INSTALL_SIZE" /> na bakanteng espasyo para ma-install ang Linux. Para madagdagan ang bakanteng espasyo, mag-delete ng mga file sa iyong device.</translation> <translation id="9013707997379828817">Na-roll back ng iyong administrator ang device na ito. Paki-save ang mahahalagang file, pagkatapos ay mag-restart. Made-delete ang lahat ng data sa device.</translation> <translation id="901668144954885282">I-back up sa Google Drive</translation> @@ -7024,6 +7044,7 @@ <translation id="9052404922357793350">Patuloy na i-block</translation> <translation id="9053563360605707198">Mag-print sa magkabilang bahagi</translation> <translation id="9053893665344928494">Tandaan ang aking pinili</translation> +<translation id="9055278955535611574">I-access ang iyong Assistant gamit ang "Hey Google"</translation> <translation id="9055636786322918818">Ipatupad ang RC4 encryption. Magiging mas mapanganib para sa iyo kapag ginamit ang opsyong ito, dahil hindi secure ang mga RC4 cipher.</translation> <translation id="9056810968620647706">Walang nakitang tugma.</translation> <translation id="9057354806206861646">I-update ang iskedyul</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index d67a078..cd78d30 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Accéder à vos appareils connectés par Bluetooth et en série</translation> <translation id="114036956334641753">Audio et sous-titres</translation> <translation id="1140746652461896221">Bloquer du contenu sur n'importe quelle page que vous consultez</translation> +<translation id="1141953877381847186">Autorisez l'Assistant à utiliser l'information sur l'écran pour vous présenter des réponses rapides comme des traductions, des définitions, des conversions d'unités et plus encore. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Gardez à l'esprit :<ph name="END_BOLD" /> Vous pourrez toujours modifier cette option plus tard sous Paramètres de l'Assistant Google > Données connexes.</translation> <translation id="1143142264369994168">Signataire du certificat</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome n'a détecté aucun logiciel malveillant sur votre ordinateur • Vérification effectuée il y a 1 minute}one{Chrome n'a détecté aucun logiciel malveillant sur votre ordinateur • Vérification effectuée il y a {NUM_MINS} minute}other{Chrome n'a détecté aucun logiciel malveillant sur votre ordinateur • Vérification effectuée il y a {NUM_MINS} minutes}}</translation> <translation id="1145593918056169051">L'imprimante s'est arrêtée</translation> @@ -1434,7 +1437,9 @@ <translation id="2594999711683503743">Effectuez une recherche sur Google ou entrez une adresse URL</translation> <translation id="2602501489742255173">Glissez votre doigt vers le haut pour commencer</translation> <translation id="2603115962224169880">Nettoyer l'ordinateur</translation> +<translation id="2603355571917519942">Voice Match est prête à être utilisée</translation> <translation id="2603463522847370204">Ouvrir dans une fenêtre de &navigation privée</translation> +<translation id="2604138917550693049">Rechercher l'image avec Lentille Google</translation> <translation id="2604255671529671813">Erreur de connexion réseau</translation> <translation id="2606246518223360146">Associer les données</translation> <translation id="2606454609872547359">Non, continuer sans ChromeVox</translation> @@ -1776,6 +1781,7 @@ <translation id="2963151496262057773">Le plugiciel suivant ne répond pas : <ph name="PLUGIN_NAME" />. Voulez-vous l'arrêter?</translation> <translation id="2964193600955408481">Désactiver le réseau Wi-Fi</translation> <translation id="2964245677645334031">Visibilité pour le partage à proximité</translation> +<translation id="2966216232069818096">Autoriser votre Assistant à utiliser l'information à l'écran pour vous aider</translation> <translation id="2966937470348689686">Gérer les préférences Android</translation> <translation id="2972581237482394796">&Rétablir</translation> <translation id="2973324205039581528">Désactiver le son sur le site</translation> @@ -1871,6 +1877,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Cet onglet utilise votre caméra ou votre microphone.</translation> <translation id="3083193146044397360">Bloquée temporairement afin de protéger votre confidentialité</translation> +<translation id="3083899879156272923">Déplacer l'écran pour laisser le pointeur de la souris au centre de l'écran</translation> <translation id="3084548735795614657">Déposer pour installer</translation> <translation id="3084771660770137092">Google Chrome n'avait pas suffisamment de mémoire ou le processus de la page Web a été arrêté pour une autre raison. Pour continuer, actualisez la page ou ouvrez-en une autre.</translation> <translation id="3084958266922136097">Désactiver l'écran de veille</translation> @@ -2364,6 +2371,9 @@ <translation id="3654045516529121250">Lire vos paramètres d'accessibilité</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Elle dispose d'un accès permanent à un fichier.}one{Elle dispose d'un accès permanent à # fichier.}other{Elle dispose d'un accès permanent à # fichiers.}}</translation> <translation id="3658871634334445293">Accélération TrackPoint</translation> +<translation id="3659830472545192450">Voice Match aide votre Assistant Google à reconnaître votre voix sur votre Chromebook et à vous distinguer des autres. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Gardez à l'esprit :<ph name="END_BOLD" /> Une voix similaire ou un enregistrement pourrait aussi être en mesure d'accéder à vos résultats personnalisés. Vous pouvez retirer l'autorisation de Voice Match plus tard en la désactivant dans les paramètres de l'Assistant.</translation> <translation id="3660234220361471169">Non fiable</translation> <translation id="3664511988987167893">Icône de l'extension</translation> <translation id="3665589677786828986">Chrome a détecté que certains paramètres de votre navigateur ont été corrompus par un autre programme, et les a réinitialisé à leurs valeurs par défaut.</translation> @@ -2970,7 +2980,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> partage une fenêtre.</translation> <translation id="4364830672918311045">Afficher les notifications</translation> <translation id="4366138410738374926">L'impression a commencé</translation> -<translation id="437004882363131692">Obtenez des conseils sur votre <ph name="DEVICE_TYPE" />, des offres et des mises à jour, et transmettez vos commentaires. Vous pouvez vous désabonner à tout moment.</translation> <translation id="4370425812909262207">Paniers masqués. Ils s'afficheront de nouveau lorsque vous effectuerez des changements.</translation> <translation id="4370975561335139969">L’adresse de courriel et le mot de passe que vous avez entrés ne correspondent pas</translation> <translation id="4374831787438678295">Installateur Linux</translation> @@ -3547,6 +3556,7 @@ <translation id="5050330054928994520">Synthèse vocale</translation> <translation id="5051836348807686060">Le correcteur orthographique n'est pas pris en charge pour les langues que vous avez sélectionnées</translation> <translation id="5052499409147950210">Modifier le site</translation> +<translation id="5053962746715621840">Rechercher l'image avec Lentille Google</translation> <translation id="5057110919553308744">Lorsque vous cliquez sur l'extension</translation> <translation id="5057403786441168405">Gérez les comptes auxquels vous êtes connecté. Les sites Web, les applications et les extensions dans Chrome et dans Google Play peuvent utiliser ces comptes pour personnaliser votre expérience, selon les autorisations accordées. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Restreindre les connexions</translation> @@ -4028,6 +4038,9 @@ <translation id="5610038042047936818">Passer en mode appareil photo</translation> <translation id="561030196642865721">Les témoins tiers sont autorisés sur ce site</translation> <translation id="5612734644261457353">Désolés, nous ne pouvons toujours pas valider votre mot de passe. Remarque : si vous l'avez modifié dernièrement, votre nouveau mot de passe ne sera mis à jour qu'une fois que vous vous serez déconnecté. Veuillez donc utiliser votre ancien mot de passe.</translation> +<translation id="561308544008485315">Voice Match aide votre Assistant Google à reconnaître votre voix sur votre Chromebook et à vous distinguer des autres. Pour économiser la pile, « Ok Google » est activé seulement quand votre appareil est connecté à une source d'alimentation. Pour apporter des modifications, accédez au menu Paramètres. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Gardez à l'esprit :<ph name="END_BOLD" /> Une voix similaire ou un enregistrement pourrait aussi être en mesure d'accéder à vos résultats personnalisés. Vous pouvez retirer l'autorisation de Voice Match plus tard en la désactivant dans les paramètres de l'Assistant.</translation> <translation id="5614190747811328134">Avis pour les utilisateurs</translation> <translation id="5614553682702429503">Enregistrer le mot de passe?</translation> <translation id="5616726534702877126">Réserver l'espace</translation> @@ -5051,6 +5064,7 @@ <translation id="6824584962142919697">&Inspecter des éléments</translation> <translation id="6825184156888454064">Trier par nom</translation> <translation id="6826872289184051766">Vérifier par l'intermédiaire de la technologie USB</translation> +<translation id="6827604573767207488">On dirait que vous avez déjà configuré et personnalisé l'Assistant sur un autre appareil. Profitez davantage de votre Assistant en activant le paramètre suivant.</translation> <translation id="6828153365543658583">Autoriser uniquement les utilisateurs suivants à se connecter :</translation> <translation id="6828182567531805778">Entrez votre phrase de passe pour synchroniser vos données</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5485,6 +5499,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> a désactivé le débogage PDA. Après avoir redémarré votre <ph name="DEVICE_TYPE" />, vous ne pourrez plus télécharger d'applications d'une source tierce.</translation> <translation id="7328867076235380839">Combinaison incorrecte</translation> <translation id="7329154610228416156">La connexion a échoué, car elle a été configurée pour utiliser une adresse URL non sécurisée (<ph name="BLOCKED_URL" />). Veuillez communiquer avec votre administrateur.</translation> +<translation id="7329932885428707942">Cette action pourrait entraîner une brève déconnexion du réseau cellulaire.</translation> <translation id="7332053360324989309">Traitement dédié : <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Activer la loupe en mode ancré</translation> <translation id="7335974957018254119">Utiliser le correcteur orthographique pour</translation> @@ -5528,6 +5543,7 @@ <translation id="7374376573160927383">Gérer les appareils USB</translation> <translation id="7375235221357833624">{0,plural, =1{Mettre à jour l'appareil d'ici une heure}one{Mettre à jour l'appareil d'ici # heure}other{Mettre à jour l'appareil d'ici # heures}}</translation> <translation id="7376553024552204454">Mettre le curseur de la souris en surbrillance lorsque vous le déplacez</translation> +<translation id="737728204345822099">Une trace de votre visite sur ce site pourrait être enregistrée sur votre clé de sécurité.</translation> <translation id="7377451353532943397">Continuer de bloquer l'accès aux capteurs</translation> <translation id="7378611153938412599">Les mots de passe faibles sont faciles à deviner. Assurez-vous de créer des mots de passe forts. <ph name="BEGIN_LINK" />Consultez plus d'astuces de sécurité.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Ouvrir la boutique en ligne Chrome Web Store</translation> @@ -6153,6 +6169,7 @@ <translation id="8059417245945632445">&Inspecter les appareils</translation> <translation id="8059456211585183827">Il n'y a aucune imprimante à enregistrer.</translation> <translation id="8061091456562007989">Rétablir</translation> +<translation id="8061991877177392872">On dirait que vous avez déjà configuré Voice Match avec votre Assistant sur un autre appareil. Ces enregistrements précédents ont été utilisés pour créer un modèle vocal sur cet appareil.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 feuille de papier}one{{COUNT} feuille de papier}other{{COUNT} feuilles de papier}}</translation> <translation id="8062879968880283306">Numérisez le code QR à l'aide de l'appareil photo de votre appareil ou entrez le code d'activation fourni par votre fournisseur de services.</translation> <translation id="8063235345342641131">Avatar vert par défaut</translation> @@ -6422,6 +6439,7 @@ <translation id="8379991678458444070">Revenez ici rapidement en ajoutant cet onglet aux favoris</translation> <translation id="8382913212082956454">Copier l'adresse de courri&el</translation> <translation id="8386091599636877289">Politique introuvable.</translation> +<translation id="8386819192691131213">Autorisez l'Assistant à utiliser l'information sur l'écran pour vous présenter des réponses rapides comme des traductions, des définitions, des conversions d'unités et plus encore</translation> <translation id="8386903983509584791">Recherche terminée</translation> <translation id="8387361103813440603">Non autorisés à consulter votre position</translation> <translation id="8389264703141926739">Bloquer les notifications</translation> @@ -6900,6 +6918,7 @@ <translation id="8915370057835397490">Chargement des suggestions en cours…</translation> <translation id="8916476537757519021">Sous-cadre de navigation privée : <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Déplacer l'écran lorsque le pointeur de la souris touche les rebords de l'écran</translation> <translation id="8923880975836399332">Turquoise foncé</translation> <translation id="8925458182817574960">Paramètre&s</translation> <translation id="8926389886865778422">Ne plus afficher ce message</translation> @@ -6977,6 +6996,7 @@ <translation id="9009708085379296446">Vouliez-vous modifier cette page?</translation> <translation id="9011163749350026987">Toujours afficher l'icône</translation> <translation id="9011393886518328654">Notes de version</translation> +<translation id="9012122671773859802">Déplacer l'écran en continu pour suivre le mouvement du pointeur de la souris</translation> <translation id="9013037634206938463"><ph name="INSTALL_SIZE" /> d'espace libre est nécessaire pour utiliser Linux. Pour libérer de l'espace, supprimez des fichiers sur votre appareil.</translation> <translation id="9013707997379828817">Votre administrateur a restauré cet appareil. Veuillez enregistrer les fichiers importants, puis redémarrer. Toutes les données sur l'appareil seront supprimées.</translation> <translation id="901668144954885282">Sauvegarder sur Google Disque</translation> @@ -7021,6 +7041,7 @@ <translation id="9052404922357793350">Continuer le blocage</translation> <translation id="9053563360605707198">Imprimer sur les deux côtés</translation> <translation id="9053893665344928494">Se souvenir de mon choix</translation> +<translation id="9055278955535611574">Accéder à votre Assistant en disant « Ok Google »</translation> <translation id="9055636786322918818">Appliquer le chiffrement RC4. L'utilisation de cette option augmente les risques, car les chiffrements RC4 ne sont pas sécurisés.</translation> <translation id="9056810968620647706">Aucune correspondance trouvée</translation> <translation id="9057354806206861646">Mettre à jour le calendrier</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 68d193cf..8403763 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Accéder à vos appareils reliés via le Bluetooth et le port série</translation> <translation id="114036956334641753">Audio et sous-titres</translation> <translation id="1140746652461896221">Bloquer le contenu sur toutes les pages visitées</translation> +<translation id="1141953877381847186">Il pourra ainsi vous fournir des réponses rapides, comme des traductions, des définitions, des conversions d'unités, etc. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />À noter<ph name="END_BOLD" /> : Vous pourrez modifier ce paramètre plus tard dans Paramètres de l'Assistant Google > Informations connexes.</translation> <translation id="1143142264369994168">Signataire du certificat </translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome n'a détecté aucun logiciel malveillant sur votre ordinateur • Vérification effectuée il y a 1 minute}one{Chrome n'a détecté aucun logiciel malveillant sur votre ordinateur • Vérification effectuée il y a {NUM_MINS} minute}other{Chrome n'a détecté aucun logiciel malveillant sur votre ordinateur • Vérification effectuée il y a {NUM_MINS} minutes}}</translation> <translation id="1145593918056169051">L'imprimante s'est arrêtée</translation> @@ -1433,7 +1436,9 @@ <translation id="2594999711683503743">Rechercher sur Google ou saisir une URL</translation> <translation id="2602501489742255173">Balayez l'écran vers le haut pour démarrer</translation> <translation id="2603115962224169880">Nettoyer l'ordinateur</translation> +<translation id="2603355571917519942">Voice Match est prêt</translation> <translation id="2603463522847370204">Ouvrir dans une fenêtre de &navigation privée</translation> +<translation id="2604138917550693049">Rechercher l'image avec Google Lens</translation> <translation id="2604255671529671813">Erreur de connexion réseau</translation> <translation id="2606246518223360146">Associer les données</translation> <translation id="2606454609872547359">Non, continuer sans ChromeVox</translation> @@ -1775,6 +1780,7 @@ <translation id="2963151496262057773">Le plug-in "<ph name="PLUGIN_NAME" />" ne répond pas. Voulez-vous l'interrompre ?</translation> <translation id="2964193600955408481">Désactiver le réseau Wi-Fi</translation> <translation id="2964245677645334031">Visibilité pour le partage à proximité</translation> +<translation id="2966216232069818096">Autorisez l'Assistant à utiliser les informations à l'écran pour vous aider</translation> <translation id="2966937470348689686">Gérer les préférences Android</translation> <translation id="2972581237482394796">&Rétablir</translation> <translation id="2973324205039581528">Couper le son du site</translation> @@ -1870,6 +1876,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Cet onglet utilise votre caméra ou votre micro</translation> <translation id="3083193146044397360">Bloquée temporairement pour protéger votre sécurité</translation> +<translation id="3083899879156272923">Déplacer l'écran en gardant le pointeur au milieu</translation> <translation id="3084548735795614657">Déposer pour installer</translation> <translation id="3084771660770137092">Google Chrome n'avait pas suffisamment de mémoire ou le processus de la page Web a été arrêté pour une autre raison. Pour continuer, actualisez la page ou ouvrez-en une autre.</translation> <translation id="3084958266922136097">Désactiver l'économiseur d'écran</translation> @@ -2363,6 +2370,9 @@ <translation id="3654045516529121250">Lire vos paramètres d'accessibilité</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{L'application possède un accès permanent à un fichier.}one{L'application possède un accès permanent à # fichier.}other{L'application possède un accès permanent à # fichiers.}}</translation> <translation id="3658871634334445293">Accélération de TrackPoint</translation> +<translation id="3659830472545192450">Voice Match aide l'Assistant Google à identifier votre voix sur votre Chromebook et à vous distinguer. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />À noter<ph name="END_BOLD" /> : Il est possible qu'une personne ayant une voix similaire ou un enregistrement de votre voix puisse accéder à vos résultats personnalisés. Vous pourrez désactiver Voice Match plus tard dans les paramètres de l'Assistant.</translation> <translation id="3660234220361471169">Non approuvé</translation> <translation id="3664511988987167893">Icône de l'extension</translation> <translation id="3665589677786828986">Chrome a détecté que certains de vos paramètres ont été corrompus par un autre programme. Leurs valeurs par défaut ont été rétablies.</translation> @@ -2969,7 +2979,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> partage une fenêtre.</translation> <translation id="4364830672918311045">Afficher les notifications</translation> <translation id="4366138410738374926">L'impression a commencé</translation> -<translation id="437004882363131692">Recevez des conseils, des offres et des informations sur <ph name="DEVICE_TYPE" />, et partagez vos commentaires. Vous pouvez vous désabonner à tout moment.</translation> <translation id="4370425812909262207">Les paniers sont masqués. Ils s'afficheront de nouveau si vous effectuez des changements.</translation> <translation id="4370975561335139969">L'adresse e-mail et le mot de passe saisis ne correspondent pas.</translation> <translation id="4374831787438678295">Programme d'installation de Linux</translation> @@ -3546,6 +3555,7 @@ <translation id="5050330054928994520">Synthèse vocale</translation> <translation id="5051836348807686060">La vérification orthographique n'est pas disponible pour les langues que vous avez sélectionnées</translation> <translation id="5052499409147950210">Modifier le site</translation> +<translation id="5053962746715621840">Rechercher l'image avec Google Lens</translation> <translation id="5057110919553308744">Lorsque vous cliquez sur l'extension</translation> <translation id="5057403786441168405">Gérez les comptes auxquels vous êtes connecté. Les sites Web, les applications ainsi que les extensions Chrome et Google Play peuvent utiliser ces comptes pour personnaliser votre expérience, en fonction des autorisations accordées. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Restreindre les connexions</translation> @@ -4028,6 +4038,9 @@ <translation id="5610038042047936818">Passer en mode Appareil photo</translation> <translation id="561030196642865721">Les cookies tiers sont autorisés sur ce site</translation> <translation id="5612734644261457353">Désolé, nous ne pouvons toujours pas valider votre mot de passe. Remarque : si vous l'avez modifié dernièrement, votre nouveau mot de passe ne sera appliqué qu'une fois que vous vous serez déconnecté. Veuillez donc utiliser votre ancien mot de passe.</translation> +<translation id="561308544008485315">Voice Match aide l'Assistant Google à identifier votre voix sur votre Chromebook et à vous distinguer. Pour économiser la batterie, "Hey Google" n'est activé que si votre appareil est branché sur une source d'alimentation. Pour modifier ce réglage, accédez aux paramètres. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />À noter<ph name="END_BOLD" /> : Il est possible qu'une personne ayant une voix similaire ou un enregistrement de votre voix puisse accéder à vos résultats personnalisés. Vous pourrez désactiver Voice Match plus tard dans les paramètres de l'Assistant.</translation> <translation id="5614190747811328134">Avertissement utilisateur</translation> <translation id="5614553682702429503">Enregistrer le mot de passe ?</translation> <translation id="5616726534702877126">Conserver la taille</translation> @@ -5052,6 +5065,7 @@ <translation id="6824584962142919697">&Examiner les éléments</translation> <translation id="6825184156888454064">Trier par nom</translation> <translation id="6826872289184051766">Valider via USB</translation> +<translation id="6827604573767207488">Apparemment, vous avez déjà configuré l'Assistant personnalisé sur un autre appareil. Pour en profiter encore plus, activez le paramètre suivant.</translation> <translation id="6828153365543658583">Autoriser uniquement les utilisateurs suivants à se connecter :</translation> <translation id="6828182567531805778">Saisissez votre phrase secrète pour synchroniser vos données.</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5486,6 +5500,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> a désactivé le débogage ADB. Après avoir redémarré votre <ph name="DEVICE_TYPE" />, vous ne pourrez plus télécharger d'applications indépendamment.</translation> <translation id="7328867076235380839">Combinaison non valide</translation> <translation id="7329154610228416156">La connexion a échoué, car elle a été configurée pour utiliser une URL non sécurisée (<ph name="BLOCKED_URL" />). Veuillez contacter votre administrateur.</translation> +<translation id="7329932885428707942">Vous risquez d'être déconnecté brièvement du réseau mobile.</translation> <translation id="7332053360324989309">Nœud de calcul dédié : <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Activer la loupe ancrée</translation> <translation id="7335974957018254119">Utiliser le correcteur orthographique</translation> @@ -5529,6 +5544,7 @@ <translation id="7374376573160927383">Gérer les appareils USB</translation> <translation id="7375235221357833624">{0,plural, =1{Mettre à jour l'appareil d'ici 1 heure}one{Mettre à jour l'appareil d'ici # heure}other{Mettre à jour l'appareil d'ici # heures}}</translation> <translation id="7376553024552204454">Mettre en surbrillance le curseur de la souris lorsqu'il se déplace</translation> +<translation id="737728204345822099">Une trace de votre visite sur le site sera peut-être conservée sur votre clé de sécurité.</translation> <translation id="7377451353532943397">Continuer de bloquer l'accès aux capteurs</translation> <translation id="7378611153938412599">Les mots de passe peu sécurisés sont faciles à deviner. Assurez-vous de créer des mots de passe sécurisés. <ph name="BEGIN_LINK" />Découvrez d'autres conseils de sécurité.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Ouvrir le Chrome Web Store</translation> @@ -6155,6 +6171,7 @@ <translation id="8059417245945632445">&Inspecter les appareils</translation> <translation id="8059456211585183827">Aucune imprimante ne peut être enregistrée.</translation> <translation id="8061091456562007989">Rétablir les anciens paramètres</translation> +<translation id="8061991877177392872">Apparemment, vous avez déjà configuré Voice Match avec l'Assistant sur un autre appareil. Ces enregistrements précédents ont été utilisés pour créer une empreinte vocale sur cet appareil.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 feuille de papier}one{{COUNT} feuille de papier}other{{COUNT} feuilles de papier}}</translation> <translation id="8062879968880283306">Scannez le code QR à l'aide de l'appareil photo ou saisissez le code d'activation fourni par votre opérateur.</translation> <translation id="8063235345342641131">Avatar vert par défaut</translation> @@ -6424,6 +6441,7 @@ <translation id="8379991678458444070">Revenez facilement sur cet onglet en l'ajoutant à vos favoris</translation> <translation id="8382913212082956454">Copi&er l'adresse e-mail</translation> <translation id="8386091599636877289">Règle introuvable.</translation> +<translation id="8386819192691131213">Autorisez l'Assistant à utiliser les informations à l'écran pour vous fournir des réponses rapides, comme des traductions, des définitions, des conversions d'unités, etc.</translation> <translation id="8386903983509584791">Recherche terminée</translation> <translation id="8387361103813440603">Non autorisé à connaître votre position</translation> <translation id="8389264703141926739">Bloquer les notifications</translation> @@ -6902,6 +6920,7 @@ <translation id="8915370057835397490">Chargement des suggestions en cours…</translation> <translation id="8916476537757519021">Sous-cadre de navigation privée : <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Déplacer l'écran quand le pointeur touche les bords</translation> <translation id="8923880975836399332">Turquoise foncé</translation> <translation id="8925458182817574960">&Paramètres</translation> <translation id="8926389886865778422">Ne plus afficher ce message</translation> @@ -6979,6 +6998,7 @@ <translation id="9009708085379296446">Vouliez-vous modifier cette page ?</translation> <translation id="9011163749350026987">Toujours afficher l'icône</translation> <translation id="9011393886518328654">Notes de version</translation> +<translation id="9012122671773859802">Déplacer l'écran en continu selon les mouvements du pointeur</translation> <translation id="9013037634206938463">Espace libre requis pour installer Linux : <ph name="INSTALL_SIZE" />. Pour libérer de l'espace, supprimez des fichiers de votre appareil.</translation> <translation id="9013707997379828817">Votre administrateur a rétabli cet appareil. Veuillez enregistrer les fichiers importants, puis redémarrer. Toutes les données enregistrées sur cet appareil seront supprimées.</translation> <translation id="901668144954885282">Sauvegarder dans Google Drive</translation> @@ -7023,6 +7043,7 @@ <translation id="9052404922357793350">Continuer de bloquer</translation> <translation id="9053563360605707198">Impression recto verso</translation> <translation id="9053893665344928494">Mémoriser mon choix</translation> +<translation id="9055278955535611574">Dites "Hey Google" pour parler à l'Assistant</translation> <translation id="9055636786322918818">Appliquez le chiffrement RC4. L'activation de cette option est risquée, car les algorithmes de chiffrement RC4 ne sont pas sécurisés.</translation> <translation id="9056810968620647706">Aucune correspondance trouvée</translation> <translation id="9057354806206861646">Calendrier des mises à jour</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 6f66b45..dee72a5 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Acceder aos teus dispositivos Bluetooth e en serie</translation> <translation id="114036956334641753">Audio e subtítulos</translation> <translation id="1140746652461896221">Bloquear o contido en calquera páxina que visites</translation> +<translation id="1141953877381847186">Permite que o Asistente utilice a información que se mostra na pantalla para ofrecerche respostas rápidas, como traducións, definicións, conversións de unidades e moito máis. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Lembra<ph name="END_BOLD" /> que sempre podes cambiar esta opción máis tarde en Configuración do Asistente de Google > Información relacionada.</translation> <translation id="1143142264369994168">Titular do certificado</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome non atopou software daniño no teu ordenador • Última comprobación: hai 1 minuto}other{Chrome non atopou software daniño no teu ordenador • Última comprobación: hai {NUM_MINS} minutos}}</translation> <translation id="1145593918056169051">A impresora deixou de funcionar</translation> @@ -1435,7 +1438,9 @@ <translation id="2594999711683503743">Realiza unha busca en Google ou escribe o URL</translation> <translation id="2602501489742255173">Pasa o dedo cara arriba para comezar</translation> <translation id="2603115962224169880">Fai limpeza no ordenador</translation> +<translation id="2603355571917519942">A función Voice Match está lista</translation> <translation id="2603463522847370204">Abrir nunha ventá de &incógnito</translation> +<translation id="2604138917550693049">Buscar imaxe con Google Lens</translation> <translation id="2604255671529671813">Produciuse un erro de conexión de rede</translation> <translation id="2606246518223360146">Ligar datos</translation> <translation id="2606454609872547359">Non, continuar sen ChromeVox</translation> @@ -1778,6 +1783,7 @@ <translation id="2963151496262057773">O seguinte plugin non responde: <ph name="PLUGIN_NAME" />Queres detelo?</translation> <translation id="2964193600955408481">Desactivar wifi</translation> <translation id="2964245677645334031">Visibilidade de Compartir por Nearby</translation> +<translation id="2966216232069818096">Permite que o teu Asistente utilice a información da pantalla para ofrecerche axuda</translation> <translation id="2966937470348689686">Xestionar preferencias de Android</translation> <translation id="2972581237482394796">&Refacer</translation> <translation id="2973324205039581528">Silenciar sitio</translation> @@ -1874,6 +1880,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Esta pestana está utilizando a túa cámara ou micrófono.</translation> <translation id="3083193146044397360">Bloqueouse o permiso temporalmente para protexer a túa seguranza</translation> +<translation id="3083899879156272923">Mover pantalla de tal xeito que o rato se manteña no centro</translation> <translation id="3084548735795614657">Soltar para instalar</translation> <translation id="3084771660770137092">É posible que finalizase o proceso da páxina web ao esgotarse a memoria de Chrome ou por algún outro motivo. Para continuar, volve cargar a páxina ou accede a outra.</translation> <translation id="3084958266922136097">Desactivar salvapantallas</translation> @@ -2369,6 +2376,9 @@ <translation id="3654045516529121250">Le a configuración de accesibilidade</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ten acceso permanente a un ficheiro.}other{Ten acceso permanente a # ficheiros.}}</translation> <translation id="3658871634334445293">Aceleración de TrackPoint</translation> +<translation id="3659830472545192450">Voice Match axúdalle ao teu Asistente de Google a identificar a túa voz no Chromebook e a distinguirte doutras persoas. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Lembra<ph name="END_BOLD" /> que calquera persoa que teña unha voz parecida ou que dispoña dunha gravación da túa podería acceder aos teus resultados persoais. Se lle queres quitar o permiso a Voice Match máis tarde, desactívao na configuración do Asistente.</translation> <translation id="3660234220361471169">Non fiables</translation> <translation id="3664511988987167893">Icona de extensión</translation> <translation id="3665589677786828986">Chrome detectou que outro programa danou algunhas opcións de configuración e restableceunas aos valores predeterminados orixinais.</translation> @@ -2977,7 +2987,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> está compartindo unha ventá.</translation> <translation id="4364830672918311045">Mostrar notificacións</translation> <translation id="4366138410738374926">Comezou a impresión</translation> -<translation id="437004882363131692">Recibe consellos sobre <ph name="DEVICE_TYPE" />, mantente ao tanto das novidades e das ofertas, e envíanos os teus comentarios. Podes cancelar a subscrición en calquera momento.</translation> <translation id="4370425812909262207">Ocultáronse os carros. Mostraranse de novo cando fagas algún cambio.</translation> <translation id="4370975561335139969">O correo electrónico e o contrasinal inseridos non coinciden</translation> <translation id="4374831787438678295">Instalador de Linux</translation> @@ -3557,6 +3566,7 @@ <translation id="5050330054928994520">Síntese de voz</translation> <translation id="5051836348807686060">O corrector ortográfico non é compatible cos idiomas que seleccionaches</translation> <translation id="5052499409147950210">Editar sitio</translation> +<translation id="5053962746715621840">Buscar imaxe con Google Lens</translation> <translation id="5057110919553308744">Cando fagas clic na extensión</translation> <translation id="5057403786441168405">Xestiona as contas nas que teñas a sesión iniciada. O sitios web, as aplicacións e as extensións de Chrome e Google Play poden utilizar estas contas para personalizar a túa experiencia, dependendo dos permisos. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Restrinxir inicio de sesión</translation> @@ -4040,6 +4050,9 @@ <translation id="5610038042047936818">Cambiar ao modo de cámara</translation> <translation id="561030196642865721">Neste sitio permítense as cookies de terceiros</translation> <translation id="5612734644261457353">Aínda non se pode verificar o teu contrasinal. Nota: Se cambiaches o teu contrasinal recentemente, o contrasinal novo aplicarase en canto peches sesión. Utiliza o contrasinal antigo aquí.</translation> +<translation id="561308544008485315">Voice Match axúdalle ao teu Asistente de Google a identificar a túa voz no Chromebook e a distinguirte doutras persoas. Para aforrar batería, "Hey Google" só está activo cando o teu dispositivo está conectado a unha fonte de alimentación. Para facer cambios, vai a Configuración. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Lembra<ph name="END_BOLD" /> que calquera persoa que teña unha voz parecida ou que dispoña dunha gravación da túa podería acceder aos teus resultados persoais. Se lle queres quitar o permiso a Voice Match máis tarde, desactívao na configuración do Asistente.</translation> <translation id="5614190747811328134">Aviso do usuario</translation> <translation id="5614553682702429503">Queres gardar o contrasinal?</translation> <translation id="5616726534702877126">Reservar tamaño</translation> @@ -5070,6 +5083,7 @@ <translation id="6824584962142919697">&Inspeccionar elementos</translation> <translation id="6825184156888454064">Ordenar por nome</translation> <translation id="6826872289184051766">Verificación mediante USB</translation> +<translation id="6827604573767207488">Parece que xa configuraches o Asistente personalizado noutro dispositivo. Activa a opción de configuración que se indica a continuación para tirar aínda máis proveito do teu Asistente.</translation> <translation id="6828153365543658583">Restrinxir o inicio de sesión aos seguintes usuarios:</translation> <translation id="6828182567531805778">Introduce a túa frase de acceso para sincronizar os teus datos</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5505,6 +5519,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> desactivou a depuración de ADB. Unha vez que reinicies o dispositivo (<ph name="DEVICE_TYPE" />), non poderás instalar aplicacións externamente.</translation> <translation id="7328867076235380839">A combinación non é válida</translation> <translation id="7329154610228416156">Produciuse un erro no inicio de sesión porque se configurou para utilizar un URL non seguro (<ph name="BLOCKED_URL" />). Ponte en contacto co administrador.</translation> +<translation id="7329932885428707942">Esta acción podería provocar unha breve desconexión da rede de telefonía móbil.</translation> <translation id="7332053360324989309">Traballador dedicado: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Activar a lupa ancorada</translation> <translation id="7335974957018254119">Utilizar o corrector ortográfico para</translation> @@ -5548,6 +5563,7 @@ <translation id="7374376573160927383">Xestionar dispositivos USB</translation> <translation id="7375235221357833624">{0,plural, =1{Actualiza o dispositivo en 1 hora}other{Actualiza o dispositivo en # horas}}</translation> <translation id="7376553024552204454">Destacar o cursor do rato cando se move</translation> +<translation id="737728204345822099">Conservarase un rexistro da túa visita a este sitio na túa chave de seguranza</translation> <translation id="7377451353532943397">Continuar bloqueando o acceso aos sensores</translation> <translation id="7378611153938412599">Os contrasinais pouco seguros son fáciles de adiviñar. Asegúrate de crear contrasinais seguros. <ph name="BEGIN_LINK" />Ver máis consellos de seguranza<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Abrir Chrome Web Store</translation> @@ -6174,6 +6190,7 @@ <translation id="8059417245945632445">&Inspeccionar dispositivos</translation> <translation id="8059456211585183827">Non hai impresoras dispoñibles para gardar.</translation> <translation id="8061091456562007989">Desfacer cambio</translation> +<translation id="8061991877177392872">Parece que xa configuraches Voice Match co teu Asistente noutro dispositivo. Esas gravacións anteriores utilizáronse para crear un modelo de voz neste dispositivo.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 folla}other{{COUNT} follas}}</translation> <translation id="8062879968880283306">Escanea o código QR coa cámara do dispositivo ou escribe o código de activación que che proporcionou o teu operador.</translation> <translation id="8063235345342641131">Avatar verde predeterminado</translation> @@ -6445,6 +6462,7 @@ <translation id="8379991678458444070">Engade esta pestana aos marcadores para volver a ela rapidamente</translation> <translation id="8382913212082956454">Copiar &enderezo de correo electrónico</translation> <translation id="8386091599636877289">Non se atopou a política.</translation> +<translation id="8386819192691131213">Permite que o Asistente utilice a información que se mostra na pantalla para ofrecerche respostas rápidas, como traducións, definicións, conversións de unidades e moito máis</translation> <translation id="8386903983509584791">Finalizou a busca</translation> <translation id="8387361103813440603">Sitios que non poden ver a túa localización</translation> <translation id="8389264703141926739">Bloquear notificacións</translation> @@ -6927,6 +6945,7 @@ <translation id="8915370057835397490">Cargando suxestión</translation> <translation id="8916476537757519021">Submarco de incógnito: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Mover pantalla cando o rato toque os bordos</translation> <translation id="8923880975836399332">Verde azulado escuro</translation> <translation id="8925458182817574960">&Configuración</translation> <translation id="8926389886865778422">Non preguntar de novo</translation> @@ -7005,6 +7024,7 @@ <translation id="9009708085379296446">Querías cambiar esta páxina?</translation> <translation id="9011163749350026987">Mostrar sempre a icona</translation> <translation id="9011393886518328654">Notas da versión</translation> +<translation id="9012122671773859802">Mover pantalla de maneira continua a medida que se mova o rato</translation> <translation id="9013037634206938463">Para instalar Linux, precísase un espazo libre de <ph name="INSTALL_SIZE" />. Se queres aumentar o espazo libre, elimina ficheiros do dispositivo.</translation> <translation id="9013707997379828817">O teu administrador instalou unha versión anterior neste dispositivo. Garda os ficheiros importantes e reinicia. Eliminaranse todos os datos do dispositivo.</translation> <translation id="901668144954885282">Crear copia de seguranza en Google Drive</translation> @@ -7049,6 +7069,7 @@ <translation id="9052404922357793350">Continuar bloqueando</translation> <translation id="9053563360605707198">Imprimir nas dúas caras</translation> <translation id="9053893665344928494">Lembrar a miña elección</translation> +<translation id="9055278955535611574">Accede ao teu Asistente con "Hey Google"</translation> <translation id="9055636786322918818">Forza a encriptación RC4. Esta opción aumenta o risco, porque as cifraxes de RC4 non son seguras.</translation> <translation id="9056810968620647706">Non se encontraron coincidencias.</translation> <translation id="9057354806206861646">Programa de actualización</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index dfe89f0..3f6855d 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -2965,7 +2965,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" />, એક વિંડો શેર કરી રહી છે.</translation> <translation id="4364830672918311045">નોટિફિકેશન બતાવો</translation> <translation id="4366138410738374926">પ્રિન્ટ કરવાનું શરૂ થયું</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> માટે ટિપ, ઑફરો અને અપડેટ મેળવો તથા પ્રતિસાદ શેર કરો. કોઈપણ સમયે અનસબ્સ્ક્રાઇબ કરો.</translation> <translation id="4370425812909262207">કાર્ટ છુપાવેલા છે. તમે ફેરફાર કરશો ત્યારે તે ફરી દેખાશે.</translation> <translation id="4370975561335139969">તમે દાખલ કરેલ ઇમેઇલ અને પાસવર્ડ મેળ ખાતા નથી</translation> <translation id="4374831787438678295">Linux ઇન્સ્ટૉલર</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 3864bb7..d655b83 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">अपने ब्लूटूथ और Serial डिवाइस एक्सेस करें</translation> <translation id="114036956334641753">ऑडियो और कैप्शन</translation> <translation id="1140746652461896221">किसी भी पेज पर आपकी देखी गई सामग्री पर रोक लगाएं</translation> +<translation id="1141953877381847186">अनुवाद, परिभाषा, इकाई बदलने वगैरह से जुड़े सवालों के तुरंत जवाब देने के लिए, Assistant को स्क्रीन पर दी गई जानकारी पढ़ने की अनुमति दें. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />याद रखें:<ph name="END_BOLD" /> आप बाद में किसी भी समय, Google Assistant की सेटिंग > इससे जुड़ी जानकारी में जाकर, इसमें बदलाव कर सकते हैं.</translation> <translation id="1143142264369994168">प्रमाणपत्र हस्ताक्षरकर्ता</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome को आपके कंप्यूटर पर, नुकसान पहुंचाने वाला कोई सॉफ़्टवेयर नहीं मिला • 1 मिनट पहले जांच की गई}one{Chrome को आपके कंप्यूटर पर, नुकसान पहुंचाने वाला कोई सॉफ़्टवेयर नहीं मिला • {NUM_MINS} मिनट पहले जांच की गई}other{Chrome को आपके कंप्यूटर पर, नुकसान पहुंचाने वाला कोई सॉफ़्टवेयर नहीं मिला • {NUM_MINS} मिनट पहले जांच की गई}}</translation> <translation id="1145593918056169051">प्रिंटर बंद हो गया है</translation> @@ -1433,7 +1436,9 @@ <translation id="2594999711683503743">Google पर खोजें या URL टाइप करें</translation> <translation id="2602501489742255173">शुरू करने के लिए ऊपर की ओर स्वाइप करें</translation> <translation id="2603115962224169880">कंप्यूटर साफ़ करें</translation> +<translation id="2603355571917519942">वॉइस मैच की सुविधा इस्तेमाल किए जाने के लिए तैयार है</translation> <translation id="2603463522847370204">&गुप्त विंडो में खोलें</translation> +<translation id="2604138917550693049">Google Lens से इमेज खोजें</translation> <translation id="2604255671529671813">नेटवर्क कनेक्शन गड़बड़ी</translation> <translation id="2606246518223360146">डेटा लिंक करें</translation> <translation id="2606454609872547359">नहीं, ChromeVox के बिना जारी रखें</translation> @@ -1775,6 +1780,7 @@ <translation id="2963151496262057773">निम्न प्लग इन प्रतिसाद नहीं दे रहा है: <ph name="PLUGIN_NAME" />क्या उसे रोकना चाहते हैं?</translation> <translation id="2964193600955408481">वाई-फ़ाई अक्षम करें</translation> <translation id="2964245677645334031">आस-पास शेयर करने की सुविधा और 'डिवाइस किसको दिखे' सेटिंग</translation> +<translation id="2966216232069818096">Assistant को अपनी स्क्रीन पर दी गई जानकारी पढ़ने दें, ताकि वह आपकी मदद कर सके</translation> <translation id="2966937470348689686">Android प्राथमिकताएं प्रबंधित करें</translation> <translation id="2972581237482394796">&फिर से करें</translation> <translation id="2973324205039581528">साइट म्यूट करें</translation> @@ -1870,6 +1876,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">यह टैब आपके कैमरे या माइक्रोफ़ोन का उपयोग कर रहा है.</translation> <translation id="3083193146044397360">आपकी सुरक्षा के लिए कुछ समय तक ब्लॉक किया गया</translation> +<translation id="3083899879156272923">माउस को स्क्रीन के बीच में रखकर स्क्रीन को घुमाएं</translation> <translation id="3084548735795614657">इंस्टॉल करने के लिए यहां छोड़ें</translation> <translation id="3084771660770137092">या तो Chrome की मेमोरी खत्म हो गई है या वेबपेज की प्रक्रिया किसी और वजह से खत्म कर दी गई है. जारी रखने के लिए, फिर लोड करें या किसी और पेज पर जाएं.</translation> <translation id="3084958266922136097">स्क्रीन सेवर बंद करें</translation> @@ -2363,6 +2370,9 @@ <translation id="3654045516529121250">अपनी सुलभता सेटिंग पढ़ें</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{उसे एक फ़ाइल की स्थायी एक्सेस मिली हुई है.}one{उसे # फ़ाइलों की स्थायी एक्सेस मिली हुई है.}other{उसे # फ़ाइलों की स्थायी एक्सेस मिली हुई है.}}</translation> <translation id="3658871634334445293">TrackPoint ऐक्सेलरेशन</translation> +<translation id="3659830472545192450">वॉइस मैच की सुविधा से Google Assistant, Chromebook पर आपकी आवाज़ पहचान पाती है. साथ ही, वह आपकी और दूसरे लोगों की आवाज़ में अंतर कर पाती है. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />याद रखें:<ph name="END_BOLD" /> किसी मिलती-जुलती आवाज़ या रिकॉर्डिंग से भी आपके निजी खोज नतीजे ऐक्सेस किए जा सकते हैं. आप बाद में Assistant की सेटिंग में जाकर, वॉइस मैच की सुविधा को बंद करके, इसको दी गई अनुमति हटा सकते हैं.</translation> <translation id="3660234220361471169">अविश्वसनीय</translation> <translation id="3664511988987167893">एक्सटेंशन आइकॉन</translation> <translation id="3665589677786828986">Chrome को पता चला है कि आपकी कुछ सेटिंग किसी दूसरे प्रोग्राम के द्वारा दूषित कर दी गई हैं और उन्हें उनके मूल डिफ़ॉल्ट पर रीसेट कर दिया गया है.</translation> @@ -2968,7 +2978,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> किसी विंडो को शेयर कर रहा है.</translation> <translation id="4364830672918311045">डिसप्ले नोटिफ़िकेशन</translation> <translation id="4366138410738374926">प्रिंट करने की प्रक्रिया शुरू हुई</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> के इस्तेमाल के बारे में सलाह, ऑफ़र, और अपडेट पाएं. साथ ही, सुझाव, शिकायत या राय शेयर करें. जब चाहें, तब सदस्यता छोड़ें.</translation> <translation id="4370425812909262207">छिपाए गए कार्ट. जब आप बदलाव करेंगे, तब वे फिर से दिखेंगे.</translation> <translation id="4370975561335139969"> डाले गए ईमेल और पासवर्ड का मिलान नहीं हो रहा</translation> <translation id="4374831787438678295">Linux इंस्टॉलर</translation> @@ -3545,6 +3554,7 @@ <translation id="5050330054928994520">TTS (लिखाई को बोली में बदलना)</translation> <translation id="5051836348807686060">आपकी चुनी गई भाषा के लिए वर्तनी जाँचने की सुविधा काम नहीं करती है</translation> <translation id="5052499409147950210">साइट में बदलाव करें</translation> +<translation id="5053962746715621840">Google Lens से इमेज खोजें</translation> <translation id="5057110919553308744">जब आप एक्सटेंशन को क्लिक करते हैं</translation> <translation id="5057403786441168405">अपने साइन इन किए गए खातों को प्रबंधित करें. वेबसाइट, ऐप्लिकेशन, और Chrome या Google Play के एक्सटेंशन, इन खातों का इस्तेमाल आपके अनुभव को आपकी पसंद के मुताबिक बनाने के लिए कर सकते हैं. ये आपकी अनुमतियों के आधार पर ऐसा करते हैं. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="5059241099014281248">साइन-इन करने पर पाबंदी लगाएं</translation> @@ -4027,6 +4037,9 @@ <translation id="5610038042047936818">कैमरा मोड में स्विच करें</translation> <translation id="561030196642865721">इस साइट पर तीसरे पक्ष की कुकी की अनुमति है</translation> <translation id="5612734644261457353">क्षमा करें, आपका पासवर्ड अब भी सत्यापित नहीं किया जा सकता. ध्यान दें: अगर आपने हाल ही में अपना पासवर्ड बदला है, तो आपके प्रस्थान करते ही आपका नया पासवर्ड लागू हो जाएगा, कृपया यहां पुराने पासवर्ड का उपयोग करें.</translation> +<translation id="561308544008485315">वॉइस मैच की सुविधा से Google Assistant, Chromebook पर आपकी आवाज़ पहचान पाती है. साथ ही, वह आपकी और दूसरे लोगों की आवाज़ में अंतर कर पाती है. "Ok Google" सिर्फ़ तब बोलें, जब आपका डिवाइस चार्ज हो रहा हो. इससे बैटरी बचाने में मदद मिलेगी. बदलाव करने के लिए, सेटिंग पर जाएं. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />याद रखें:<ph name="END_BOLD" /> किसी मिलती-जुलती आवाज़ या रिकॉर्डिंग से भी आपके निजी खोज नतीजे ऐक्सेस किए जा सकते हैं. आप बाद में Assistant की सेटिंग में जाकर, वॉइस मैच की सुविधा को बंद करके, इसको दी गई अनुमति हटा सकते हैं.</translation> <translation id="5614190747811328134">उपयोगकर्ता सूचना</translation> <translation id="5614553682702429503">पासवर्ड सेव करें?</translation> <translation id="5616726534702877126">साइज़ रिज़र्व करें</translation> @@ -5050,6 +5063,7 @@ <translation id="6824584962142919697">&एलिमेंट जाँचें</translation> <translation id="6825184156888454064">नाम के अनुसार क्रम से लगाएं</translation> <translation id="6826872289184051766">USB के ज़रिए पुष्टि करें</translation> +<translation id="6827604573767207488">ऐसा लगता है कि आपने पहले ही किसी दूसरे डिवाइस पर, Assistant को अपने हिसाब से सेट अप कर लिया है. नीचे दी गई सेटिंग चालू करके, Assistant का और फ़ायदा पाएं.</translation> <translation id="6828153365543658583">नीचे दिए गए उपयोगकर्ताओं के लिए साइन इन पर रोक लगाएं:</translation> <translation id="6828182567531805778">डेटा सिंक करने के लिए लंबा पासवर्ड डालें</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5484,6 +5498,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> ने ADB को डीबग करने की सुविधा बंद कर दी है. <ph name="DEVICE_TYPE" /> को रीस्टार्ट करने पर, आप ऐप्लिकेशन को अलग से लोड नहीं कर पाएंगे.</translation> <translation id="7328867076235380839">गलत संयोजन</translation> <translation id="7329154610228416156">साइन इन नहीं हो पाया क्योंकि उसे गैर-सुरक्षित URL (<ph name="BLOCKED_URL" />) का इस्तेमाल करने के लिए कॉन्फ़िगर किया गया था. कृपया अपने एडमिन से संपर्क करें.</translation> +<translation id="7329932885428707942">इसकी वजह से, मोबाइल नेटवर्क थोड़ी देर के लिए डिसकनेक्ट हो सकता है.</translation> <translation id="7332053360324989309">खास तौर पर इसके लिए काम करने वाला वर्कर: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">सामग्री को बड़ा दिखाने की डॉक की गई सुविधा चालू करें</translation> <translation id="7335974957018254119">इसके लिए वर्तनी जांचने वाली सुविधा का इस्तेमाल करें</translation> @@ -5527,6 +5542,7 @@ <translation id="7374376573160927383">अपने यूएसबी डिवाइस प्रबंधित करें</translation> <translation id="7375235221357833624">{0,plural, =1{1 घंटे के अंदर डिवाइस अपडेट करें}one{# घंटे के अंदर डिवाइस अपडेट करें}other{# घंटे के अंदर डिवाइस अपडेट करें}}</translation> <translation id="7376553024552204454">माउस कर्सर के हिलने पर उसे हाइलाइट करें</translation> +<translation id="737728204345822099">आपके इस साइट पर आने की जानकारी को आपकी सुरक्षा कुंजी पर सेव किया जा सकता है.</translation> <translation id="7377451353532943397">सेंसर का ऐक्सेस ब्लॉक करते रहें</translation> <translation id="7378611153938412599">कमज़ोर पासवर्ड का अंदाज़ा लगाना आसान होता है. पक्का करें कि आप मज़बूत पासवर्ड बना रहे हैं. <ph name="BEGIN_LINK" />सुरक्षा से जुड़ी और सलाह देखें.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome वेब स्टोर खोलें</translation> @@ -6152,6 +6168,7 @@ <translation id="8059417245945632445">&उपकरणों का परीक्षण करें</translation> <translation id="8059456211585183827">सेव करने के लिए कोई भी प्रिंटर उपलब्ध नहीं है.</translation> <translation id="8061091456562007989">पहले जैसा कर दें</translation> +<translation id="8061991877177392872">ऐसा लगता है कि आपने पहले ही किसी दूसरे डिवाइस पर, Assistant के साथ वॉइस मैच की सुविधा को सेट अप कर लिया है. इस डिवाइस पर आवाज़ का नमूना बनाने के लिए, इन पुरानी रिकॉर्डिंग का इस्तेमाल किया गया है.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{काग़ज़ की 1 शीट}one{काग़ज़ की {COUNT} शीट}other{काग़ज़ की {COUNT} शीट}}</translation> <translation id="8062879968880283306">अपने डिवाइस के कैमरे से क्यूआर कोड को स्कैन करें या मोबाइल और इंटरनेट सेवा देने वाली कंपनी से मिला ऐक्टिवेशन कोड डालें.</translation> <translation id="8063235345342641131">डिफ़ॉल्ट हरा अवतार</translation> @@ -6421,6 +6438,7 @@ <translation id="8379991678458444070">इस टैब को बुकमार्क करके यहां जल्दी वापस आएं</translation> <translation id="8382913212082956454">ईमेल पते की कॉपी बनाएं</translation> <translation id="8386091599636877289">नीति नहीं मिली.</translation> +<translation id="8386819192691131213">अनुवाद, परिभाषा, इकाई बदलने वगैरह से जुड़े सवालों के तुरंत जवाब देने के लिए, Assistant को स्क्रीन पर दी गई जानकारी पढ़ने की अनुमति दें</translation> <translation id="8386903983509584791">स्कैन पूरा हुआ</translation> <translation id="8387361103813440603">आपकी जगह की जानकारी देखने की अनुमति नहीं है</translation> <translation id="8389264703141926739">सूचनाएं ब्लॉक करें</translation> @@ -6899,6 +6917,7 @@ <translation id="8915370057835397490">सुझाव लोड हो रहे हैं</translation> <translation id="8916476537757519021">गुप्त सबफ़्रेम: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> का <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">जब माउस स्क्रीन के किनारों को छुए तो स्क्रीन को हिलाएं</translation> <translation id="8923880975836399332">गहरा नीला-हरा</translation> <translation id="8925458182817574960">&सेटिंग</translation> <translation id="8926389886865778422">दोबारा न पूछें</translation> @@ -6976,6 +6995,7 @@ <translation id="9009708085379296446">क्या आपका मतलब इस पेज को बदलने से है?</translation> <translation id="9011163749350026987">आइकॉन हमेशा दिखाएं</translation> <translation id="9011393886518328654">प्रॉडक्ट की जानकारी</translation> +<translation id="9012122671773859802">माउस के साथ-साथ स्क्रीन को लगातार हिलाएं</translation> <translation id="9013037634206938463">Linux को इंस्टॉल करने के लिए, कम से कम <ph name="INSTALL_SIZE" /> खाली जगह होनी चाहिए. खाली जगह बढ़ाने के लिए अपने डिवाइस से फ़ाइलें मिटाएं.</translation> <translation id="9013707997379828817">आपके एडमिन ने यह डिवाइस बहाल कर दिया है. कृपया ज़रूरी फ़ाइलें सेव कर लें, उसके बाद रीस्टार्ट करें. डिवाइस पर मौजूद सारा डेटा मिटा दिया जाएगा.</translation> <translation id="901668144954885282">'Google डिस्क' में बैक अप लें</translation> @@ -7020,6 +7040,7 @@ <translation id="9052404922357793350">ब्लॉक करना जारी रखें</translation> <translation id="9053563360605707198">दोनों तरफ़ प्रिंट करें</translation> <translation id="9053893665344928494">मेरी पसंद याद रखें</translation> +<translation id="9055278955535611574">अपनी Assistant को "Ok Google" बोलकर ऐक्सेस करें</translation> <translation id="9055636786322918818">RC4 सुरक्षा लागू करें. इस विकल्प का इस्तेमाल करने से आपका खतरा बढ़ जाता है, क्योंकि RC4 सिफ़र सुरक्षित नहीं होते हैं.</translation> <translation id="9056810968620647706">कोई मिलान नहीं मिले.</translation> <translation id="9057354806206861646">शेड्यूल को अपडेट करें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 147f2ea..108d950 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">pristupiti vašim Bluetooth i serijski spojenim uređajima</translation> <translation id="114036956334641753">Zvuk i titlovi</translation> <translation id="1140746652461896221">Blokiraj sadržaj na bilo kojoj posjećenoj stranici</translation> +<translation id="1141953877381847186">Dopustite Asistentu da koristi informacije na zaslonu kako bi pružio brze odgovore kao što su prijevodi, definicije, pretvorba jedinica i brojne druge informacije. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Napomena:<ph name="END_BOLD" /> tu postavku uvijek možete promijeniti kasnije u odjeljku Postavke Google asistenta > Povezani podaci.</translation> <translation id="1143142264369994168">Potpisnik certifikata</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome nije pronašao štetni softver na vašem računalu • provjereno prije jednu minutu}one{Chrome nije pronašao štetni softver na vašem računalu • provjereno prije {NUM_MINS} minutu}few{Chrome nije pronašao štetni softver na vašem računalu • provjereno prije {NUM_MINS} minute}other{Chrome nije pronašao štetni softver na vašem računalu • provjereno prije {NUM_MINS} minuta}}</translation> <translation id="1145593918056169051">Pisač je zaustavljen</translation> @@ -1436,7 +1439,9 @@ <translation id="2594999711683503743">Pretražite na Googleu ili unesite URL</translation> <translation id="2602501489742255173">Prijeđite prstom prema gore za početak</translation> <translation id="2603115962224169880">Očistite računalo</translation> +<translation id="2603355571917519942">Voice Match je spreman</translation> <translation id="2603463522847370204">Otvaranje u &anonimnom prozoru</translation> +<translation id="2604138917550693049">Pretraži sliku pomoću Google objektiva</translation> <translation id="2604255671529671813">Pogreška mrežne veze</translation> <translation id="2606246518223360146">Poveži podatke</translation> <translation id="2606454609872547359">Ne, nastavi bez ChromeVoxa</translation> @@ -1779,6 +1784,7 @@ <translation id="2963151496262057773">Sljedeći dodatak ne reagira: <ph name="PLUGIN_NAME" />. Želite li ga zaustaviti?</translation> <translation id="2964193600955408481">Onemogući Wi-Fi</translation> <translation id="2964245677645334031">Vidljivost dijeljenja s Android uređajima</translation> +<translation id="2966216232069818096">Dopustite Asistentu da koristi informacije na zaslonu kako bi vam pomogao</translation> <translation id="2966937470348689686">Upravljanje postavkama Androida</translation> <translation id="2972581237482394796">&Vrati poništeno</translation> <translation id="2973324205039581528">Zanemari web-lokaciju</translation> @@ -1875,6 +1881,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Kartica upotrebljava vaš fotoaparat ili mikrofon.</translation> <translation id="3083193146044397360">Privremeno blokirano radi vaše zaštite</translation> +<translation id="3083899879156272923">Pomiči zaslon zadržavajući miš na sredini zaslona</translation> <translation id="3084548735795614657">Ispustite da biste instalirali</translation> <translation id="3084771660770137092">Pregledniku Chrome ponestalo je memorije ili je proces za web-stranicu prekinut iz nekog drugog razloga. Da biste nastavili, ponovo učitajte stranicu ili idite na neku drugu stranicu.</translation> <translation id="3084958266922136097">Onemogućivanje čuvara zaslona</translation> @@ -2370,6 +2377,9 @@ <translation id="3654045516529121250">čitati postavke pristupačnosti</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ima trajni pristup jednoj datoteci.}one{Ima trajni pristup # datoteci.}few{Ima trajni pristup do # datoteke.}other{Ima trajni pristup do # datoteka.}}</translation> <translation id="3658871634334445293">TrackPoint ubrzanje</translation> +<translation id="3659830472545192450">Voice Match pomaže Google asistentu da prepoznaje vaš glas na vašem Chromebooku i razlikuje vas od drugih. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Napomena:<ph name="END_BOLD" /> vašim osobnim rezultatima mogao bi pristupiti i netko sa sličnim glasom ili snimkom vašeg glasa. Dopuštenje za Voice Match možete ukloniti kasnije tako da ga isključite u postavkama Asistenta.</translation> <translation id="3660234220361471169">Nepouzdano</translation> <translation id="3664511988987167893">Ikona proširenja</translation> <translation id="3665589677786828986">Chrome je otkrio da je neki drugi program promijenio vaše postavke, pa ih je vratio na izvorne zadane vrijednosti.</translation> @@ -2978,7 +2988,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> dijeli prozor.</translation> <translation id="4364830672918311045">Prikaži obavijesti</translation> <translation id="4366138410738374926">Ispis je započeo</translation> -<translation id="437004882363131692">Pronađite savjete, ponude i novosti za <ph name="DEVICE_TYPE" /> te nam recite što mislite. Otkažite pretplatu kad god želite.</translation> <translation id="4370425812909262207">Košarice su skrivene. Pojavit će se kad napravite izmjene.</translation> <translation id="4370975561335139969">Unijeli ste e-adresu i zaporku koje se ne podudaraju</translation> <translation id="4374831787438678295">Program za instalaciju Linuxa</translation> @@ -3558,6 +3567,7 @@ <translation id="5050330054928994520">Pretvaranje teksta u govor</translation> <translation id="5051836348807686060">Provjera pravopisa nije podržana za jezike koje ste odabrali</translation> <translation id="5052499409147950210">Uređivanje web-lokacije</translation> +<translation id="5053962746715621840">Pretraži sliku pomoću Google objektiva</translation> <translation id="5057110919553308744">Kada kliknete proširenje</translation> <translation id="5057403786441168405">Upravljajte računima na koje ste prijavljeni. Web-lokacije, aplikacije i proširenja u Chromeu i Google Playu mogu upotrebljavati te račune da bi vam prilagodile doživljaj, ovisno o dopuštenjima. <ph name="LINK_BEGIN" />Saznaj više<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Ograničenje prijave</translation> @@ -4042,6 +4052,9 @@ <translation id="5610038042047936818">Prijeđi na način fotoaparata</translation> <translation id="561030196642865721">Na ovoj su web-lokaciji dopušteni kolačići treće strane</translation> <translation id="5612734644261457353">Nažalost, vaša zaporka i dalje nije mogla biti potvrđena. Napomena: ako ste nedavno promijenili zaporku, vaša nova zaporka primjenjivat će se nakon što se odjavite. Ovdje upotrijebite staru zaporku.</translation> +<translation id="561308544008485315">Voice Match pomaže Google asistentu da prepoznaje vaš glas na vašem Chromebooku i razlikuje vas od drugih. Radi uštede baterije značajka "Hey Google" uključena je samo kad je uređaj priključen na napajanje. To možete promijeniti u postavkama. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Napomena:<ph name="END_BOLD" /> vašim osobnim rezultatima mogao bi pristupiti i netko sa sličnim glasom ili snimkom vašeg glasa. Dopuštenje za Voice Match možete ukloniti kasnije tako da ga isključite u postavkama Asistenta.</translation> <translation id="5614190747811328134">Korisnička obavijest</translation> <translation id="5614553682702429503">Želite li spremiti zaporku?</translation> <translation id="5616726534702877126">Rezerviraj veličinu</translation> @@ -5072,6 +5085,7 @@ <translation id="6824584962142919697">&Provjeri elemente</translation> <translation id="6825184156888454064">Poredaj prema nazivu</translation> <translation id="6826872289184051766">Potvrda putem USB-a</translation> +<translation id="6827604573767207488">Čini se da ste već postavili prilagođenog Asistenta na drugom uređaju. Da biste još bolje iskoristili Asistenta, uključite sljedeće značajke.</translation> <translation id="6828153365543658583">Ograniči prijavu na sljedeće korisnike:</translation> <translation id="6828182567531805778">Unesite šifru da biste sinkronizirali podatke</translation> <translation id="682871081149631693">Brzi popravak</translation> @@ -5507,6 +5521,7 @@ <translation id="7327989755579928735">Domena <ph name="MANAGER" /> onemogućila je ADB otklanjanje pogrešaka. Nakon što ponovo pokrenete uređaj <ph name="DEVICE_TYPE" />, nećete moći učitavati aplikacije s drugog izvora.</translation> <translation id="7328867076235380839">Nevažeća kombinacija</translation> <translation id="7329154610228416156">Prijava nije uspjela jer je konfigurirana za upotrebu nesigurnog URL-a (<ph name="BLOCKED_URL" />). Obratite se administratoru.</translation> +<translation id="7329932885428707942">To može uzrokovati kratak prekid veze s mobilnom mrežom.</translation> <translation id="7332053360324989309">Dodijeljeni radnik: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Omogući usidreno povećalo</translation> <translation id="7335974957018254119">Upotreba provjere pravopisa za</translation> @@ -5550,6 +5565,7 @@ <translation id="7374376573160927383">Upravljanje USB uređajima</translation> <translation id="7375235221357833624">{0,plural, =1{Ažurirajte uređaj u roku od sat vremena}one{Ažurirajte uređaj u roku od # sata}few{Ažurirajte uređaj u roku od # sata}other{Ažurirajte uređaj u roku od # sati}}</translation> <translation id="7376553024552204454">Istakni pokazivač miša kada se kreće</translation> +<translation id="737728204345822099">Na sigurnosnom ključu može se zadržati evidencija vašeg posjeta toj web-lokaciji.</translation> <translation id="7377451353532943397">Nastavi blokirati pristup senzorima</translation> <translation id="7378611153938412599">Slabe zaporke lako je pogoditi. Neka vaše zaporke obavezno budu snažne. <ph name="BEGIN_LINK" />Pročitajte još sigurnosnih savjeta<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Otvori Chrome web-trgovinu</translation> @@ -6176,6 +6192,7 @@ <translation id="8059417245945632445">&Provjeri uređaje</translation> <translation id="8059456211585183827">Nema dostupnih pisača za spremanje.</translation> <translation id="8061091456562007989">Poništi izmjene</translation> +<translation id="8061991877177392872">Čini se da ste već postavili Voice Match za svojeg Asistenta na nekom drugom uređaju. Te su snimke iskorištene za izradu glasovnog modela na ovom uređaju.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{Jedan list papira}one{{COUNT} list papira}few{{COUNT} lista papira}other{{COUNT} listova papira}}</translation> <translation id="8062879968880283306">Skenirajte QR kôd pomoću fotoaparata uređaja ili unesite aktivacijski kôd koji ste dobili od mobilnog operatera.</translation> <translation id="8063235345342641131">Zadani zeleni avatar</translation> @@ -6447,6 +6464,7 @@ <translation id="8379991678458444070">Označite ovu karticu da biste se brzo vratili na nju</translation> <translation id="8382913212082956454">Kopiraj &adresu e-pošte</translation> <translation id="8386091599636877289">Pravilo nije pronađeno.</translation> +<translation id="8386819192691131213">Dopustite Asistentu da koristi informacije na zaslonu kako bi pružio brze odgovore kao što su prijevodi, definicije, pretvorba jedinica i brojne druge informacije</translation> <translation id="8386903983509584791">Traženje je dovršeno</translation> <translation id="8387361103813440603">Nije dopušten pregled vaše lokacije</translation> <translation id="8389264703141926739">Blokiraj obavijesti</translation> @@ -6930,6 +6948,7 @@ <translation id="8915370057835397490">Učitavanje prijedloga</translation> <translation id="8916476537757519021">Anonimni podokvir: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> – <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">Pomiči zaslon kad miš dodiruje rubove zaslona</translation> <translation id="8923880975836399332">Tamnotirkiznoplava</translation> <translation id="8925458182817574960">&Postavke</translation> <translation id="8926389886865778422">Više me ne pitaj</translation> @@ -7008,6 +7027,7 @@ <translation id="9009708085379296446">Jeste li namjeravali promijeniti ovu stranicu?</translation> <translation id="9011163749350026987">Uvijek prikaži ikonu</translation> <translation id="9011393886518328654">Napomene o izdanju</translation> +<translation id="9012122671773859802">Pomiči zaslon kontinuirano dok se miš kreće</translation> <translation id="9013037634206938463">Za instaliranje Linuxa trebate <ph name="INSTALL_SIZE" /> slobodnog prostora. Da biste oslobodili prostor, izbrišite datoteke s uređaja.</translation> <translation id="9013707997379828817">Vaš administrator vratio je uređaj na prethodnu verziju sustava. Spremite važne datoteke, a zatim ponovo pokrenite uređaj. Izbrisat će se svi podaci s uređaja.</translation> <translation id="901668144954885282">Sigurnosno kopiranje na Google disku</translation> @@ -7052,6 +7072,7 @@ <translation id="9052404922357793350">Nastavi blokirati</translation> <translation id="9053563360605707198">Ispis s obje strane</translation> <translation id="9053893665344928494">Zapamti odabir</translation> +<translation id="9055278955535611574">Pristupajte Asistentu tako što ćete reći "Hey Google"</translation> <translation id="9055636786322918818">Provođenje AES i RC4 šifriranja. Upotreba te opcije izlaže vas većoj opasnosti jer RC4 šifre nisu sigurne.</translation> <translation id="9056810968620647706">Nisu pronađeni nikakvi rezultati.</translation> <translation id="9057354806206861646">Ažuriranje rasporeda</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 7733cb87..ba6b2ce 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Hozzáférés a Bluetooth- és a soros eszközökhöz</translation> <translation id="114036956334641753">Hang és feliratok</translation> <translation id="1140746652461896221">Tartalom letiltása minden felkeresett oldalon</translation> +<translation id="1141953877381847186">Ha engedélyezi a Segéd számára a képernyőn megjelenő információk használatát, akkor gyors válaszokat kaphat tőle (például fordítást, meghatározást, mértékegység-átváltást és egyebeket). + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Ne feledje:<ph name="END_BOLD" /> Ezt a beállítást később bármikor módosíthatja a Google Segéd-beállítások > Kapcsolódó információk menüpontban.</translation> <translation id="1143142264369994168">Tanúsítvány aláírója</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{A Chrome nem talált kártékony szoftvert az Ön számítógépén • 1 perce ellenőrizve}other{A Chrome nem talált kártékony szoftvert az Ön számítógépén • {NUM_MINS} perce ellenőrizve}}</translation> <translation id="1145593918056169051">A nyomtató leállt</translation> @@ -1436,7 +1439,9 @@ <translation id="2594999711683503743">Keressen a Google-lal, vagy írja be az URL-t</translation> <translation id="2602501489742255173">Az indításhoz csúsztasson felfelé</translation> <translation id="2603115962224169880">A számítógép megtisztítása</translation> +<translation id="2603355571917519942">A Voice Match készen áll</translation> <translation id="2603463522847370204">Megnyitás &inkognitóablakban</translation> +<translation id="2604138917550693049">Képek keresése a Google Lens segítségével</translation> <translation id="2604255671529671813">Hálózati kapcsolati hiba</translation> <translation id="2606246518223360146">Adatok összekapcsolása</translation> <translation id="2606454609872547359">Nem, a ChromeVox nélkül folytatom</translation> @@ -1779,6 +1784,7 @@ <translation id="2963151496262057773">Az alábbi beépülő modulok nem válaszolnak: <ph name="PLUGIN_NAME" />. Szeretné leállítani?</translation> <translation id="2964193600955408481">Wi-Fi letiltása</translation> <translation id="2964245677645334031">Közeli megosztás láthatóság</translation> +<translation id="2966216232069818096">Segítséget kérhet Segédjétől, ha engedélyezi számára, hogy használja a képernyőn megjelenő információkat</translation> <translation id="2966937470348689686">Android-beállítások kezelése</translation> <translation id="2972581237482394796">&Újra</translation> <translation id="2973324205039581528">Webhely némítása</translation> @@ -1875,6 +1881,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Ez a lap használja a kamerát vagy a mikrofont.</translation> <translation id="3083193146044397360">Biztonsága érdekében a rendszer ideiglenesen letiltotta</translation> +<translation id="3083899879156272923">Képernyő mozgatása úgy, hogy az egér a képernyő közepén maradjon</translation> <translation id="3084548735795614657">Húzza rá a telepítéshez.</translation> <translation id="3084771660770137092">Vagy a Chrome fogyott ki a memóriából, vagy a weboldal folyamata szűnt meg valamilyen más ok miatt. A folytatáshoz töltse be újra, vagy keressen fel egy másik oldalt.</translation> <translation id="3084958266922136097">Képernyővédő letiltása</translation> @@ -2370,6 +2377,9 @@ <translation id="3654045516529121250">A kisegítő lehetőségek beállításainak áttekintése</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Állandó hozzáférése van egy fájlhoz.}other{Állandó hozzáférése van # fájlhoz.}}</translation> <translation id="3658871634334445293">TrackPoint gyorsítása</translation> +<translation id="3659830472545192450">A Voice Match segítségével Google Segédje felismeri az Ön hangját a Chromebookon, és meg tudja különböztetni másokétól. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Fontos megjegyzés:<ph name="END_BOLD" /> Előfordulhat, hogy hasonló hangú személy vagy hangfelvétel segítségével is hozzá lehet férni az Ön személyes találataihoz. A Voice Match engedélyét bármikor visszavonhatja úgy, hogy kikapcsolja a Segéd beállításaiban.</translation> <translation id="3660234220361471169">Nem megbízható</translation> <translation id="3664511988987167893">Bővítmény ikonja</translation> <translation id="3665589677786828986">A Chrome azt észlelte, hogy egy másik program miatt megsérült néhány beállítás, ezért visszaállítja őket az eredeti alapértelmezett értékekre.</translation> @@ -2977,7 +2987,6 @@ <translation id="4364567974334641491">A(z) <ph name="APP_NAME" /> megoszt egy ablakot.</translation> <translation id="4364830672918311045">Értesítések megjelenítése</translation> <translation id="4366138410738374926">Nyomtatás megkezdve</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" />-tippeket és -ajánlatokat, valamint friss híreket kaphat, ezenkívül visszajelzést is küldhet. Bármikor leiratkozhat.</translation> <translation id="4370425812909262207">A kosarakat a rendszer elrejti. Újra megjelennek, ha módosítást hajt végre.</translation> <translation id="4370975561335139969">A megadott e-mail-cím és jelszó nem egyezik</translation> <translation id="4374831787438678295">Linux-telepítő</translation> @@ -3557,6 +3566,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">A helyesírás-ellenőrzés nem támogatott a kiválasztott nyelveken</translation> <translation id="5052499409147950210">Webhely szerkesztése</translation> +<translation id="5053962746715621840">Képek keresése a Google Lens segítségével</translation> <translation id="5057110919553308744">Amikor a bővítményre kattint</translation> <translation id="5057403786441168405">Kezelheti a bejelentkezett fiókjait. A webhelyek, az alkalmazások, a Chrome-bővítmények és a Google Play – az engedélyektől függően – ezeket a fiókokat használhatják az élmény személyre szabására. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="5059241099014281248">Korlátozott bejelentkezés</translation> @@ -4042,6 +4052,9 @@ <translation id="5610038042047936818">Váltás kamera módra</translation> <translation id="561030196642865721">Ezen a webhelyen engedélyezett a harmadik felektől származó cookie-k használata</translation> <translation id="5612734644261457353">Sajnos a jelszó ellenőrzése még mindig nem sikerült. Megjegyzés: ha a közelmúltban módosította jelszavát, az új jelszó kijelentkezés után kerül beállításra, ezért kérjük, itt a régi jelszót használja.</translation> +<translation id="561308544008485315">A Voice Match segítségével Google Segédje felismeri az Ön hangját a Chromebookon, és meg tudja különböztetni másokétól. Az akkumulátor üzemidejének növelése érdekében az „Ok Google” csak akkor van bekapcsolva, amikor az eszköz áramforrásra csatlakozik. Módosításához nyissa meg a Beállításokat. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Fontos megjegyzés:<ph name="END_BOLD" /> Előfordulhat, hogy hasonló hangú személy vagy hangfelvétel segítségével is hozzá lehet férni az Ön személyes találataihoz. A Voice Match engedélyét bármikor visszavonhatja úgy, hogy kikapcsolja a Segéd beállításaiban.</translation> <translation id="5614190747811328134">Felhasználói értesítés</translation> <translation id="5614553682702429503">Szeretné elmenteni a jelszót?</translation> <translation id="5616726534702877126">Méret lefoglalása</translation> @@ -5073,6 +5086,7 @@ <translation id="6824584962142919697">&Elemek vizsgálata</translation> <translation id="6825184156888454064">Rendezés név szerint</translation> <translation id="6826872289184051766">Igazolás USB-n keresztül</translation> +<translation id="6827604573767207488">Úgy tűnik, hogy egy másik eszközön már beállította a személyre szabott Segédet. Még többet kihozhat Segédjéből, ha bekapcsolja a következő beállítást.</translation> <translation id="6828153365543658583">Bejelentkezés korlátozása a következő felhasználókra:</translation> <translation id="6828182567531805778">Az adatok szinkronizálásához adja meg az összetett jelszavát</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5508,6 +5522,7 @@ <translation id="7327989755579928735">A(z) <ph name="MANAGER" /> letiltotta az ADB-hibakeresést. Miután újraindítja <ph name="DEVICE_TYPE" /> eszközét, nem tud külső forrásból alkalmazásokat telepíteni.</translation> <translation id="7328867076235380839">Érvénytelen kombináció</translation> <translation id="7329154610228416156">A bejelentkezés nem sikerült, mert azt egy nem biztonságos URL használatára állították be (<ph name="BLOCKED_URL" />). Kérjük, forduljon rendszergazdájához.</translation> +<translation id="7329932885428707942">Ez rövid kiesést okozhat a mobilhálózatban.</translation> <translation id="7332053360324989309">Dedicated worker: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Dokkolt nagyító engedélyezése</translation> <translation id="7335974957018254119">Helyesírás-ellenőrzés használata a következő nyelveknél:</translation> @@ -5551,6 +5566,7 @@ <translation id="7374376573160927383">USB-eszközök kezelése</translation> <translation id="7375235221357833624">{0,plural, =1{Egy órán belül frissítse az eszközt}other{# órán belül frissítse az eszközt}}</translation> <translation id="7376553024552204454">Az egérmutató kiemelése mozgás közben</translation> +<translation id="737728204345822099">A biztonsági kulcs tárolhatja, hogy Ön felkereste ezt a webhelyet.</translation> <translation id="7377451353532943397">Érzékelő-hozzáférés tiltásának fenntartása</translation> <translation id="7378611153938412599">A gyenge jelszavakat könnyű kitalálni. Figyeljen arra, hogy erős jelszavakat hozzon létre. <ph name="BEGIN_LINK" />Itt további biztonsági tippeket talál.<ph name="END_LINK" /></translation> <translation id="73786666777299047">A Chrome Internetes áruház megnyitása</translation> @@ -6178,6 +6194,7 @@ <translation id="8059417245945632445">&Eszközök vizsgálata</translation> <translation id="8059456211585183827">Nincsenek menthető nyomtatók.</translation> <translation id="8061091456562007989">Visszaállítás</translation> +<translation id="8061991877177392872">Úgy tűnik, hogy Google Segédjéhez már beállította a Voice Match funkciót valamelyik másik eszközön. Korábbi felvételeiből ezen az eszközön is létrehozott hangmintát.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 papírlap}other{{COUNT} papírlap}}</translation> <translation id="8062879968880283306">Olvassa be a QR-kódot az eszköz kamerájával, vagy adja meg a szolgáltatótól kapott aktivációs kódot.</translation> <translation id="8063235345342641131">Alapértelmezett zöld avatar</translation> @@ -6449,6 +6466,7 @@ <translation id="8379991678458444070">Gyorsan visszajuthat ide, ha hozzáadja a lapot a könyvjelzőkhöz</translation> <translation id="8382913212082956454">&E-mail cím másolása</translation> <translation id="8386091599636877289">Az irányelv nem található.</translation> +<translation id="8386819192691131213">Ha engedélyezi a Segéd számára a képernyőn megjelenő információk használatát, akkor gyors válaszokat kaphat tőle (például fordítást, meghatározást, mértékegység-átváltást és egyebeket).</translation> <translation id="8386903983509584791">Keresés befejezve</translation> <translation id="8387361103813440603">Nem láthatják az Ön tartózkodási helyét</translation> <translation id="8389264703141926739">Értesítések letiltása</translation> @@ -6931,6 +6949,7 @@ <translation id="8915370057835397490">Javaslatok betöltése</translation> <translation id="8916476537757519021">Inkognitó subframe: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> – <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">Képernyő mozgatása, amikor az egérmutató érinti a képernyő széleit</translation> <translation id="8923880975836399332">Sötét pávakék</translation> <translation id="8925458182817574960">&Beállítások</translation> <translation id="8926389886865778422">Többször ne figyelmeztessen</translation> @@ -7009,6 +7028,7 @@ <translation id="9009708085379296446">Szándékosan változtatta meg ezt az oldalt?</translation> <translation id="9011163749350026987">Mindig mutassa az ikont</translation> <translation id="9011393886518328654">Kibocsátási megjegyzések</translation> +<translation id="9012122671773859802">Képernyő folyamatos mozgatása az egérmutató mozgatásával együtt</translation> <translation id="9013037634206938463">A Linux telepítéséhez <ph name="INSTALL_SIZE" /> szabad terület szükséges. Tárhely felszabadításához töröljön fájlokat az eszközről.</translation> <translation id="9013707997379828817">Eszközét adminisztrátora visszaállította. Mentse a fontos fájlokat, majd indítsa újra az eszközt. Minden tárolt adat törlődni fog.</translation> <translation id="901668144954885282">Biztonsági mentés a Google Drive-ra</translation> @@ -7053,6 +7073,7 @@ <translation id="9052404922357793350">Letiltás fenntartása</translation> <translation id="9053563360605707198">Nyomtatás mindkét oldalra</translation> <translation id="9053893665344928494">Jegyezze meg a döntésemet</translation> +<translation id="9055278955535611574">Hozzáférés Segédjéhez az „Ok Google” paranccsal</translation> <translation id="9055636786322918818">Az RC4 titkosítás kényszerítése. A beállítás használata növeli a kockázatot, mivel az RC4-kódok nem biztonságosak.</translation> <translation id="9056810968620647706">Nincs találat.</translation> <translation id="9057354806206861646">Ütemezés frissítése</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 75b9a0d8..77b83f3 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Մուտք գործել ձեր Bluetooth և հաջորդական սարքեր</translation> <translation id="114036956334641753">Աուդիո և ենթագրեր</translation> <translation id="1140746652461896221">Արգելափակել բովանդակությունը բոլոր էջերում</translation> +<translation id="1141953877381847186">Թույլատրեք Օգնականին օգտագործել ձեր էկրանին ցուցադրվող տեղեկությունները՝ արագ պատասխաններ (օր․՝ թարգմանություն, բառի սահմանում, չափման միավորի փոխարկում և այլն) տրամադրելու համար։ + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Հիշե՛ք․<ph name="END_BOLD" /> Դուք ցանկացած պահի կարող եք փոխել սա՝ անցնելով Google Օգնականի կարգավորումներ > Առնչվող տեղեկություններ։</translation> <translation id="1143142264369994168">Վկայագրի ստորագրող</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome-ը ձեր համակարգչում վնասաբեր ծրագրեր չի հայտնաբերել • Ստուգվել է 1 րոպե առաջ}one{Chrome-ը ձեր համակարգչում վնասաբեր ծրագրեր չի հայտնաբերել • Ստուգվել է {NUM_MINS} րոպե առաջ}other{Chrome-ը ձեր համակարգչում վնասաբեր ծրագրեր չի հայտնաբերել • Ստուգվել է {NUM_MINS} րոպե առաջ}}</translation> <translation id="1145593918056169051">Տպիչի աշխատանքն ընդհատվեց</translation> @@ -1438,7 +1441,9 @@ <translation id="2594999711683503743">Որոնեք Google-ում կամ մուտքագրեք հասցեն</translation> <translation id="2602501489742255173">Սկսելու համար մատը սահեցրեք վերև</translation> <translation id="2603115962224169880">Մաքրեք համակարգիչը</translation> +<translation id="2603355571917519942">Voice Match-ը պատրաստ է</translation> <translation id="2603463522847370204">Բացել &ինկոգնիտո պատուհանում</translation> +<translation id="2604138917550693049">Որոնել պատկերը Google Տեսապակու օգնությամբ</translation> <translation id="2604255671529671813">Ցանցի միացման սխալ</translation> <translation id="2606246518223360146">Կցել տվյալները</translation> <translation id="2606454609872547359">Ոչ, շարունակել առանց ChromeVox-ի</translation> @@ -1781,6 +1786,7 @@ <translation id="2963151496262057773">Հետևյալ փլագինը չի պատասխանում` <ph name="PLUGIN_NAME" />Ուզո՞ւմ եք դադարեցնել այն:</translation> <translation id="2964193600955408481">Անջատել Wi-Fi-ը</translation> <translation id="2964245677645334031">«Փոխանակում մոտակա սարքերի հետ» գործառույթի տեսանելիություն</translation> +<translation id="2966216232069818096">Թույլատրեք Օգնականին օգտագործել ձեր էկրանին ցուցադրվող տեղեկությունները՝ ձեզ օգնելու համար</translation> <translation id="2966937470348689686">Android-ի կարգավորումների կառավարում</translation> <translation id="2972581237482394796">&Վերարկել</translation> <translation id="2973324205039581528">Անջատել կայքի ձայնը</translation> @@ -1877,6 +1883,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Այս ներդիրն օգտագործում է ձեր տեսախցիկը և խոսափողը:</translation> <translation id="3083193146044397360">Ժամանակավորապես արգելափակվել է՝ անվտանգության նկատառումներից ելնելով</translation> +<translation id="3083899879156272923">Տեղափոխել էկրանը՝ մկնիկը կենտրոնում պահելով</translation> <translation id="3084548735795614657">Քաշեք տեղադրելու համար</translation> <translation id="3084771660770137092">Կամ Chrome-ը սպառել է հիշողությունը, կամ վեբէջի գործընթացը դադարեցվել է որևէ այլ պատճառով: Շարունակելու համար վերաբեռնեք էջը կամ անցեք ուրիշ էջ:</translation> <translation id="3084958266922136097">Անջատել էկրանապահը</translation> @@ -2372,6 +2379,9 @@ <translation id="3654045516529121250">Կարդալ մատչելիության կարգավորումները</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Այն մեկ ֆայլի մշտական հասանելիություն ունի:}one{Այն # ֆայլի մշտական հասանելիություն ունի:}other{Այն # ֆայլի մշտական հասանելիություն ունի:}}</translation> <translation id="3658871634334445293">TrackPoint-ի արագացում</translation> +<translation id="3659830472545192450">Voice Match-ն օգնում է Օգնականին ճանաչել ձեր ձայնը ձեր Chromebook-ում և տարբերել ձեզ մյուսներից։ + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Հիշե՛ք․<ph name="END_BOLD" /> Ձեր ձայնին նման ձայն կամ ձեր ձայնի ձայնագրությունն ունեցող օգտատերերը հնարավոր է՝ նույնպես կարողանան օգտվել ձեր անձնական արդյունքներից։ Դուք ցանկացած ժամանակ կարող եք հեռացնել Voice Match-ի թույլտվությունը՝ անջատելով այն Օգնականի կարգավորումներում։</translation> <translation id="3660234220361471169">Անվստահելի</translation> <translation id="3664511988987167893">Ընդլայնման պատկերակ</translation> <translation id="3665589677786828986">Ձեր կարգավորումներից մի քանիսը փոփոխվել են կողմնակի ծրագրով: Chrome-ը վերականգնել է կանխադրված արժեքները:</translation> @@ -2980,7 +2990,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> հավելվածը կիսվում է պատուհանով:</translation> <translation id="4364830672918311045">Ցուցադրել ծանուցումները</translation> <translation id="4366138410738374926">Տպումը սկսված է</translation> -<translation id="437004882363131692">Ստացեք <ph name="DEVICE_TYPE" /> սարքի հետ կապված խորհուրդներ, առաջարկներ և նորություններ, ինչպես նաև կիսվեք ձեր դիտողություններով։ Դուք ցանկացած պահի կարող եք չեղարկել բաժանորդագրությունը։</translation> <translation id="4370425812909262207">Զամբյուղները թաքցված են։ Դրանք կցուցադրվեն, երբ փոփոխություններ անեք։</translation> <translation id="4370975561335139969">Մուտքագրված էլփոստը և գաղտնաբառը չեն համընկնում</translation> <translation id="4374831787438678295">Լինուքսի տեղադրիչ</translation> @@ -3561,6 +3570,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Ուղղագրության ստուգումը չի աջակցվում ձեր ընտրած լեզուների համար</translation> <translation id="5052499409147950210">Փոփոխեք կայքը</translation> +<translation id="5053962746715621840">Որոնել պատկերը Google Տեսապակու օգնությամբ</translation> <translation id="5057110919553308744">Երբ դուք սեղմում եք ընդլայնման վրա</translation> <translation id="5057403786441168405">Կառավարեք հաշիվները, որոնք մուտք եք գործել։ Chrome-ի և Google Play-ի կայքերը, հավելվածներն ու ընդլայնումները կարող են օգտագործել այս հաշիվները՝ ձեր աշխատանքն ըստ ձեր թույլտվությունների անհատականացնելու համար։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Սահմանափակ մուտք</translation> @@ -4046,6 +4056,9 @@ <translation id="5610038042047936818">Միացնել ֆոտոխցիկի ռեժիմը</translation> <translation id="561030196642865721">Երրորդ կողմի քուքիները թույլատրված են այս կայքում</translation> <translation id="5612734644261457353">Ձեր գաղտնաբառը դեռ չի հաստատվել: Եթե վերջերս փոխել եք ձեր գաղտնաբառը, դուրս գրումից հետո պետք է կիրառվի նոր գաղտնաբառը: Հին գաղտնաբառն օգտագործեք այստեղ:</translation> +<translation id="561308544008485315">Voice Match-ն օգնում է Օգնականին ճանաչել ձեր ձայնը ձեր Chromebook-ում և տարբերել ձեզ մյուսներից։ Մարտկոցի լիցքը տնտեսելու համար «Ok Google» գործառույթն ակտիվ կլինի, միայն երբ սարքը միացված լինի սնուցման աղբյուրին։ Փոփոխություններ անելու համար անցեք կարգավորումներ։ + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Հիշե՛ք․<ph name="END_BOLD" /> Ձեր ձայնին նման ձայն կամ ձեր ձայնի ձայնագրությունն ունեցող օգտատերերը հնարավոր է՝ նույնպես կարողանան օգտվել ձեր անձնական արդյունքներից։ Դուք ցանկացած ժամանակ կարող եք հեռացնել Voice Match-ի թույլտվությունը՝ անջատելով այն Օգնականի կարգավորումներում։</translation> <translation id="5614190747811328134">Օգտատիրոջ ծանուցում</translation> <translation id="5614553682702429503">Պահե՞լ գաղտնաբառը</translation> <translation id="5616726534702877126">Պահպանել չափը</translation> @@ -5076,6 +5089,7 @@ <translation id="6824584962142919697">&Ստուգել տարրերը</translation> <translation id="6825184156888454064">Դասավորել ըստ անվան</translation> <translation id="6826872289184051766">Հաստատել USB-ի միջոցով</translation> +<translation id="6827604573767207488">Դուք կարծես արդեն կարգավորել եք անհատականացված Օգնականը մեկ այլ սարքում։ Միացրեք այս կարգավորումը՝ ձեր Օգնականի ավելի շատ հնարավորություններից օգտվելու համար։</translation> <translation id="6828153365543658583">Թույլատրել մուտքը միայն հետևյալ օգտատերերին՝</translation> <translation id="6828182567531805778">Տվյալները համաժամացնելու համար մուտքագրեք ձեր անցաբառը</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5511,6 +5525,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> կայքն անջատել է ADB վրիպազերծումը։ Ձեր <ph name="DEVICE_TYPE" /> սարքը վերագործարկելուց հետո դուք չեք կարողանա բեռնել հավելվածներ անհայտ աղբյուրներից։</translation> <translation id="7328867076235380839">Սխալ համադրություն</translation> <translation id="7329154610228416156">Մուտքը չհաջողվեց, քանի որ դրա կազմաձևումը թույլ է տալիս օգտագործել ոչ ապահով URL (<ph name="BLOCKED_URL" />): Կապվեք ձեր ադմինիստրատորի հետ:</translation> +<translation id="7329932885428707942">Սա կարող է հանգեցնել բջջային ցանցի կարճատև անջատման։</translation> <translation id="7332053360324989309">Dedicated Worker` <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Միացնել ամրացված խոշորացույցը</translation> <translation id="7335974957018254119">Օգտագործել ուղղագրության ստուգումը հետևյալ լեզուների համար՝</translation> @@ -5554,6 +5569,7 @@ <translation id="7374376573160927383">Կառավարել USB սարքերը</translation> <translation id="7375235221357833624">{0,plural, =1{Թարմացրեք սարքը մեկ ժամվա ընթացքում}one{Թարմացրեք սարքը # ժամվա ընթացքում}other{Թարմացրեք սարքը # ժամվա ընթացքում}}</translation> <translation id="7376553024552204454">Ընդգծել մկնիկի նշորդը, երբ այն շարժվում է</translation> +<translation id="737728204345822099">Անվտանգության բանալու վրա կարող է պահվել նշում այս կայքի այցելության մասին։</translation> <translation id="7377451353532943397">Միշտ արգելել տվիչների օգտագործումը</translation> <translation id="7378611153938412599">Թույլ գաղտնաբառերը հեշտ է գուշակել։ Համոզվեք, որ հուսալի գաղտնաբառեր եք ստեղծում։ <ph name="BEGIN_LINK" />Դիտել հաշվի պաշտպանության այլ խորհուրդներ<ph name="END_LINK" /></translation> <translation id="73786666777299047">Բացել Chrome Web Store-ը</translation> @@ -6179,6 +6195,7 @@ <translation id="8059417245945632445">&Հետազոտել սարքերը</translation> <translation id="8059456211585183827">Տպիչներ չկան, որոնք կարող եք պահել։</translation> <translation id="8061091456562007989">Հետ փոխել</translation> +<translation id="8061991877177392872">Դուք արդեն կարգավորել եք Voice Match-ը այլ սարքում։ Այս նախկին ձայնագրություններն օգտագործվել են՝ ձեր ձայնի նմուշն այս սարքում ստեղծելու համար։</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 թերթ}one{{COUNT} թերթ}other{{COUNT} թերթ}}</translation> <translation id="8062879968880283306">Սկանավորեք QR կոդը սարքի տեսախցիկի միջոցով կամ մուտքագրեք օպերատորի տրամադրած ակտիվացման կոդը։</translation> <translation id="8063235345342641131">Կանխադրված կանաչ ավատար</translation> @@ -6450,6 +6467,7 @@ <translation id="8379991678458444070">Էջանշեք այս ներդիրը՝ ավելի ուշ այցելելու համար</translation> <translation id="8382913212082956454">Պատճենել &հասցեն</translation> <translation id="8386091599636877289">Քաղաքականությունը չգտնվեց։</translation> +<translation id="8386819192691131213">Թույլատրեք Օգնականին օգտագործել ձեր էկրանին ցուցադրվող տեղեկությունները՝ արագ պատասխաններ (օր․՝ թարգմանություն, բառի սահմանում, չափման միավորի փոխարկում և այլն) տրամադրելու համար։</translation> <translation id="8386903983509584791">Որոնումն ավարտվեց</translation> <translation id="8387361103813440603">Չի թույլատրվում տեսնել ձեր տեղադրությունը</translation> <translation id="8389264703141926739">Արգելափակել ծանուցումները</translation> @@ -6933,6 +6951,7 @@ <translation id="8915370057835397490">Առաջարկը բեռնվում է</translation> <translation id="8916476537757519021">Ինկոգնիտո ռեժիմի ենթաշրջանակ՝ <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> (<ph name="GIVEN_NAME" />)</translation> +<translation id="8922624386829239660">Տեղափոխել էկրանը, երբ մկնիկը դիպչի էկրանի եզրերին</translation> <translation id="8923880975836399332">Մուգ փիրուզագույն</translation> <translation id="8925458182817574960">&Կարգավորումներ</translation> <translation id="8926389886865778422">Այլևս չհարցնել</translation> @@ -7011,6 +7030,7 @@ <translation id="9009708085379296446">Ուզում էիք փոխե՞լ այս էջը</translation> <translation id="9011163749350026987">Միշտ ցուցադրել պատկերակը</translation> <translation id="9011393886518328654">Թողարկման նշումներ</translation> +<translation id="9012122671773859802">Շարունակաբար տեղափոխել էկրանը, երբ մկնիկը շարժվում է</translation> <translation id="9013037634206938463">Լինուքսը տեղադրելու համար անհրաժեշտ է նվազագույնը <ph name="INSTALL_SIZE" /> ազատ տարածք։ Տարածք ազատելու համար սարքի հիշողությունից ֆայլեր ջնջեք։</translation> <translation id="9013707997379828817">Ձեր ադմինիստրատորը վերակայել է այս սարքը: Պահեք կարևոր ֆայլերը, այնուհետև վերագործարկեք սարքը: Սարքի բոլոր տվյալները կջնջվեն։</translation> <translation id="901668144954885282">Կրկնօրինակ Google Drive-ում</translation> @@ -7055,6 +7075,7 @@ <translation id="9052404922357793350">Շարունակել արգելափակումը</translation> <translation id="9053563360605707198">Տպել երկու կողմին</translation> <translation id="9053893665344928494">Հիշել իմ ընտրությունը</translation> +<translation id="9055278955535611574">Ակտիվացրեք ձեր Օգնականը՝ ասելով «Ok Google»</translation> <translation id="9055636786322918818">Օգտագործել RC4 գաղտնագրումը։ Այս տարբերակի օգտագործումն ապահով չէ, քանի որ RC4 գաղտնագրերը հուսալի չեն։</translation> <translation id="9056810968620647706">Համընկնումներ չեն գտնվել:</translation> <translation id="9057354806206861646">Ժամանակացույցի թարմացում</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 8640a52..36fb408 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Mengakses perangkat Seri dan Bluetooth Anda</translation> <translation id="114036956334641753">Audio dan teks</translation> <translation id="1140746652461896221">Blokir konten di halaman apa pun yang Anda kunjungi</translation> +<translation id="1141953877381847186">Izinkan Asisten menggunakan informasi di layar untuk memberikan jawaban cepat seperti terjemahan, definisi, konversi satuan, dan lainnya. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Perhatikan:<ph name="END_BOLD" /> Anda dapat mengubahnya kapan saja di Setelan Asisten Google > Info terkait.</translation> <translation id="1143142264369994168">Penandatangan Sertifikat</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome tidak menemukan software berbahaya di komputer Anda • Diperiksa 1 menit yang lalu}other{Chrome tidak menemukan software berbahaya di komputer Anda • Diperiksa {NUM_MINS} menit yang lalu}}</translation> <translation id="1145593918056169051">Printer telah berhenti</translation> @@ -1432,7 +1435,9 @@ <translation id="2594999711683503743">Telusuri di Google atau ketik URL</translation> <translation id="2602501489742255173">Geser ke atas untuk memulai</translation> <translation id="2603115962224169880">Bersihkan komputer</translation> +<translation id="2603355571917519942">Voice Match sudah siap</translation> <translation id="2603463522847370204">Buka di &jendela samaran</translation> +<translation id="2604138917550693049">Telusuri gambar dengan Google Lens</translation> <translation id="2604255671529671813">Error koneksi jaringan</translation> <translation id="2606246518223360146">Tautkan Data</translation> <translation id="2606454609872547359">Tidak, lanjutkan dengan ChromeVox</translation> @@ -1774,6 +1779,7 @@ <translation id="2963151496262057773">Plugin berikut tidak merespons: <ph name="PLUGIN_NAME" />Ingin menghentikannya?</translation> <translation id="2964193600955408481">Nonaktifkan Wi-Fi</translation> <translation id="2964245677645334031">Visibilitas Berbagi Langsung</translation> +<translation id="2966216232069818096">Izinkan Asisten menggunakan informasi di layar untuk membantu Anda</translation> <translation id="2966937470348689686">Kelola preferensi Android</translation> <translation id="2972581237482394796">&Ulang</translation> <translation id="2973324205039581528">Matikan Notifikasi Situs</translation> @@ -1869,6 +1875,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Tab ini menggunakan kamera atau mikrofon Anda.</translation> <translation id="3083193146044397360">Diblokir sementara untuk melindungi keamanan Anda</translation> +<translation id="3083899879156272923">Pindahkan layar sambil mempertahankan mouse di tengah layar</translation> <translation id="3084548735795614657">Lepaskan untuk memasang</translation> <translation id="3084771660770137092">Chrome kehabisan memori atau proses untuk halaman web dihentikan karena beberapa alasan lain. Untuk melanjutkan, muat ulang atau buka halaman lain.</translation> <translation id="3084958266922136097">Nonaktifkan screen saver</translation> @@ -2362,6 +2369,9 @@ <translation id="3654045516529121250">Baca setelan aksesibilitas Anda</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Memiliki akses permanen ke satu file.}other{Memiliki akses permanen ke # file.}}</translation> <translation id="3658871634334445293">Akselerasi TrackPoint</translation> +<translation id="3659830472545192450">Voice Match membantu Asisten Google mengidentifikasi suara Anda di Chromebook dan membedakan Anda dari orang lain. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Perhatikan:<ph name="END_BOLD" /> Suara atau rekaman yang mirip mungkin juga dapat mengakses hasil penelusuran personal Anda. Anda dapat menghapus izin Voice Match nanti dengan menonaktifkannya di Setelan Asisten.</translation> <translation id="3660234220361471169">Tidak tepercaya</translation> <translation id="3664511988987167893">Ikon Ekstensi</translation> <translation id="3665589677786828986">Chrome mendeteksi bahwa beberapa setelan Anda dirusak oleh program lain dan menyetelnya ulang ke setelan default aslinya.</translation> @@ -2968,7 +2978,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> membagikan jendela.</translation> <translation id="4364830672918311045">Tampilkan notifikasi</translation> <translation id="4366138410738374926">Pencetakan dimulai</translation> -<translation id="437004882363131692">Dapatkan tips <ph name="DEVICE_TYPE" />, penawaran, dan informasi terbaru, serta berikan masukan. Anda dapat berhenti berlangganan kapan saja.</translation> <translation id="4370425812909262207">Keranjang disembunyikan. Keranjang akan muncul kembali saat Anda melakukan perubahan.</translation> <translation id="4370975561335139969">Email dan sandi yang Anda masukkan tidak cocok</translation> <translation id="4374831787438678295">Installer Linux</translation> @@ -3545,6 +3554,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Fitur periksa ejaan tidak didukung untuk bahasa yang Anda pilih</translation> <translation id="5052499409147950210">Edit situs</translation> +<translation id="5053962746715621840">Telusuri Gambar dengan Google Lens</translation> <translation id="5057110919553308744">Saat Anda mengklik ekstensi</translation> <translation id="5057403786441168405">Kelola akun Anda yang login. Situs, aplikasi, serta ekstensi di Chrome dan Google Play mungkin menggunakan akun ini untuk menyesuaikan pengalaman Anda, bergantung pada setelan izin. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Batasi login</translation> @@ -4027,6 +4037,9 @@ <translation id="5610038042047936818">Beralih ke mode kamera</translation> <translation id="561030196642865721">Cookie pihak ketiga tidak diizinkan di situs ini</translation> <translation id="5612734644261457353">Maaf, sandi Anda masih belum dapat diverifikasi. Catatan: jika Anda baru saja mengubah sandi Anda, sandi yang baru akan diterapkan saat Anda keluar, gunakan sandi lama di sini.</translation> +<translation id="561308544008485315">Voice Match membantu Asisten Google mengidentifikasi suara Anda di Chromebook dan membedakan Anda dari orang lain. Untuk menghemat baterai, “Ok Google” hanya akan aktif saat perangkat terhubung ke sumber listrik. Untuk melakukan perubahan, buka Setelan. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Perhatikan:<ph name="END_BOLD" /> Suara atau rekaman yang mirip mungkin juga dapat mengakses hasil penelusuran personal Anda. Anda dapat menghapus izin Voice Match nanti dengan menonaktifkannya di Setelan Asisten.</translation> <translation id="5614190747811328134">Notifikasi Pengguna</translation> <translation id="5614553682702429503">Simpan sandi?</translation> <translation id="5616726534702877126">Tetapkan ukuran</translation> @@ -5050,6 +5063,7 @@ <translation id="6824584962142919697">&Periksa elemen</translation> <translation id="6825184156888454064">Urutkan menurut nama</translation> <translation id="6826872289184051766">Verifikasi melalui USB</translation> +<translation id="6827604573767207488">Sepertinya Anda sudah menyiapkan Asisten yang dipersonalisasi di perangkat lain. Optimalkan penggunaan Asisten Anda dengan mengaktifkan setelan berikut ini.</translation> <translation id="6828153365543658583">Batasi akses masuk hanya untuk pengguna berikut:</translation> <translation id="6828182567531805778">Masukkan frasa sandi Anda untuk menyinkronkan data</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5484,6 +5498,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> telah menonaktifkan proses debug ADB. Setelah memulai ulang <ph name="DEVICE_TYPE" />, Anda tidak akan dapat melakukan sideload aplikasi.</translation> <translation id="7328867076235380839">Kombinasi tidak valid</translation> <translation id="7329154610228416156">Proses masuk gagal karena dikonfigurasi untuk menggunakan URL yang tidak aman (<ph name="BLOCKED_URL" />). Hubungi administrator Anda.</translation> +<translation id="7329932885428707942">Ini mungkin menyebabkan jaringan seluler terputus sebentar.</translation> <translation id="7332053360324989309">Pekerja Khusus: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Aktifkan kaca pembesar tersemat</translation> <translation id="7335974957018254119">Gunakan fitur periksa ejaan untuk</translation> @@ -5527,6 +5542,7 @@ <translation id="7374376573160927383">Kelola perangkat USB</translation> <translation id="7375235221357833624">{0,plural, =1{Update perangkat dalam 1 jam}other{Update perangkat dalam # jam}}</translation> <translation id="7376553024552204454">Sorot kursor mouse saat kursor berpindah</translation> +<translation id="737728204345822099">Data kunjungan Anda ke situs ini dapat disimpan di kunci keamanan.</translation> <translation id="7377451353532943397">Terus blokir akses sensor</translation> <translation id="7378611153938412599">Sandi yang lemah mudah ditebak. Pastikan Anda membuat sandi yang kuat. <ph name="BEGIN_LINK" />Lihat tips keamanan lainnya<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Buka Chrome Webstore</translation> @@ -6153,6 +6169,7 @@ <translation id="8059417245945632445">&Periksa perangkat</translation> <translation id="8059456211585183827">Tidak ada printer yang tersedia untuk disimpan.</translation> <translation id="8061091456562007989">Kembalikan</translation> +<translation id="8061991877177392872">Sepertinya Anda sudah menyiapkan Voice Match dengan Asisten Anda di perangkat lain. Rekaman sebelumnya tersebut digunakan untuk membuat model suara di perangkat ini.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 lembar kertas}other{{COUNT} lembar kertas}}</translation> <translation id="8062879968880283306">Pindai kode QR menggunakan kamera perangkat atau masukkan kode aktivasi yang diberikan oleh operator layanan Anda.</translation> <translation id="8063235345342641131">Avatar hijau default</translation> @@ -6422,6 +6439,7 @@ <translation id="8379991678458444070">Kembali ke halaman secara cepat dengan mem-bookmark tab ini</translation> <translation id="8382913212082956454">Salin alamat &email</translation> <translation id="8386091599636877289">Kebijakan tidak ditemukan.</translation> +<translation id="8386819192691131213">Izinkan Asisten menggunakan informasi di layar untuk memberikan jawaban cepat seperti terjemahan, definisi, konversi satuan, dan lainnya</translation> <translation id="8386903983509584791">Pemindaian selesai</translation> <translation id="8387361103813440603">Tidak diizinkan melihat lokasi Anda</translation> <translation id="8389264703141926739">Blokir notifikasi</translation> @@ -6899,6 +6917,7 @@ <translation id="8915370057835397490">Memuat saran</translation> <translation id="8916476537757519021">Subframe Mode Samaran: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Pindahkan layar saat mouse menyentuh tepi layar</translation> <translation id="8923880975836399332">Hijau kebiruan gelap</translation> <translation id="8925458182817574960">&Setelan</translation> <translation id="8926389886865778422">Jangan tanya lagi</translation> @@ -6976,6 +6995,7 @@ <translation id="9009708085379296446">Apakah maksud Anda ingin mengubah halaman ini?</translation> <translation id="9011163749350026987">Selalu tampilkan ikon</translation> <translation id="9011393886518328654">Catatan rilis</translation> +<translation id="9012122671773859802">Pindahkan layar secara terus-menerus saat mouse berpindah</translation> <translation id="9013037634206938463">Perlu ruang kosong sebesar <ph name="INSTALL_SIZE" /> untuk menginstal Linux. Untuk menambah ruang kosong, hapus file dari perangkat Anda.</translation> <translation id="9013707997379828817">Administrator memulihkan perangkat ini. Harap simpan file yang penting, lalu nyalakan ulang. Semua data di perangkat akan dihapus.</translation> <translation id="901668144954885282">Cadangkan ke Google Drive</translation> @@ -7020,6 +7040,7 @@ <translation id="9052404922357793350">Lanjutkan pemblokiran</translation> <translation id="9053563360605707198">Print di kedua sisi</translation> <translation id="9053893665344928494">Ingat pilihan saya</translation> +<translation id="9055278955535611574">Akses Asisten Anda dengan "Ok Google"</translation> <translation id="9055636786322918818">Terapkan enkripsi RC4. Penggunaan opsi ini akan meningkatkan risiko, karena cipher RC4 tidak aman.</translation> <translation id="9056810968620647706">Tidak ditemukan kecocokan.</translation> <translation id="9057354806206861646">Update jadwal</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 193cc41..18402ec 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Fá aðgang að Bluetooth og raðtengdu tækjunum þínum</translation> <translation id="114036956334641753">Hljóð og skjátextar</translation> <translation id="1140746652461896221">Lokaðu fyrir efni á þeim síðum sem þú heimsækir</translation> +<translation id="1141953877381847186">Leyfa Hjálparanum að nota upplýsingar á skjánum til að gefa skjót svör, t.d. þýðingar, skilgreiningar, umreiknuð mæligildi og fleira. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Hafðu eftirfarandi í huga:<ph name="END_BOLD" /> Þú getur alltaf breytt þessu seinna í stillingum Google hjálpara > Tengdar upplýsingar.</translation> <translation id="1143142264369994168">Vottorðsundirritari</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome fann engan skaðlegan hugbúnað í tölvunni þinni • Athugað fyrir 1 mínútu}one{Chrome fann engan skaðlegan hugbúnað í tölvunni þinni • Athugað fyrir {NUM_MINS} mínútu}other{Chrome fann engan skaðlegan hugbúnað í tölvunni þinni • Athugað fyrir {NUM_MINS} mínútum}}</translation> <translation id="1145593918056169051">Prentun stöðvaðist</translation> @@ -1437,7 +1440,9 @@ <translation id="2594999711683503743">Leitaðu með Google eða sláðu inn vefslóð</translation> <translation id="2602501489742255173">Strjúktu upp til að hefjast handa</translation> <translation id="2603115962224169880">Hreinsa tölvu</translation> +<translation id="2603355571917519942">Voice Match er tilbúið</translation> <translation id="2603463522847370204">Opna í hul&iðsglugga</translation> +<translation id="2604138917550693049">Leita í mynd með Google linsu</translation> <translation id="2604255671529671813">Villa í nettengingu</translation> <translation id="2606246518223360146">Tengja gögn</translation> <translation id="2606454609872547359">Nei, halda áfram án ChromeVox</translation> @@ -1780,6 +1785,7 @@ <translation id="2963151496262057773">Eftirfarandi viðbót svarar ekki: <ph name="PLUGIN_NAME" />Viltu stöðva hana?</translation> <translation id="2964193600955408481">Slökkva á Wi-Fi</translation> <translation id="2964245677645334031">Sýnileiki Nærdeilingar</translation> +<translation id="2966216232069818096">Leyfa Hjálparanum að nota upplýsingar á skjánum til að aðstoða</translation> <translation id="2966937470348689686">Hafa umsjón með stillingum Android</translation> <translation id="2972581237482394796">Endurge&ra</translation> <translation id="2973324205039581528">Slökkva á hljóði svæðis</translation> @@ -1876,6 +1882,7 @@ <translation id="308268297242056490">Veffang</translation> <translation id="3082780749197361769">Þessi flipi er að nota myndavélina eða hljóðnemann.</translation> <translation id="3083193146044397360">Lokað tímabundið til að vernda öryggi þitt</translation> +<translation id="3083899879156272923">Hreyfa skjáinn með bendilinn fyrir miðju skjásins</translation> <translation id="3084548735795614657">Slepptu til að setja upp</translation> <translation id="3084771660770137092">Annaðhvort kláraðist minni Chrome eða önnur ástæða varð til þess að slökkt var á ferli vefsíðunnar. Til að halda áfram skaltu endurhlaða eða fara á aðra síðu.</translation> <translation id="3084958266922136097">Slökkva á skjávara</translation> @@ -2371,6 +2378,9 @@ <translation id="3654045516529121250">Lesa aðgengisstillingar</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Það hefur varanlegan aðgang að einni skrá.}one{Það hefur varanlegan aðgang að # skrá.}other{Það hefur varanlegan aðgang að # skrám.}}</translation> <translation id="3658871634334445293">TrackPoint-hröðun</translation> +<translation id="3659830472545192450">Google hjálparinn notar Voice Match til að bera kennsl á röddina þína í Chromebook og þekkja þig frá öðrum. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Hafðu eftirfarandi í huga:<ph name="END_BOLD" /> Einhver með svipaða rödd eða upptöku gæti fengið aðgang að persónulegum niðurstöðum þínum. Þú getur fjarlægt heimildina fyrir Voice Match síðar með því að gera hana óvirka í stillingum Hjálparans.</translation> <translation id="3660234220361471169">Ótraust</translation> <translation id="3664511988987167893">Tákn viðbótar</translation> <translation id="3665589677786828986">Chrome greindi að annað forrit hefur nýlega spillt einhverjum stillingum hjá þér og endurstillti þær því í sjálfgildi.</translation> @@ -2979,7 +2989,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> deilir glugga.</translation> <translation id="4364830672918311045">Birta tilkynningar</translation> <translation id="4366138410738374926">Prentun hafin</translation> -<translation id="437004882363131692">Fáðu ábendingar, tilboð og uppfærslur fyrir <ph name="DEVICE_TYPE" /> og komdu ábendingum á framfæri. Þú getur hætt áskrift hvenær sem er.</translation> <translation id="4370425812909262207">Körfur faldar. Þær birtast aftur þegar þú gerir breytingar.</translation> <translation id="4370975561335139969">Netfangið og aðgangsorðið sem þú slóst inn passa ekki saman</translation> <translation id="4374831787438678295">Linux-uppsetningarforrit</translation> @@ -3559,6 +3568,7 @@ <translation id="5050330054928994520">Upplestur</translation> <translation id="5051836348807686060">Villuleit er ekki studd á þeim tungumálum sem þú valdir</translation> <translation id="5052499409147950210">Breyta vefsvæði</translation> +<translation id="5053962746715621840">Leita í mynd með Google linsu</translation> <translation id="5057110919553308744">Þegar þú smellir á viðbótina</translation> <translation id="5057403786441168405">Stjórnaðu innskráðum reikningum þínum. Vefsvæði, forrit og viðbætur í Chrome og Google Play geta notað þessa reikninga til að sérsníða upplifun þína, eftir því hvaða heimildir eru veittar. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Takmarka innskráningu</translation> @@ -4042,6 +4052,9 @@ <translation id="5610038042047936818">Skipta yfir í myndavélarstillingu</translation> <translation id="561030196642865721">Fótspor þriðju aðila eru leyfð á þessu vefsvæði</translation> <translation id="5612734644261457353">Því miður var ekki hægt að staðfesta aðgangsorðið þitt. Hafðu í huga að ef þú hefur breytt aðgangsorðinu nýlega tekur nýja aðgangsorðið gildi eftir útskráningu. Notaðu gamla aðgangsorðið hér.</translation> +<translation id="561308544008485315">Google hjálparinn notar Voice Match til að bera kennsl á röddina þína í Chromebook og þekkja þig frá öðrum. Aðeins er kveikt á „Ok Google“ þegar tækið er tengt við aflgjafa. Þú getur breytt þessu í stillingunum. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Hafðu eftirfarandi í huga:<ph name="END_BOLD" /> Einhver með svipaða rödd eða upptöku gæti fengið aðgang að persónulegum niðurstöðum þínum. Þú getur fjarlægt heimildina fyrir Voice Match síðar með því að gera hana óvirka í stillingum Hjálparans.</translation> <translation id="5614190747811328134">Notandatilkynning</translation> <translation id="5614553682702429503">Vista aðgangsorð?</translation> <translation id="5616726534702877126">Taka frá stærð</translation> @@ -5072,6 +5085,7 @@ <translation id="6824584962142919697">&Kanna einingar</translation> <translation id="6825184156888454064">Raða eftir heiti</translation> <translation id="6826872289184051766">Staðfesta með USB</translation> +<translation id="6827604573767207488">Þú virðist þegar hafa sett sérsniðna Hjálparann upp í öðru tæki. Fáðu enn meira út úr Hjálparanum með því að kveikja á eftirfarandi stillingu.</translation> <translation id="6828153365543658583">Takmarka innskráningu við eftirfarandi notendur:</translation> <translation id="6828182567531805778">Sláðu inn aðgangsorðið til að samstilla gögnin þín</translation> <translation id="682871081149631693">Flýtilagfæring</translation> @@ -5507,6 +5521,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> slökkti á ADB-villuleit. Þegar þú endurræsir <ph name="DEVICE_TYPE" /> geturðu ekki hlaðið forritum á milli tækja.</translation> <translation id="7328867076235380839">Ógild samsetning</translation> <translation id="7329154610228416156">Innskráning mistókst vegna þess að hún var stillt á að nota óörugga vefslóð (<ph name="BLOCKED_URL" />). Hafðu samband við kerfisstjóra.</translation> +<translation id="7329932885428707942">Sambandið við farsímakerfið gæti rofnað í stutta stund.</translation> <translation id="7332053360324989309">Tilgreindur vefvirki: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Kveikja á stækkunargleri í föstum glugga</translation> <translation id="7335974957018254119">Nota ritvilluleit fyrir</translation> @@ -5550,6 +5565,7 @@ <translation id="7374376573160927383">Stjórna USB-tækjum</translation> <translation id="7375235221357833624">{0,plural, =1{Uppfæra tæki innan klukkustundar}one{Uppfæra tæki innan # klukkustundar}other{Uppfæra tæki innan # klukkustunda}}</translation> <translation id="7376553024552204454">Auðkenna músarbendilinn þegar hann hreyfist</translation> +<translation id="737728204345822099">Færsla um heimsókn þína á þetta vefsvæði verður mögulega vistuð á öryggislyklinum þínum.</translation> <translation id="7377451353532943397">Halda áfram að loka á aðgang að skynjurum</translation> <translation id="7378611153938412599">Léleg aðgangsorð eru þau sem auðvelt er að giska á. Passaðu að búa til traust aðgangsorð. <ph name="BEGIN_LINK" />Sjá fleiri öryggisábendingar.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Opna vefverslun Chrome</translation> @@ -6176,6 +6192,7 @@ <translation id="8059417245945632445">Kanna tæk&i</translation> <translation id="8059456211585183827">Engir tiltækir prentarar til að vista.</translation> <translation id="8061091456562007989">Breyta til baka</translation> +<translation id="8061991877177392872">Þú virðist þegar hafa sett upp Voice Match fyrir Hjálparann í öðru tæki. Þessar eldri upptökur voru notaðar til að búa til raddlíkan í tækinu.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 blaðsíða}one{{COUNT} blaðsíða}other{{COUNT} blaðsíður}}</translation> <translation id="8062879968880283306">Skannaðu QR-kóða með myndavél tækisins eða sláðu inn virkjunarkóða frá símafyrirtækinu þínu.</translation> <translation id="8063235345342641131">Sjálfgefin græn notandamynd</translation> @@ -6447,6 +6464,7 @@ <translation id="8379991678458444070">Finndu þennan flipa aftur með því að bókamerkja hann</translation> <translation id="8382913212082956454">Afrita n&etfang</translation> <translation id="8386091599636877289">Regla fannst ekki.</translation> +<translation id="8386819192691131213">Leyfa Hjálparanum að nota upplýsingar á skjánum til að gefa skjót svör, t.d. þýðingar, skilgreiningar, umreiknuð mæligildi og fleira.</translation> <translation id="8386903983509584791">Skönnun lokið</translation> <translation id="8387361103813440603">Mega ekki sjá staðsetningu þína</translation> <translation id="8389264703141926739">Loka á tilkynningar</translation> @@ -6930,6 +6948,7 @@ <translation id="8915370057835397490">Hleður tillögu</translation> <translation id="8916476537757519021">Huliðsundirrammi: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> – <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">Hreyfa skjáinn þegar bendillinn snertir skjájaðarinn</translation> <translation id="8923880975836399332">Dökkblágrænn</translation> <translation id="8925458182817574960">&Stillingar</translation> <translation id="8926389886865778422">Ekki spyrja aftur</translation> @@ -7008,6 +7027,7 @@ <translation id="9009708085379296446">Vildirðu breyta þessari síðu?</translation> <translation id="9011163749350026987">Sýna alltaf tákn</translation> <translation id="9011393886518328654">Um útgáfuna</translation> +<translation id="9012122671773859802">Láta skjáinn fylgja músarbendlinum</translation> <translation id="9013037634206938463"><ph name="INSTALL_SIZE" /> af lausu plássi er nauðsynlegt til að setja upp Linux. Eyddu skrám úr tækinu til að auka geymslurýmið.</translation> <translation id="9013707997379828817">Kerfisstjórinn þinn færði þetta tæki aftur í eldri útgáfu. Vistaðu mikilvægar skrár og endurræstu. Öllum gögnum á tækinu verður eytt.</translation> <translation id="901668144954885282">Taka afrit á Google Drive</translation> @@ -7052,6 +7072,7 @@ <translation id="9052404922357793350">Halda áfram að útiloka</translation> <translation id="9053563360605707198">Prenta á báðum hliðum</translation> <translation id="9053893665344928494">Muna hvað ég valdi</translation> +<translation id="9055278955535611574">Opnaðu Hjálparann með „Ok Google“</translation> <translation id="9055636786322918818">Þvinga RC4-dulkóðun. Þessi valkostur felur í sér meiri áhættu, þar sem RC4-dulmálslyklar eru óöruggir.</translation> <translation id="9056810968620647706">Engar samsvaranir fundust.</translation> <translation id="9057354806206861646">Uppfæra áætlun</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index ecb324a..2471c22 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Accesso ai dispositivi seriali e Bluetooth</translation> <translation id="114036956334641753">Audio e sottotitoli</translation> <translation id="1140746652461896221">Blocco dei contenuti nelle pagine visitate</translation> +<translation id="1141953877381847186">Consenti all'assistente di usare le informazioni visualizzate sullo schermo per fornire risposte rapide quali traduzioni, definizioni, conversioni di unità di misura e tanto altro. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Ricorda:<ph name="END_BOLD" /> puoi cambiare questa preferenza in qualsiasi momento nelle Impostazioni dell'Assistente Google > Informazioni correlate.</translation> <translation id="1143142264369994168">Firmatario del certificato</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome non ha rilevato software dannoso sul computer • Ultima verifica: 1 minuto fa}other{Chrome non ha rilevato software dannoso sul computer • Ultima verifica: {NUM_MINS} minuti fa}}</translation> <translation id="1145593918056169051">La stampante si è interrotta</translation> @@ -1431,7 +1434,9 @@ <translation id="2594999711683503743">Cerca su Google o digita un URL</translation> <translation id="2602501489742255173">Scorri verso l'alto per iniziare</translation> <translation id="2603115962224169880">Pulisci il computer</translation> +<translation id="2603355571917519942">Funzionalità Voice Match pronta</translation> <translation id="2603463522847370204">Apri in finestra di navigazione in &incognito</translation> +<translation id="2604138917550693049">Cerca l'immagine con Google Lens</translation> <translation id="2604255671529671813">Errore di connessione alla rete</translation> <translation id="2606246518223360146">Collega dati</translation> <translation id="2606454609872547359">No, continua senza ChromeVox</translation> @@ -1773,6 +1778,7 @@ <translation id="2963151496262057773">Il seguente plug-in non risponde: <ph name="PLUGIN_NAME" />. Interrompere l'esecuzione?</translation> <translation id="2964193600955408481">Disattiva Wi-Fi</translation> <translation id="2964245677645334031">Visibilità Condivisione nelle vicinanze</translation> +<translation id="2966216232069818096">Consenti all'assistente di usare le informazioni visualizzate sullo schermo per aiutarti</translation> <translation id="2966937470348689686">Gestisci le preferenze Android</translation> <translation id="2972581237482394796">&Ripeti</translation> <translation id="2973324205039581528">Disattiva l'audio del sito</translation> @@ -1868,6 +1874,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Questa scheda utilizza la fotocamera o il microfono.</translation> <translation id="3083193146044397360">Bloccata temporaneamente per tutelare la tua sicurezza</translation> +<translation id="3083899879156272923">Sposta lo schermo tenendo il puntatore del mouse al centro</translation> <translation id="3084548735795614657">Trascina per installare</translation> <translation id="3084771660770137092">Google Chrome ha esaurito la memoria o il processo relativo alla pagina web è stato chiuso per qualche altro motivo. Per continuare, ricarica la pagina o aprine un'altra.</translation> <translation id="3084958266922136097">Disabilita salvaschermo</translation> @@ -2361,6 +2368,9 @@ <translation id="3654045516529121250">Lettura delle impostazioni di accessibilità</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ha accesso permanente a un file.}other{Ha accesso permanente a # file.}}</translation> <translation id="3658871634334445293">Accelerazione TrackPoint</translation> +<translation id="3659830472545192450">Voice Match consente all'Assistente Google di identificare la tua voce sul tuo Chromebook e di distinguerla dalle altre. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Ricorda:<ph name="END_BOLD" /> anche qualcuno con una voce simile alla tua o in possesso di una registrazione della tua voce potrebbe essere in grado di accedere ai tuoi risultati personali. Puoi rimuovere l'autorizzazione di utilizzo di Voice Match in un secondo momento disattivando la funzionalità nelle Impostazioni dell'assistente.</translation> <translation id="3660234220361471169">Non attendibile</translation> <translation id="3664511988987167893">Icona dell'estensione</translation> <translation id="3665589677786828986">Chrome ha rilevato che alcune impostazioni sono state danneggiate da un altro programma e le ha ripristinate con i valori originali predefiniti.</translation> @@ -2967,7 +2977,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> condivide una finestra.</translation> <translation id="4364830672918311045">Mostrare notifiche</translation> <translation id="4366138410738374926">Stampa avviata</translation> -<translation id="437004882363131692">Ricevi suggerimenti, offerte e aggiornamenti per <ph name="DEVICE_TYPE" /> e condividi il tuo feedback. Puoi annullare l'iscrizione in qualsiasi momento.</translation> <translation id="4370425812909262207">Carrelli nascosti. Torneranno visibili quando apporterai delle modifiche.</translation> <translation id="4370975561335139969">L'indirizzo email e la password non corrispondono</translation> <translation id="4374831787438678295">Programma di installazione di Linux</translation> @@ -3544,6 +3553,7 @@ <translation id="5050330054928994520">Sintesi vocale</translation> <translation id="5051836348807686060">Il controllo ortografico non è supportato per le lingue selezionate</translation> <translation id="5052499409147950210">Modifica del sito</translation> +<translation id="5053962746715621840">Cerca l'immagine con Google Lens</translation> <translation id="5057110919553308744">Quando fai clic sull'estensione</translation> <translation id="5057403786441168405">Gestisci gli account a cui hai eseguito l'accesso. Siti web, app ed estensioni in Chrome e Google Play potrebbero utilizzare questi account per personalizzare la tua esperienza in base alle autorizzazioni. <ph name="LINK_BEGIN" />Ulteriori informazioni<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Limitare accesso</translation> @@ -4026,6 +4036,9 @@ <translation id="5610038042047936818">Passa a modalità Fotocamera</translation> <translation id="561030196642865721">I cookie di terze parti sono consentiti su questo sito</translation> <translation id="5612734644261457353">Spiacenti, la password non è stata ancora verificata. Nota. Se l'hai modificata di recente, la nuova password verrà applicata quando esci, quindi ti invitiamo a utilizzare la tua vecchia password qui.</translation> +<translation id="561308544008485315">Voice Match consente all'Assistente Google di identificare la tua voce sul tuo Chromebook e di distinguerla dalle altre. Per consumare meno batteria, il comando "Hey Google" è attivo soltanto quando il dispositivo è collegato a una fonte di alimentazione. Per apportare modifiche, vai alle Impostazioni. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Ricorda:<ph name="END_BOLD" /> anche qualcuno con una voce simile alla tua o in possesso di una registrazione della tua voce potrebbe essere in grado di accedere ai tuoi risultati personali. Puoi rimuovere l'autorizzazione di utilizzo di Voice Match in un secondo momento disattivando la funzionalità nelle Impostazioni dell'assistente.</translation> <translation id="5614190747811328134">Notifica all'utente</translation> <translation id="5614553682702429503">Salvare la password?</translation> <translation id="5616726534702877126">Riserva dimensioni</translation> @@ -5049,6 +5062,7 @@ <translation id="6824584962142919697">&Ispeziona elementi</translation> <translation id="6825184156888454064">Ordina per nome</translation> <translation id="6826872289184051766">Verifica tramite USB</translation> +<translation id="6827604573767207488">Sembra che tu abbia già configurato l'assistente personalizzato su un altro dispositivo. Ottieni ancora di più dall'assistente attivando la seguente impostazione.</translation> <translation id="6828153365543658583">Limita l'accesso ai seguenti utenti</translation> <translation id="6828182567531805778">Inserisci la tua passphrase per sincronizzare i dati</translation> <translation id="682871081149631693">Correzione rapida</translation> @@ -5483,6 +5497,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> ha disattivato il debug ADB. Dopo il riavvio del dispositivo <ph name="DEVICE_TYPE" /> non potrai installare app tramite sideload.</translation> <translation id="7328867076235380839">Combinazione non valida</translation> <translation id="7329154610228416156">Accesso non riuscito perché è stato configurato l'utilizzo di un URL non protetto (<ph name="BLOCKED_URL" />). Contatta l'amministratore.</translation> +<translation id="7329932885428707942">Potrebbe verificarsi una disconnessione temporanea della rete mobile.</translation> <translation id="7332053360324989309">Worker dedicato: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Attiva lente d'ingrandimento ancorata</translation> <translation id="7335974957018254119">Utilizza il controllo ortografico per</translation> @@ -5526,6 +5541,7 @@ <translation id="7374376573160927383">Gestisci i dispositivi USB</translation> <translation id="7375235221357833624">{0,plural, =1{Aggiorna il dispositivo entro un'ora}other{Aggiorna il dispositivo entro # ore}}</translation> <translation id="7376553024552204454">Evidenzia il puntatore del mouse durante lo spostamento</translation> +<translation id="737728204345822099">Sul tuo token di sicurezza potrebbe essere memorizzato un record della tua visita a questo sito.</translation> <translation id="7377451353532943397">Continua a impedire l'accesso ai sensori</translation> <translation id="7378611153938412599">Le password inefficaci sono facili da indovinare. Assicurati di creare password efficaci. <ph name="BEGIN_LINK" />Leggi altri suggerimenti per la sicurezza.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Apri Chrome Web Store</translation> @@ -6152,6 +6168,7 @@ <translation id="8059417245945632445">&Ispeziona dispositivi</translation> <translation id="8059456211585183827">Nessuna stampante disponibile da salvare.</translation> <translation id="8061091456562007989">Ripristina</translation> +<translation id="8061991877177392872">Sembra che tu abbia già configurato Voice Match con l'assistente su un altro dispositivo. Le registrazioni precedenti sono state usate per creare un modello vocale su questo dispositivo.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 foglio}other{{COUNT} fogli}}</translation> <translation id="8062879968880283306">Scansiona il codice QR con la fotocamera del dispositivo o inserisci il codice di attivazione fornito dall'operatore.</translation> <translation id="8063235345342641131">Avatar verde predefinito</translation> @@ -6420,6 +6437,7 @@ <translation id="8379991678458444070">Aggiungi questa scheda ai preferiti per ritrovarla rapidamente</translation> <translation id="8382913212082956454">Copia indirizzo &email</translation> <translation id="8386091599636877289">Norme non trovate.</translation> +<translation id="8386819192691131213">Consenti all'assistente di usare le informazioni visualizzate sullo schermo per fornire risposte rapide quali traduzioni, definizioni, conversioni di unità di misura e tanto altro</translation> <translation id="8386903983509584791">Scansione completata</translation> <translation id="8387361103813440603">Non possono accedere alla tua posizione</translation> <translation id="8389264703141926739">Blocca le notifiche</translation> @@ -6897,6 +6915,7 @@ <translation id="8915370057835397490">Caricamento suggerimento</translation> <translation id="8916476537757519021">Frame secondario modalità di navigazione in incognito: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> di <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Sposta lo schermo quando il puntatore del mouse ne tocca i bordi</translation> <translation id="8923880975836399332">Verde petrolio</translation> <translation id="8925458182817574960">&Impostazioni</translation> <translation id="8926389886865778422">Non visualizzare più questo avviso</translation> @@ -6974,6 +6993,7 @@ <translation id="9009708085379296446">Forse intendevi modificare la pagina?</translation> <translation id="9011163749350026987">Mostra sempre l'icona</translation> <translation id="9011393886518328654">Note di rilascio</translation> +<translation id="9012122671773859802">Sposta continuamente lo schermo quando il puntatore del mouse si muove</translation> <translation id="9013037634206938463">Sono necessari <ph name="INSTALL_SIZE" /> di spazio libero per installare Linux. Per aumentare lo spazio disponibile, elimina i file dal dispositivo.</translation> <translation id="9013707997379828817">L'amministratore ha eseguito il rollback di questo dispositivo. Salva i file importanti e riavvia. Tutti i dati presenti sul dispositivo verranno eliminati.</translation> <translation id="901668144954885282">Backup su Google Drive</translation> @@ -7018,6 +7038,7 @@ <translation id="9052404922357793350">Continua a bloccare</translation> <translation id="9053563360605707198">Stampa su entrambe le facciate</translation> <translation id="9053893665344928494">Memorizza la mia scelta</translation> +<translation id="9055278955535611574">Accedi all'assistente con il comando "Hey Google"</translation> <translation id="9055636786322918818">Applica la crittografia RC4. Se scegli di utilizzare quest'opzione vai incontro a un rischio maggiore, in quanto le crittografie RC4 non sono sicure.</translation> <translation id="9056810968620647706">Nessuna corrispondenza trovata.</translation> <translation id="9057354806206861646">Aggiorna programmazione</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index eeba8b3..4eb53fdd 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -2968,7 +2968,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> משתף חלון.</translation> <translation id="4364830672918311045">הצגת הודעות</translation> <translation id="4366138410738374926">ההדפסה החלה</translation> -<translation id="437004882363131692">אפשר לקבל טיפים, מידע על מבצעים ועדכונים בנוגע ל-<ph name="DEVICE_TYPE" /> ולשתף משוב. בכל שלב ניתן לבטל את ההרשמה.</translation> <translation id="4370425812909262207">עגלות הקניות הוסתרו. הן יופיעו מחדש לאחר ביצוע שינויים.</translation> <translation id="4370975561335139969">כתובת האימייל והסיסמה שהזנת אינן תואמות</translation> <translation id="4374831787438678295">מנהל ההתקנה של Linux</translation> @@ -5527,6 +5526,7 @@ <translation id="7374376573160927383">ניהול התקני USB</translation> <translation id="7375235221357833624">{0,plural, =1{יש לעדכן את המכשיר בתוך שעה אחת}two{יש לעדכן את המכשיר בתוך # שעות}many{יש לעדכן את המכשיר בתוך # שעות}other{יש לעדכן את המכשיר בתוך # שעות}}</translation> <translation id="7376553024552204454">הדגשת סמן העכבר כשהסמן בתנועה</translation> +<translation id="737728204345822099">ייתכן שתיעוד של ביקורך באתר יישמר במפתח האבטחה שלך.</translation> <translation id="7377451353532943397">המשך חסימת הגישה לחיישנים</translation> <translation id="7378611153938412599">קל לנחש סיסמאות חלשות. חשוב להגדיר סיסמאות חזקות. <ph name="BEGIN_LINK" />לטיפים נוספים לגבי אבטחה.<ph name="END_LINK" /></translation> <translation id="73786666777299047">פתיחת חנות האינטרנט של Chrome</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 548bc82..547db3f 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -2968,7 +2968,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> がウィンドウを共有しています。</translation> <translation id="4364830672918311045">通知を表示</translation> <translation id="4366138410738374926">印刷を開始しました</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> のご利用のヒント、特典、最新情報を受け取って、フィードバックをお送りいただけます。登録はいつでも解除できます。</translation> <translation id="4370425812909262207">カートを非表示にしました。今後変更を行った場合は再表示されます。</translation> <translation id="4370975561335139969">入力したメールアドレスとパスワードが一致しません</translation> <translation id="4374831787438678295">Linux インストーラ</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index a3d6922..09178b3 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">წვდომა თქვენს Bluetooth და სერიულ მოწყობილობებზე</translation> <translation id="114036956334641753">აუდიო და ტიტრები</translation> <translation id="1140746652461896221">კონტენტის დაბლოკვა თქვენ მიერ მონახულებულ ნებისმიერ გვერდზე</translation> +<translation id="1141953877381847186">მიეცით საშუალება თქვენს ასისტენტს, გამოიყენოს თქვენს ეკრანზე არსებული ინფორმაცია, რომ მოგაწოდოთ ისეთი სწრაფი პასუხები, როგორიცაა თარგმანი, განმარტება, საზომი ერთეულების გადაყვანა და სხვა. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />გაითვალისწინეთ:<ph name="END_BOLD" /> აღნიშნულის მოგვიანებით შეცვლა შესაძლებელი იქნება აქ: Google ასისტენტის პარამეტრები > დაკავშირებული ინფორმაცია.</translation> <translation id="1143142264369994168">სერტიფიკატის ხელმომწერი</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome-მა თქვენს კომპიუტერში საზიანო პროგრამული უზრუნველყოფა ვერ აღმოაჩინა • შემოწმდა 1 წუთის წინ}other{Chrome-მა თქვენს კომპიუტერში საზიანო პროგრამული უზრუნველყოფა ვერ აღმოაჩინა • შემოწმდა {NUM_MINS} წუთის წინ}}</translation> <translation id="1145593918056169051">პრინტერმა შეწყვიტა მუშაობა</translation> @@ -1435,7 +1438,9 @@ <translation id="2594999711683503743">მოიძიეთ Google-ში, ან აკრიფეთ URL</translation> <translation id="2602501489742255173">დასაწყებად გადაფურცლეთ ზემოთ</translation> <translation id="2603115962224169880">კომპიუტერის გასუფთავება</translation> +<translation id="2603355571917519942">Voice Match მზადაა</translation> <translation id="2603463522847370204">გახსნა &ინკოგნიტო ფანჯარაში</translation> +<translation id="2604138917550693049">სურათის ძიება Google Lens-ით</translation> <translation id="2604255671529671813">ქსელთან კავშირის შეცდომა</translation> <translation id="2606246518223360146">მონაცემების მიბმა</translation> <translation id="2606454609872547359">არა, მსურს ChromeVox-ის გარეშე გაგრძელება</translation> @@ -1778,6 +1783,7 @@ <translation id="2963151496262057773">შემდეგი დანამატი არ პასუხობს: <ph name="PLUGIN_NAME" />გსურთ მისი შეჩერება?</translation> <translation id="2964193600955408481">გამორთე Wi-Fi</translation> <translation id="2964245677645334031">მახლობლად გაზიარების ხილვადობა</translation> +<translation id="2966216232069818096">მიეცით საშუალება თქვენს ასისტენტს, დაგეხმაროთ თქვენს ეკრანზე არსებული ინფორმაციის მეშვეობით</translation> <translation id="2966937470348689686">Android პარამეტრების მართვა</translation> <translation id="2972581237482394796">&გამეორება</translation> <translation id="2973324205039581528">საიტის დადუმება</translation> @@ -1874,6 +1880,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">ეს ჩანართი იყენებს თქვენს კამერაა ან მიკროფონს.</translation> <translation id="3083193146044397360">დროებით დაიბლოკა თქვენი უსაფრთხოებისთვის</translation> +<translation id="3083899879156272923">ეკრანის გადაადგილება მაუსის შენარჩუნებით ეკრანის ცენტში</translation> <translation id="3084548735795614657">დააგდეთ ინსტალაციისთვის</translation> <translation id="3084771660770137092">შესაძლოა Chrome-ისთვის არასაკმარისი მეხსიერებაა ან ვებგვერდისთვის გაშვებული პროცესი შეწყდა სხვა მიზეზის გამო. გასაგრძელებლად, ხელახლა ჩატვირთეთ ან გადადით სხვა გვერდზე.</translation> <translation id="3084958266922136097">ეკრანმზოგის გათიშვა</translation> @@ -2369,6 +2376,9 @@ <translation id="3654045516529121250">თქვენი სპეციალური შესაძლებლობების პარამეტრების წაკითხვა</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{აქვს მუდმივი წვდომა ერთ ფაილზე.}other{აქვს მუდმივი წვდომა # ფაილზე.}}</translation> <translation id="3658871634334445293">TrackPoint-ის აჩქარება</translation> +<translation id="3659830472545192450">Voice Match ეხმარება თქვენს Google ასისტენტს, ამოიცნოს თქვენი ხმა თქვენს Chromebook-ზე და სხვებისგან გაგარჩიოთ. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />გაითვალისწინეთ:<ph name="END_BOLD" /> თქვენს პერსონალურ შედეგებზე წვდომა, შესაძლოა, მოახერხოს ნებისმიერმა, ვისაც ექნება თქვენი მსგავსი ხმა ან მისი ჩანაწერი ექნება. Voice Match-ის ნებართვის მოგვიანებით გაუქმება შეგიძლიათ ასისტენტის პარამეტრებიდან მისი გამორთვის მეშვეობით.</translation> <translation id="3660234220361471169">არასანდო</translation> <translation id="3664511988987167893">გაფართოების ხატულა</translation> <translation id="3665589677786828986">Chrome-მა აღმოაჩინა, რომ თქვენი ბრაუზერის ზოგიერთი პარამეტრი დაზიანდა სხვა პროგრამის მიერ და აღდგენილ იქნა ორიგინალი ნაგულისხმევი პარამეტრები.</translation> @@ -2977,7 +2987,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> ფანჯარას აზიარებს.</translation> <translation id="4364830672918311045">შეტყობინებების ჩვენება</translation> <translation id="4366138410738374926">ბეჭდვა დაიწყო</translation> -<translation id="437004882363131692">მიიღეთ <ph name="DEVICE_TYPE" />-თან დაკავშირებული რჩევები, შემოთავაზებები თუ განახლებები და გაგვიზიარეთ გამოხმაურება. გამოწერის გაუქმება ნებისმიერ დროს შეგიძლიათ.</translation> <translation id="4370425812909262207">კალათები დამალულია. ისინი გამოჩნდება, როცა ცვლილებებს შეიტანთ.</translation> <translation id="4370975561335139969">თქვენ მიერ შეყვანილი ელფოსტა და პაროლი არ ემთხვევა</translation> <translation id="4374831787438678295">Linux ინსტალატორი</translation> @@ -3557,6 +3566,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">მართლწერის შემოწმება მხარდაუჭერელია თქვენ მიერ არჩეული ენებისთვის</translation> <translation id="5052499409147950210">საიტის რედაქტირება</translation> +<translation id="5053962746715621840">სურათის ძიება Google Lens-ით</translation> <translation id="5057110919553308744">გაფართოებაზე დაწკაპუნებისას</translation> <translation id="5057403786441168405">მართეთ თქვენი სისტემაში შესული ანგარიშები. მინიჭებული ნებართვების მიხედვით, Chrome-სა და Google Play-ში არსებულმა ვებსაიტებმა, აპებმა თუ გაფართოებებმა შეიძლება გამოიყენოს აღნიშნული ანგარიშები სერვისებით სარგებლობის პროცესის თქვენზე მოსარგებად. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="5059241099014281248">შესვლის შეზღუდვა</translation> @@ -4040,6 +4050,9 @@ <translation id="5610038042047936818">კამერის რეჟიმზე გადართვა</translation> <translation id="561030196642865721">ამ საიტზე დაშვებულია მესამე მხარის ქუქი-ჩანაწერები</translation> <translation id="5612734644261457353">სამწუხაროდ, თქვენი პაროლის გადამოწმება ვერ მოხერხდა. შენიშვნა: თუ ახლახან შეცვალეთ პაროლი, გამოყენებული იქნება ახალი პაროლი, როგორც კი გამოხვალთ სისტემიდან. გთხოვთ, გამოიყენოთ ძველი პაროლი აქ.</translation> +<translation id="561308544008485315">Voice Match ეხმარება თქვენს Google ასისტენტს, ამოიცნოს თქვენი ხმა თქვენს Chromebook-ზე და სხვებისგან გაგარჩიოთ. ბატარეის დაზოგვის მიზნით, „Ok Google“ ჩართული იქნება მხოლოდ მაშინ, როცა თქვენი მოწყობილობა დაკავშირებული იქნება ელკვების წყაროსთან. შესაცვლელად გადადით პარამეტრებზე. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />გაითვალისწინეთ:<ph name="END_BOLD" /> თქვენს პერსონალურ შედეგებზე წვდომა, შესაძლოა, მოახერხოს ნებისმიერმა, ვისაც ექნება თქვენი მსგავსი ხმა ან მისი ჩანაწერი ექნება. Voice Match-ის ნებართვის მოგვიანებით გაუქმება შეგიძლიათ ასისტენტის პარამეტრებიდან მისი გამორთვის მეშვეობით.</translation> <translation id="5614190747811328134">მომხმარებლის შეტყობინება</translation> <translation id="5614553682702429503">გსურთ პაროლის შენახვა?</translation> <translation id="5616726534702877126">ზომის დარეზერვება</translation> @@ -5070,6 +5083,7 @@ <translation id="6824584962142919697">ელემენტების შ&ემოწმება</translation> <translation id="6825184156888454064">დალაგება სახელის მიხედვით</translation> <translation id="6826872289184051766">USB-ის მეშვეობით დადასტურება</translation> +<translation id="6827604573767207488">როგორც ჩანს, პერსონალიზებული ასისტენტი სხვა მოწყობილობაზე უკვე დააყენეთ. ჩართეთ მითითებული პარამეტრი, რომ ასისტენტის მეტი შესაძლებლობა გამოიყენოთ.</translation> <translation id="6828153365543658583">შეეზღუდოს შესვლა შემდეგ მომხმარებლებს:</translation> <translation id="6828182567531805778">თქვენი მონაცემების სინქრონიზაციისთვის შეიყვანეთ თქვენი საიდუმლო ფრაზა</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5505,6 +5519,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" />-მა გაითიშა ADB გამართვა. <ph name="DEVICE_TYPE" />-ის გადატვირთვის შემდეგ აპების გარეშე წყაროდან ჩატვირთვას ვეღარ მოახერხებთ.</translation> <translation id="7328867076235380839">კომბინაცია არასწორია</translation> <translation id="7329154610228416156">შესვლა ვერ მოხერხდა, რადგან იგი არაუსაფრთხო URL-ის (<ph name="BLOCKED_URL" />) მეშვეობით დაკონფიგურირდა. გთხოვთ, დაუკავშირდეთ ადმინისტრატორს.</translation> +<translation id="7329932885428707942">ამან, შესაძლოა, ფიჭურ ქსელთან კავშირის დროებით გაწვეტა გამოიწვიოს.</translation> <translation id="7332053360324989309">Dedicated Worker: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">ჩამაგრებული ლუპის ჩართვა</translation> <translation id="7335974957018254119">მართლწერის შემოწმების გამოყენება შემდეგისთვის:</translation> @@ -5548,6 +5563,7 @@ <translation id="7374376573160927383">USB-მოწყობილობების მართვა</translation> <translation id="7375235221357833624">{0,plural, =1{განაახლეთ მოწყობილობა 1 საათის განმავლობაში}other{განაახლეთ მოწყობილობა # საათის განმავლობაში}}</translation> <translation id="7376553024552204454">მოძრაობისას მაუსის კურსორის გამოყოფა</translation> +<translation id="737728204345822099">შესაძლოა, თქვენს უსაფრთხოების გასაღებზე ჩაიწეროს ამ საიტზე ვიზიტი.</translation> <translation id="7377451353532943397">სენსორებზე წვდომის აკრძალვის გაგრძელება</translation> <translation id="7378611153938412599">სუსტი პაროლები ადვილი გამოსაცნობია, ამიტომ პაროლის შექმნისას ძლიერი ვარიანტები უნდა მოიფიქროთ. <ph name="BEGIN_LINK" />გაეცანით უსაფრთხოებასთან დაკავშირებულ სხვა რჩევებს.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome Web Store-ის გახსნა</translation> @@ -6174,6 +6190,7 @@ <translation id="8059417245945632445">მოწყობილობების შ&ემოწმება</translation> <translation id="8059456211585183827">შესანახი პრინტერები არ არის.</translation> <translation id="8061091456562007989">ცვლილების დაბრუნება</translation> +<translation id="8061991877177392872">როგორც ჩანს, სხვა მოწყობილობაზე Google ასისტენტით უკვე დააყენეთ Voice Match. ძველი ჩანაწერები გამოყენებული იქნება ამ მოწყობილობაზე ხმის მოდელის შესაქმნელად.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{ქაღალდის 1 ფურცელი}other{ქაღალდის {COUNT} ფურცელი}}</translation> <translation id="8062879968880283306">დაასკანირეთ QR კოდი მოწყობილობის კამერის მეშვეობით, ან შეიყვანეთ თქვენი ოპერატორის მიერ მოწოდებული აქტივაციის კოდი.</translation> <translation id="8063235345342641131">ნაგულისხმევი მწვანე ავატარი</translation> @@ -6444,6 +6461,7 @@ <translation id="8379991678458444070">დაბრუნდით აქ უფრო სწრაფად — დაამატეთ ეს ჩანართი სანიშნეებს</translation> <translation id="8382913212082956454">&ელფოსტის მისამართის დაკოპირება</translation> <translation id="8386091599636877289">წესი ვერ მოიძებნა.</translation> +<translation id="8386819192691131213">მიეცით საშუალება თქვენს ასისტენტს, გამოიყენოს თქვენს ეკრანზე არსებული ინფორმაცია, რომ მოგაწოდოთ ისეთი სწრაფი პასუხები, როგორიცაა თარგმანი, განმარტება, საზომი ერთეულების გადაყვანა და სხვა</translation> <translation id="8386903983509584791">სკანირება დასრულდა</translation> <translation id="8387361103813440603">თქვენი მდებარეობის ნახვა დაუშვებელია</translation> <translation id="8389264703141926739">შეტყობინებების დაბლოკვა</translation> @@ -6926,6 +6944,7 @@ <translation id="8915370057835397490">შემოთავაზების ჩატვირთვა</translation> <translation id="8916476537757519021">ანონიმური ქვეჩარჩო: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />-ის <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">ეკრანის გადაადგილება, როცა მაუსი ეკრანის კიდეებს ეხება</translation> <translation id="8923880975836399332">მუქი ფირუზისფერი</translation> <translation id="8925458182817574960">&პარამეტრები</translation> <translation id="8926389886865778422">აღარ მკითხო</translation> @@ -7004,6 +7023,7 @@ <translation id="9009708085379296446">ამ გვერდის შეცვლა გსურდათ?</translation> <translation id="9011163749350026987">ხატულის ყოველთვის ჩვენება</translation> <translation id="9011393886518328654">გამოცემის შესახებ შეტყობინება</translation> +<translation id="9012122671773859802">ეკრანის უწყვეტად გადაადგილება მაუსის მოძრაობის პარალელურად</translation> <translation id="9013037634206938463">Linux-ის ინსტალაციისთვის საჭიროა მინიმუმ <ph name="INSTALL_SIZE" />. მეხსიერების გათავისუფლება შეგიძლიათ მოწყობილობიდან ფაილების წაშლით.</translation> <translation id="9013707997379828817">თქვენმა ადმინისტრატორმა დააბრუნა ეს მოწყობილობა ძველ ვერსიაზე. გთხოვთ, შეინახოთ მნიშვნელოვანი ფაილები, შემდეგ კი გადატვირთოთ მოწყობილობა. მასზე არსებული ყველა მონაცემი წაიშლება.</translation> <translation id="901668144954885282">სარეზერვო კოპირება Google Drive-ზე</translation> @@ -7048,6 +7068,7 @@ <translation id="9052404922357793350">დაბლოკვის გაგრძელება</translation> <translation id="9053563360605707198">ორივე მხარეს ბეჭდვა</translation> <translation id="9053893665344928494">ჩემი არჩევანის დამახსოვრება</translation> +<translation id="9055278955535611574">იქონიეთ წვდომა თქვენს ასისტენტზე „Ok Google“-ის მეშვეობით</translation> <translation id="9055636786322918818">RC4 დაშიფვრის იძულებით გააქტიურება. ამ ვარიანტის გამოყენება ზრდის საფრთხის წინაშე რისკს, ვინაიდან RC4 შიფრატორები დაუცველია.</translation> <translation id="9056810968620647706">შედეგები ვერ მოიძებნა.</translation> <translation id="9057354806206861646">განახლების განრიგი</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 8f59a1f..c62e35b 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1797,7 +1797,7 @@ <translation id="3003144360685731741">Таңдаулы желілер</translation> <translation id="3003189754374775221"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, сигнал күші: <ph name="SIGNAL_STRENGTH" />%, қосылу</translation> <translation id="3003623123441819449">CSS кэші</translation> -<translation id="3003828226041301643">Құрылғыны доменге қосу мүмкін емес. Есептік жазба мәліметтерін қарап, құрылғы енгізуге құқығыңыз бар ма екенін тексеріңіз.</translation> +<translation id="3003828226041301643">Құрылғыны доменге қосу мүмкін емес. Есептік жазба мәліметтерін қарап, құрылғы енгізуге құқығыңыз бар-жоғын тексеріңіз.</translation> <translation id="3003967365858406397"><ph name="PHONE_NAME" /> жеке Wi-Fi байланысын орнатады.</translation> <translation id="3004391367407090544">Кейінірек қайта оралыңыз</translation> <translation id="3006881078666935414">Пайдалану деректері жоқ</translation> @@ -2965,7 +2965,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> терезені бөлісуде.</translation> <translation id="4364830672918311045">Дисплей хабарландырулары</translation> <translation id="4366138410738374926">Басып шығару басталды</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> құрылғысына қатысты кеңестерді, ұсыныстарды және жаңалықтарды алыңыз және пікірлер қалдырыңыз. Кез келген уақытта жазылымнан бас тарта аласыз.</translation> <translation id="4370425812909262207">Себеттер жасырылды. Сіз өзгеріс енгізгенде, олар қайта пайда болады.</translation> <translation id="4370975561335139969">Сіз енгізген электрондық пошта және құпия сөз сәйкес емес</translation> <translation id="4374831787438678295">Linux орнату құралы</translation> @@ -6248,7 +6247,7 @@ <translation id="8177318697334260664">{NUM_TABS,plural, =1{Қойындыны жаңа терезеден ашу}other{Қойындыларды жаңа терезеден ашу}}</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8180786512391440389">"<ph name="EXTENSION" />" белгіленген орындарда кескіндерді, бейнені және дыбыстық файлдарды оқи және жоя алады.</translation> -<translation id="8181215761849004992">Доменге қосылу мүмкін емес. Есептік жазба мәліметтерін қарап, құрылғы енгізуге құқығыңыз бар ма екенін тексеріңіз.</translation> +<translation id="8181215761849004992">Доменге қосылу мүмкін емес. Есептік жазба мәліметтерін қарап, құрылғы енгізуге құқығыңыз бар-жоғын тексеріңіз.</translation> <translation id="8182105986296479640">Қолданба жауап бермейді.</translation> <translation id="8182412589359523143">Осы <ph name="DEVICE_TYPE" /> құрылғысындағы барлық деректі жою үшін <ph name="BEGIN_LINK" />осы жерді түртіңіз<ph name="END_LINK" />.</translation> <translation id="8182664696082410784"><ph name="REASON" />
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 8f6df204..2e0f00b 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -2978,7 +2978,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> កំពុងចែករំលែកផ្ទាំងវិនដូ</translation> <translation id="4364830672918311045">បង្ហាញការជូនដំណឹង</translation> <translation id="4366138410738374926">បានចាប់ផ្ដើមបោះពុម្ព</translation> -<translation id="437004882363131692">ទទួលបានគន្លឹះ ការផ្ដល់ជូន និងព័ត៌មានថ្មីៗសម្រាប់ <ph name="DEVICE_TYPE" /> និងចែករំលែកមតិកែលម្អ។ ឈប់ជាវបានគ្រប់ពេល។</translation> <translation id="4370425812909262207">បានលាក់រទេះ។ រទេះទាំងនេះនឹងបង្ហាញ នៅពេលអ្នកធ្វើការផ្លាស់ប្ដូរ។</translation> <translation id="4370975561335139969">អ៊ីមែល និងពាក្យសម្ងាត់ដែលអ្នកបញ្ចូលមិនត្រូវគ្នាទេ</translation> <translation id="4374831787438678295">កម្មវិធីដំឡើង Linux</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 25a9e42..ef13b51 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">ನಿಮ್ಮ ಬ್ಲೂಟೂತ್ ಮತ್ತು ಸರಣಿ ಸಾಧನಗಳನ್ನು ಪ್ರವೇಶಿಸಿ</translation> <translation id="114036956334641753">ಆಡಿಯೋ ಮತ್ತು ಶೀರ್ಷಿಕೆಗಳು</translation> <translation id="1140746652461896221">ನೀವು ಭೇಟಿ ನೀಡುವ ಯಾವುದೇ ಪುಟದಲ್ಲಿನ ವಿಷಯವನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation> +<translation id="1141953877381847186">ಅನುವಾದ, ವ್ಯಾಖ್ಯಾನ, ಯೂನಿಟ್ ಪರಿವರ್ತನೆ ಮತ್ತು ಇನ್ನಷ್ಟವುಗಳಂತಹ ತ್ವರಿತ ಉತ್ತರಗಳನ್ನು ಒದಗಿಸುವುದಕ್ಕಾಗಿ ಪರದೆಯ ಮೇಲೆ ಮಾಹಿತಿಯನ್ನು ಬಳಸಲು Assistant ಅನುಮತಿಸಿ. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ನೆನಪಿನಲ್ಲಿಡಿ:<ph name="END_BOLD" /> ನೀವು ಇದನ್ನು ನಂತರ Google Assistant ಸೆಟ್ಟಿಂಗ್ಗಳು> ಸಂಬಂಧಿತ ಮಾಹಿತಿಯಲ್ಲಿ ಯಾವಾಗಲೂ ಬದಲಾಯಿಸಬಹುದು.</translation> <translation id="1143142264369994168">ಪ್ರಮಾಣಪತ್ರ ಸಹಿ ಮಾಡುವವರು</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ಹಾನಿಕಾರಕ ಸಾಫ್ಟ್ವೇರ್ ಅನ್ನು Chrome ಪತ್ತೆ ಮಾಡಿಲ್ಲ • 1 ನಿಮಿಷದ ಹಿಂದೆ ಪರಿಶೀಲಿಸಲಾಗಿದೆ}one{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ಹಾನಿಕಾರಕ ಸಾಫ್ಟ್ವೇರ್ ಅನ್ನು Chrome ಪತ್ತೆ ಮಾಡಿಲ್ಲ • {NUM_MINS} ನಿಮಿಷಗಳ ಹಿಂದೆ ಪರಿಶೀಲಿಸಲಾಗಿದೆ}other{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ಹಾನಿಕಾರಕ ಸಾಫ್ಟ್ವೇರ್ ಅನ್ನು Chrome ಪತ್ತೆ ಮಾಡಿಲ್ಲ • {NUM_MINS} ನಿಮಿಷಗಳ ಹಿಂದೆ ಪರಿಶೀಲಿಸಲಾಗಿದೆ}}</translation> <translation id="1145593918056169051">ಪ್ರಿಂಟರ್ ನಿಂತುಹೋಗಿದೆ</translation> @@ -1437,7 +1440,9 @@ <translation id="2594999711683503743">Google ನಲ್ಲಿ ಹುಡುಕಿ ಅಥವಾ URL ಟೈಪ್ ಮಾಡಿ</translation> <translation id="2602501489742255173">ಪ್ರಾರಂಭಿಸಲು ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ</translation> <translation id="2603115962224169880">ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಿ</translation> +<translation id="2603355571917519942">Voice Match ಸಿದ್ಧವಾಗಿದೆ</translation> <translation id="2603463522847370204">&ಅಜ್ಞಾತ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಿರಿ</translation> +<translation id="2604138917550693049">Google Lens ಬಳಸಿಕೊಂಡು ಚಿತ್ರವನ್ನು ಹುಡುಕಿ</translation> <translation id="2604255671529671813">ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕ ದೋಷ</translation> <translation id="2606246518223360146">ಡೇಟಾ ಲಿಂಕ್ ಮಾಡಿ</translation> <translation id="2606454609872547359">ಇಲ್ಲ, ChromeVox ಇಲ್ಲದೆಯೇ ಮುಂದುವರಿಸಿ</translation> @@ -1780,6 +1785,7 @@ <translation id="2963151496262057773">ಕೆಳಗಿನ ಪ್ಲಗ್-ಇನ್ ಪ್ರತಿಕ್ರಿಯಿಸದಂತದ್ದು: <ph name="PLUGIN_NAME" />ನೀವು ಇದನ್ನು ನಿಲ್ಲಿಸಲು ಬಯಸುವಿರಾ?</translation> <translation id="2964193600955408481">ವೈ-ಫೈ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="2964245677645334031">Nearby ಶೇರ್ ಗೋಚರತೆ</translation> +<translation id="2966216232069818096">ನಿಮಗೆ ಸಹಾಯ ಮಾಡುವುದಕ್ಕಾಗಿ ಪರದೆಯ ಮೇಲಿರುವ ಮಾಹಿತಿಯನ್ನು ಬಳಸಲು Assistant ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡಿ</translation> <translation id="2966937470348689686">Android ಪ್ರಾಶಸ್ತ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="2972581237482394796">&ಮತ್ತೆಮಾಡು</translation> <translation id="2973324205039581528">ಸೈಟ್ ಅನ್ನು ಮ್ಯೂಟ್ ಮಾಡಿ</translation> @@ -1876,6 +1882,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">ಈ ಟ್ಯಾಬ್ ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಅಥವಾ ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ಬಳಸುತ್ತಿದೆ.</translation> <translation id="3083193146044397360">ನಿಮ್ಮ ಸುರಕ್ಷತೆಯನ್ನು ಸಂರಕ್ಷಿಸಲು ತಾತ್ಕಾಲಿಕವಾಗಿ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> +<translation id="3083899879156272923">ಪರದೆಯಲ್ಲಿ ಮೌಸ್ ಅನ್ನು ಮಧ್ಯದಲ್ಲಿ ಇರಿಸುತ್ತಾ ಪರದೆಯನ್ನು ಸರಿಸಿ</translation> <translation id="3084548735795614657">ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಡ್ರಾಪ್ ಮಾಡಿ</translation> <translation id="3084771660770137092">Chrome ಮೆಮೊರಿ ಖಾಲಿಯಾಗಿದೆ ಇಲ್ಲವೇ ಇತರೆ ಕಾರಣಗಳಿಗಾಗಿ ವೆಬ್ಪುಟದ ಪ್ರಕ್ರಿಯೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಯಲು, ಮರುಲೋಡ್ ಮಾಡಿ ಅಥವಾ ಮತ್ತೊಂದು ಪುಟಕ್ಕೆ ಹೋಗಿ.</translation> <translation id="3084958266922136097">ಸ್ಕ್ರೀನ್ ಸೇವರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> @@ -2371,6 +2378,9 @@ <translation id="3654045516529121250">ನಿಮ್ಮ ಪ್ರವೇಶಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಓದಿಕೊಳ್ಳಿ</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ಇದು ಒಂದು ಫೈಲ್ಗೆ ಶಾಶ್ವತ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿದೆ.}one{ಇದು # ಫೈಲ್ಗಳಿಗೆ ಶಾಶ್ವತ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿದೆ.}other{ಇದು # ಫೈಲ್ಗಳಿಗೆ ಶಾಶ್ವತ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿದೆ.}}</translation> <translation id="3658871634334445293">TrackPoint ವೇಗವರ್ಧಕ</translation> +<translation id="3659830472545192450">ನಿಮ್ಮ Chromebook ನಲ್ಲಿ ನಿಮ್ಮ ಧ್ವನಿಯನ್ನು ಗುರುತಿಸಲು ಮತ್ತು ಇತರರಿಂದ ಹೊರತುಪಡಿಸಿ ಹೇಳಲು ನಿಮ್ಮ Google Assistant ಗೆ Voice Match ಸಹಾಯ ಮಾಡುತ್ತದೆ. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ನೆನಪಿನಲ್ಲಿಡಿ:<ph name="END_BOLD" /> ಒಂದೇ ರೀತಿಯ ಧ್ವನಿ ಅಥವಾ ರೆಕಾರ್ಡಿಂಗ್ನಿಂದಾಗಿ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಫಲಿತಾಂಶಗಳನ್ನು ಸಹ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗಬಹುದು. Assistant ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ, Voice Match ಅನುಮತಿಯನ್ನು ಆಫ್ ಮಾಡುವ ಮೂಲಕ ನೀವು ನಂತರದಲ್ಲಿ ಅದನ್ನು ತೆಗೆದುಹಾಕಬಹುದು.</translation> <translation id="3660234220361471169">ವಿಶ್ವಾಸಾರ್ಹವಿಲ್ಲದ</translation> <translation id="3664511988987167893">ವಿಸ್ತರಣೆ ಐಕಾನ್</translation> <translation id="3665589677786828986">ನಿಮ್ಮ ಕೆಲವು ಸೆಟ್ಟಿಂಗ್ಗಳು ಬೇರೊಂದು ಪ್ರೋಗ್ರಾಂನಿಂದಾಗಿ ಹಾನಿಗೊಳಗಾಗಿರುವುದು Chrome ಗಮನಕ್ಕೆ ಬಂದಿದೆ ಮತ್ತು ಅವುಗಳ ಮೂಲ ಡೀಫಾಲ್ಟ್ಗಳಿಗೆ ಅವುಗಳನ್ನು ಮರುಹೊಂದಿಸಿದೆ.</translation> @@ -2979,7 +2989,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> ವಿಂಡೋವನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation> <translation id="4364830672918311045">ಅಧಿಸೂಚನೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಿ</translation> <translation id="4366138410738374926">ಪ್ರಿಂಟಿಂಗ್ ಪ್ರಾರಂಭವಾಗಿದೆ</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> ಕುರಿತು ಸಲಹೆಗಳು, ಆಫರ್ಗಳು ಹಾಗೂ ಅಪ್ಡೇಟ್ಗಳನ್ನು ಪಡೆಯಿರಿ ಮತ್ತು ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಹಂಚಿಕೊಳ್ಳಿ ಯಾವಾಗ ಬೇಕಾದರೂ ಅನ್ಸಬ್ಸ್ಕ್ರೈಬ್ ಮಾಡಿ.</translation> <translation id="4370425812909262207">ಕಾರ್ಟ್ಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ. ನೀವು ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಿದಾಗ ಅವುಗಳು ಪುನಃ ಗೋಚರಿಸುತ್ತವೆ.</translation> <translation id="4370975561335139969">ನೀವು ನಮೂದಿಸಿದ ಇಮೇಲ್ ಮತ್ತು ಪಾಸ್ವರ್ಡ್ ಹೊಂದಿಕೆಯಾಗುತ್ತಿಲ್ಲ</translation> <translation id="4374831787438678295">Linux ಇನ್ಸ್ಟಾಲರ್</translation> @@ -3560,6 +3569,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">ನೀವು ಆಯ್ಕೆ ಮಾಡಿರುವ ಭಾಷೆಗಳಲ್ಲಿ ಕಾಗುಣಿತ ಪರೀಕ್ಷೆಯು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ</translation> <translation id="5052499409147950210">ಸೈಟ್ ಎಡಿಟ್ ಮಾಡಿ</translation> +<translation id="5053962746715621840">Google Lens ಬಳಸಿಕೊಂಡು ಚಿತ್ರವನ್ನು ಹುಡುಕಿ</translation> <translation id="5057110919553308744">ನೀವು ವಿಸ್ತರಣೆಯನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ</translation> <translation id="5057403786441168405">ನಿಮ್ಮ ಸೈನ್ ಇನ್ ಮಾಡಿದ ಖಾತೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ. Chrome ಮತ್ತು Google Play ನಲ್ಲಿನ ವೆಬ್ಸೈಟ್ಗಳು, ಆ್ಯಪ್ಗಳು ಮತ್ತು ವಿಸ್ತರಣೆಗಳ ಅನುಮತಿಗಳನ್ನು ಆಧರಿಸಿ, ನಿಮ್ಮ ಅನುಭವವನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಈ ಖಾತೆಗಳನ್ನು ಬಳಸಬಹುದು. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="5059241099014281248">ಸೈನ್-ಇನ್ ನಿಂರ್ಬಂಧಿಸಿ</translation> @@ -4044,6 +4054,9 @@ <translation id="5610038042047936818">ಕ್ಯಾಮರಾ ಮೋಡ್ಗೆ ಬದಲಾಯಿಸಿ</translation> <translation id="561030196642865721">ಈ ಸೈಟ್ನಲ್ಲಿ ಥರ್ಡ್ ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="5612734644261457353">ಕ್ಷಮಿಸಿ, ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಇನ್ನೂ ಪರಿಶೀಲಿಸಲಾಗಲಿಲ್ಲ. ಗಮನಿಸಿ: ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನೀವು ಇತ್ತೀಚೆಗೆ ಬದಲಾಯಿಸಿದ್ದರೆ, ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡಿದ ನಂತರ ನಿಮ್ಮ ಹೊಸ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಜಾರಿಗೆ ತರಲಾಗುತ್ತದೆ, ದಯವಿಟ್ಟು ಇಲ್ಲಿ ಹಳೆಯ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ.</translation> +<translation id="561308544008485315">ನಿಮ್ಮ Chromebook ನಲ್ಲಿ ನಿಮ್ಮ ಧ್ವನಿಯನ್ನು ಗುರುತಿಸಲು ಮತ್ತು ಇತರರಿಂದ ಹೊರತುಪಡಿಸಿ ಹೇಳಲು ನಿಮ್ಮ Google Assistant ಗೆ Voice Match ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಬ್ಯಾಟರಿಯನ್ನು ಉಳಿಸಲು, ನಿಮ್ಮ ಸಾಧನವನ್ನು ವಿದ್ಯುತ್ ಮೂಲಕ್ಕೆ ಕನೆಕ್ಟ್ ಮಾಡಿದಾಗ ಮಾತ್ರ "Ok Google" ಆನ್ ಆಗುತ್ತದೆ. ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲು, ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ನೆನಪಿನಲ್ಲಿಡಿ:<ph name="END_BOLD" /> ಒಂದೇ ರೀತಿಯ ಧ್ವನಿ ಅಥವಾ ರೆಕಾರ್ಡಿಂಗ್ನಿಂದಾಗಿ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಫಲಿತಾಂಶಗಳನ್ನು ಸಹ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗಬಹುದು. Assistant ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ, Voice Match ಅನುಮತಿಯನ್ನು ಆಫ್ ಮಾಡುವ ಮೂಲಕ ನೀವು ನಂತರದಲ್ಲಿ ಅದನ್ನು ತೆಗೆದುಹಾಕಬಹುದು.</translation> <translation id="5614190747811328134">ಬಳಕೆದಾರ ಸೂಚನೆ</translation> <translation id="5614553682702429503">ಪಾಸ್ವರ್ಡ್ ಉಳಿಸುವುದೇ?</translation> <translation id="5616726534702877126">ಗಾತ್ರವನ್ನು ಕಾಯ್ದಿರಿಸಿ</translation> @@ -5075,6 +5088,7 @@ <translation id="6824584962142919697">&ಅಂಶಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation> <translation id="6825184156888454064">ಹೆಸರಿನ ಪ್ರಕಾರ ವಿಂಗಡಿಸಿ</translation> <translation id="6826872289184051766">USB ಮೂಲಕ ಪರಿಶೀಲಿಸಿ</translation> +<translation id="6827604573767207488">ನೀವು ಈಗಾಗಲೇ ಬೇರೆ ಸಾಧನದಲ್ಲಿ ವೈಯಕ್ತಿಕಗೊಳಿಸಿದ Assistant ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿರುವಂತೆ ತೋರುತ್ತಿದೆ. ಕೆಳಗಿನ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಆನ್ ಮಾಡುವ ಮೂಲಕ ನಿಮ್ಮ Assistant ನಿಂದ ಇನ್ನಷ್ಟು ಪ್ರಯೋಜನಗಳನ್ನು ಪಡೆಯಿರಿ.</translation> <translation id="6828153365543658583">ಕೆಳಗಿನ ಬಳಕೆದಾರರಿಗೆ ಸೈನ್-ಇನ್ ಮಾಡುವುದನ್ನು ನಿರ್ಬಂಧಿಸು:</translation> <translation id="6828182567531805778">ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಲು ನಿಮ್ಮ ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ನಮೂದಿಸಿ</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5511,6 +5525,7 @@ <translation id="7327989755579928735">ADB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು <ph name="MANAGER" /> ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದೆ. ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿದ ನಂತರ, ಆ್ಯಪ್ಗಳನ್ನು ಅಪರಿಚಿತ ಮೂಲದಿಂದ ಲೋಡ್ ಮಾಡಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation> <translation id="7328867076235380839">ಅಮಾನ್ಯ ಸಂಯೋಜನೆ</translation> <translation id="7329154610228416156">ಸೈನ್ ಇನ್ ವಿಫಲಗೊಂಡಿದೆ ಏಕೆಂದರೆ ಅದು ಸುರಕ್ಷಿತವಲ್ಲದ URL (<ph name="BLOCKED_URL" />) ಬಳಸುವಂತೆ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation> +<translation id="7329932885428707942">ಇದು ಸಂಕ್ಷಿಪ್ತ ಸೆಲ್ಯುಲಾರ್ ನೆಟ್ವರ್ಕ್ ಕನೆಕ್ಷನ್ ಕಡಿತಕ್ಕೆ ಕಾರಣವಾಗಬಹುದು.</translation> <translation id="7332053360324989309">ಮೀಸಲು ಕೆಲಸಗಾರ: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">ಡಾಕ್ ಮಾಡಲಾದ ವರ್ಧಕವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="7335974957018254119">ಈ ಭಾಷೆಗಳಿಗಾಗಿ ಕಾಗುಣಿತ ಪರೀಕ್ಷೆಯನ್ನು ಬಳಸಿ</translation> @@ -6177,6 +6192,7 @@ <translation id="8059417245945632445">&ಸಾಧನಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation> <translation id="8059456211585183827">ಉಳಿಸಲು ಯಾವುದೇ ಪ್ರಿಂಟರ್ಗಳು ಲಭ್ಯವಿಲ್ಲ.</translation> <translation id="8061091456562007989">ಹಳೆಯ ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಬದಲಾಯಿಸಿ</translation> +<translation id="8061991877177392872">ನೀವು ಈಗಾಗಲೇ ಮತ್ತೊಂದು ಸಾಧನದಲ್ಲಿ ನಿಮ್ಮ Assistant ಮೂಲಕ Voice Match ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿರುವಂತೆ ತೋರುತ್ತಿದೆ. ಈ ಸಾಧನದಲ್ಲಿ ವಾಯ್ಸ್ ಮಾಡೆಲ್ ಅನ್ನು ರೂಪಿಸಲು ಈ ಹಿಂದೆ ರೆಕಾರ್ಡಿಂಗ್ಗಳನ್ನು ಬಳಸಲಾಗಿತ್ತು.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 ಕಾಗದದ ಹಾಳೆ}one{{COUNT} ಕಾಗದದ ಹಾಳೆಗಳು}other{{COUNT} ಕಾಗದದ ಹಾಳೆಗಳು}}</translation> <translation id="8062879968880283306">ಸಾಧನದ ಕ್ಯಾಮರಾ ಬಳಸಿ QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ ಅಥವಾ ನಿಮ್ಮ ಕ್ಯಾರಿಯರ್ ಒದಗಿಸಿದ ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ.</translation> <translation id="8063235345342641131">ಡಿಫಾಲ್ಟ್ ಹಸಿರು ಅವತಾರ್</translation> @@ -6448,6 +6464,7 @@ <translation id="8379991678458444070">ಈ ಟ್ಯಾಬ್ ಅನ್ನು ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಿ ಮತ್ತು ನಿಮಗೆ ಅಗತ್ಯವಿರುವಾಗ ತ್ವರಿತವಾಗಿ ಇಲ್ಲಿಗೆ ಹಿಂತಿರುಗಿ</translation> <translation id="8382913212082956454">ಇಮೇಲ್ &ವಿಳಾಸವನ್ನು ನಕಲು ಮಾಡಿ</translation> <translation id="8386091599636877289">ಕಾರ್ಯನೀತಿ ಕಂಡುಬಂದಿಲ್ಲ.</translation> +<translation id="8386819192691131213">ಅನುವಾದ, ವ್ಯಾಖ್ಯಾನ, ಯೂನಿಟ್ ಪರಿವರ್ತನೆ ಮತ್ತು ಇನ್ನಷ್ಟವುಗಳಂತಹ ತ್ವರಿತ ಉತ್ತರಗಳನ್ನು ಒದಗಿಸುವುದಕ್ಕಾಗಿ ಪರದೆಯ ಮೇಲೆ ಮಾಹಿತಿಯನ್ನು ಬಳಸಲು Assistant ಅನುಮತಿಸಿ</translation> <translation id="8386903983509584791">ಸ್ಕ್ಯಾನ್ ಪೂರ್ಣಗೊಂಡಿದೆ</translation> <translation id="8387361103813440603">ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ನೋಡಲು ಈ ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ</translation> <translation id="8389264703141926739">ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation> @@ -6931,6 +6948,7 @@ <translation id="8915370057835397490">ಸಲಹೆಯನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> <translation id="8916476537757519021">ಅದೃಶ್ಯ ಉಪಫ್ರೇಮ್: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />ನ <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">ಮೌಸ್, ಪರದೆಯ ಅಂಚುಗಳನ್ನು ಸ್ಪರ್ಶಿಸುವಾಗ ಪರದೆಯನ್ನು ಸರಿಸಿ</translation> <translation id="8923880975836399332">ಗಾಢ ಕೆನ್ನೀಲಿ</translation> <translation id="8925458182817574960">&ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="8926389886865778422">ಮತ್ತೆ ಕೇಳಬೇಡಿ</translation> @@ -7009,6 +7027,7 @@ <translation id="9009708085379296446">ಈ ಪುಟವನ್ನು ಬದಲಾಯಿಸಲು ಬಯಸುತ್ತೀರಾ?</translation> <translation id="9011163749350026987">ಯಾವಾಗಲೂ ಐಕಾನ್ ತೋರಿಸು</translation> <translation id="9011393886518328654">ಬಿಡುಗಡೆಯ ಟಿಪ್ಪಣಿಗಳು</translation> +<translation id="9012122671773859802">ಮೌಸ್ ಚಲಿಸುವಾಗ ಪರದೆಯನ್ನು ನಿರಂತರವಾಗಿ ಸರಿಸಿ</translation> <translation id="9013037634206938463">Linux ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು <ph name="INSTALL_SIZE" /> ಮುಕ್ತ ಸ್ಥಳಾವಕಾಶದ ಅಗತ್ಯವಿದೆ. ಮುಕ್ತ ಸ್ಥಳಾವಕಾಶವನ್ನು ಹೆಚ್ಚಿಸಲು, ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿರುವ ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಿ.</translation> <translation id="9013707997379828817">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮುಂಚಿನ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಗೆ ಹಿಂತಿರುಗಿಸಿದ್ದಾರೆ. ದಯವಿಟ್ಟು ಪ್ರಮುಖ ಫೈಲ್ಗಳನ್ನು ಉಳಿಸಿ, ನಂತರ ಮರುಪ್ರಾರಂಭಿಸಿ. ಸಾಧನದಲ್ಲಿನ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="901668144954885282">Google ಡ್ರೈವ್ಗೆ ಬ್ಯಾಕಪ್ ಮಾಡಿ</translation> @@ -7053,6 +7072,7 @@ <translation id="9052404922357793350">ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation> <translation id="9053563360605707198">ಎರಡೂ ಬದಿಗಳಲ್ಲಿ ಮುದ್ರಿಸಿ</translation> <translation id="9053893665344928494">ನನ್ನ ಆಯ್ಕೆಯನ್ನು ನೆನಪಿಡಿ</translation> +<translation id="9055278955535611574">"Ok Google" ಎಂದು ಎಚ್ಚರಿಸುವ ಮೂಲಕ ನಿಮ್ಮ Assistant ಅನ್ನು ಪ್ರವೇಶಿಸಿ</translation> <translation id="9055636786322918818">RC4 ಎನ್ಕ್ರಿಪ್ಶನ್ ಅನ್ನು ಜಾರಿಗೊಳಿಸಿ. RC4 ಸೈಫರ್ಗಳು ಅಸುರಕ್ಷಿತವಾಗಿರುವುದರಿಂದ ಈ ಆಯ್ಕೆಯನ್ನು ಬಳಸುವುದು ನಿಮ್ಮ ಅಪಾಯವನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ.</translation> <translation id="9056810968620647706">ಯಾವುದೇ ಹೊಂದಾಣಿಕೆಗಳು ಕಂಡುಬಂದಿಲ್ಲ.</translation> <translation id="9057354806206861646">ಅಪ್ಡೇಟ್ ವೇಳಾಪಟ್ಟಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 0f12a2f5..3e32505 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">블루투스 및 직렬 기기에 액세스</translation> <translation id="114036956334641753">오디오 및 자막</translation> <translation id="1140746652461896221">방문하는 모든 페이지의 콘텐츠를 차단합니다.</translation> +<translation id="1141953877381847186">번역, 정의, 단위 변환과 같은 빠른 답변을 제공하기 위해 어시스턴트가 화면의 정보를 사용하도록 허용합니다. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />참고:<ph name="END_BOLD" /> 이 설정은 나중에 언제든지 Google 어시스턴트 설정 > 관련 정보에서 변경할 수 있습니다.</translation> <translation id="1143142264369994168">인증서 서명자</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome이 컴퓨터에서 유해 소프트웨어를 발견하지 못함 • 1분 전 확인}other{Chrome이 컴퓨터에서 유해 소프트웨어를 발견하지 못함 • {NUM_MINS}분 전 확인}}</translation> <translation id="1145593918056169051">프린터가 중지됨</translation> @@ -1432,7 +1435,9 @@ <translation id="2594999711683503743">Google에서 검색하거나 URL을 입력하세요.</translation> <translation id="2602501489742255173">위로 스와이프하여 시작하기</translation> <translation id="2603115962224169880">컴퓨터 정리</translation> +<translation id="2603355571917519942">Voice Match가 준비됨</translation> <translation id="2603463522847370204">시크릿 창에서 열기(&I)</translation> +<translation id="2604138917550693049">Google 렌즈로 이미지 검색하기</translation> <translation id="2604255671529671813">네트워크 연결 오류</translation> <translation id="2606246518223360146">데이터 연결</translation> <translation id="2606454609872547359">아니요, ChromeVox 활성화 없이 계속</translation> @@ -1774,6 +1779,7 @@ <translation id="2963151496262057773">다음 플러그인에서 응답이 없습니다. <ph name="PLUGIN_NAME" />을(를) 중단하시겠습니까?</translation> <translation id="2964193600955408481">Wi-Fi 사용 안 함</translation> <translation id="2964245677645334031">Nearby Share 공개 상태</translation> +<translation id="2966216232069818096">어시스턴트가 지원을 위해 화면의 정보를 사용하도록 허용하기</translation> <translation id="2966937470348689686">Android 환경설정 관리</translation> <translation id="2972581237482394796">다시 실행(&R)</translation> <translation id="2973324205039581528">사이트 음소거</translation> @@ -1869,6 +1875,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">이 탭은 카메라 또는 마이크를 사용 중입니다.</translation> <translation id="3083193146044397360">보안을 위해 일시적으로 차단됨</translation> +<translation id="3083899879156272923">마우스를 화면 중앙에 유지한 상태로 화면 움직이기</translation> <translation id="3084548735795614657">드롭하여 설치</translation> <translation id="3084771660770137092">Chrome에 메모리가 부족하거나 웹페이지 프로세싱이 다른 이유로 종료되었습니다. 계속하려면 새로고침하거나 다른 페이지로 이동하세요.</translation> <translation id="3084958266922136097">화면 보호기 사용 중지</translation> @@ -2362,6 +2369,9 @@ <translation id="3654045516529121250">접근성 설정 확인</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{파일 1개에 영구적으로 액세스할 수 있습니다.}other{파일 #개에 영구적으로 액세스할 수 있습니다.}}</translation> <translation id="3658871634334445293">TrackPoint 가속</translation> +<translation id="3659830472545192450">Voice Match를 사용하면 Google 어시스턴트가 Chromebook에서 음성을 식별하여 나와 다른 사람을 구분할 수 있습니다. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />참고:<ph name="END_BOLD" /> 비슷한 목소리나 녹음된 음성을 이용하여 다른 사람이 내 개인정보 검색결과에 액세스할 수도 있습니다. 나중에 어시스턴트 설정에서 Voice Match를 사용 중지하여 권한을 삭제할 수 있습니다.</translation> <translation id="3660234220361471169">신뢰할 수 없음</translation> <translation id="3664511988987167893">확장 프로그램 아이콘</translation> <translation id="3665589677786828986">Chrome에서 다른 프로그램이 브라우저 설정을 일부 손상시키고 원래 기본값으로 재설정했음을 감지했습니다.</translation> @@ -2966,7 +2976,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" />이(가) 창을 공유합니다.</translation> <translation id="4364830672918311045">알림 표시</translation> <translation id="4366138410738374926">인쇄 시작됨</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> 관련 도움말, 혜택 및 소식을 받아 보고 의견을 공유하세요. 구독은 언제든지 취소할 수 있습니다.</translation> <translation id="4370425812909262207">장바구니를 숨겼습니다. 변경사항이 있을 경우 다시 표시됩니다.</translation> <translation id="4370975561335139969">입력한 이메일과 비밀번호가 일치하지 않습니다.</translation> <translation id="4374831787438678295">Linux 설치 프로그램</translation> @@ -3543,6 +3552,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">선택한 언어의 맞춤법 검사가 지원되지 않습니다.</translation> <translation id="5052499409147950210">사이트 수정</translation> +<translation id="5053962746715621840">Google 렌즈로 이미지 검색하기</translation> <translation id="5057110919553308744">확장 프로그램을 클릭할 경우</translation> <translation id="5057403786441168405">로그인된 계정을 관리하세요. 웹사이트, 앱, Chrome 확장 프로그램 및 Google Play에서 권한에 따라 이 계정을 사용하여 사용 환경을 맞춤설정할 수 있습니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="5059241099014281248">로그인 제한</translation> @@ -4025,6 +4035,9 @@ <translation id="5610038042047936818">카메라 모드로 전환</translation> <translation id="561030196642865721">타사 쿠키가 허용되는 사이트입니다.</translation> <translation id="5612734644261457353">비밀번호를 여전히 확인할 수 없습니다. 참고: 최근에 비밀번호를 변경한 경우 로그아웃해야 새로운 비밀번호가 적용됩니다. 이전 비밀번호를 사용해 보세요.</translation> +<translation id="561308544008485315">Voice Match를 사용하면 Google 어시스턴트가 Chromebook에서 음성을 식별하여 나와 다른 사람을 구분할 수 있습니다. 배터리를 절약하기 위해 기기가 전원에 연결된 경우에만 "Hey Google" 기능이 켜집니다. 변경하려면 설정으로 이동하세요. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />참고:<ph name="END_BOLD" /> 비슷한 목소리나 녹음된 음성을 이용하여 다른 사람이 내 개인정보 검색결과에 액세스할 수도 있습니다. 나중에 어시스턴트 설정에서 Voice Match를 사용 중지하여 권한을 삭제할 수 있습니다.</translation> <translation id="5614190747811328134">사용자 알림</translation> <translation id="5614553682702429503">비밀번호를 저장하시겠습니까?</translation> <translation id="5616726534702877126">용량 예약</translation> @@ -5048,6 +5061,7 @@ <translation id="6824584962142919697">요소 검사(&I)</translation> <translation id="6825184156888454064">이름순 정렬</translation> <translation id="6826872289184051766">USB를 통해 인증</translation> +<translation id="6827604573767207488">이미 다른 기기에서 맞춤 어시스턴트를 설정한 것 같습니다. 다음 설정을 켜면 어시스턴트를 더 유용하게 활용할 수 있습니다.</translation> <translation id="6828153365543658583">로그인할 수 있는 사용자 설정:</translation> <translation id="6828182567531805778">데이터를 동기화하려면 암호를 입력합니다.</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5482,6 +5496,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" />(으)로 인해 ADB 디버깅이 사용 중지되었습니다. <ph name="DEVICE_TYPE" /> 기기를 다시 시작하면 앱을 사이드로드할 수 없게 됩니다.</translation> <translation id="7328867076235380839">잘못된 조합입니다</translation> <translation id="7329154610228416156">보안되지 않은 URL(<ph name="BLOCKED_URL" />)을 사용하도록 설정되어 있기 때문에 로그인할 수 없습니다. 관리자에게 문의하세요.</translation> +<translation id="7329932885428707942">이로 인해 잠시 셀룰러 네트워크 연결이 끊길 수 있습니다.</translation> <translation id="7332053360324989309">전용 작업자: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">고정 돋보기 사용</translation> <translation id="7335974957018254119">맞춤법 검사 사용</translation> @@ -5525,6 +5540,7 @@ <translation id="7374376573160927383">USB 기기 관리</translation> <translation id="7375235221357833624">{0,plural, =1{1시간 내 기기 업데이트}other{#시간 내 기기 업데이트}}</translation> <translation id="7376553024552204454">이동 시 마우스 커서 강조표시</translation> +<translation id="737728204345822099">이 사이트를 방문한 기록이 보안 키에 보관될 수 있습니다.</translation> <translation id="7377451353532943397">계속해서 센서 액세스 차단</translation> <translation id="7378611153938412599">취약한 비밀번호는 추측하기 쉽습니다. 안전한 비밀번호를 설정하세요. <ph name="BEGIN_LINK" />보안 도움말 더보기<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome 웹 스토어 열기</translation> @@ -6151,6 +6167,7 @@ <translation id="8059417245945632445">기기 검사(&I)</translation> <translation id="8059456211585183827">저장할 수 있는 프린터가 없습니다.</translation> <translation id="8061091456562007989">이전 설정으로 되돌리기</translation> +<translation id="8061991877177392872">다른 기기의 어시스턴트에서 이미 Voice Match를 설정한 것 같습니다. 이전에 녹음된 음성을 사용하여 이 기기에서 음성 모델을 만들었습니다.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{용지 1장}other{용지 {COUNT}장}}</translation> <translation id="8062879968880283306">기기 카메라로 QR 코드를 스캔하거나 이동통신사에서 제공한 활성화 코드를 입력하세요.</translation> <translation id="8063235345342641131">기본 녹색 아바타</translation> @@ -6420,6 +6437,7 @@ <translation id="8379991678458444070">이 탭을 북마크에 추가하여 간편하게 다시 방문하세요.</translation> <translation id="8382913212082956454">이메일 주소 복사(&E)</translation> <translation id="8386091599636877289">정책을 찾을 수 없습니다.</translation> +<translation id="8386819192691131213">번역, 정의, 단위 변환과 같은 빠른 답변을 제공하기 위해 어시스턴트가 화면의 정보를 사용하도록 허용합니다.</translation> <translation id="8386903983509584791">검색 완료</translation> <translation id="8387361103813440603">사용자 위치 확인이 허용되지 않음</translation> <translation id="8389264703141926739">알림 차단</translation> @@ -6897,6 +6915,7 @@ <translation id="8915370057835397490">추천 단어 로드 중...</translation> <translation id="8916476537757519021">시크릿 모드 서브프레임: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />님의 <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">마우스로 화면 가장자리를 터치할 경우 화면 움직이기</translation> <translation id="8923880975836399332">진한 청록색</translation> <translation id="8925458182817574960">설정(&S)</translation> <translation id="8926389886865778422">이 메시지 그만 보기</translation> @@ -6974,6 +6993,7 @@ <translation id="9009708085379296446">이 페이지를 변경하려고 하셨나요?</translation> <translation id="9011163749350026987">항상 아이콘 표시</translation> <translation id="9011393886518328654">출시 노트</translation> +<translation id="9012122671773859802">마우스 움직임에 따라 계속 화면 움직이기</translation> <translation id="9013037634206938463">Linux를 설치하려면 <ph name="INSTALL_SIZE" />의 여유 공간이 있어야 합니다. 여유 공간을 늘리려면 기기에서 파일을 삭제하세요.</translation> <translation id="9013707997379828817">관리자가 이 기기를 롤백했습니다. 중요한 파일을 저장한 후 다시 시작하세요. 기기의 모든 데이터가 삭제됩니다.</translation> <translation id="901668144954885282">Google Drive에 백업</translation> @@ -7018,6 +7038,7 @@ <translation id="9052404922357793350">차단 계속</translation> <translation id="9053563360605707198">양면에 인쇄</translation> <translation id="9053893665344928494">내 선택 기억하기</translation> +<translation id="9055278955535611574">"Hey Google"로 어시스턴트에 액세스하기</translation> <translation id="9055636786322918818">RC4 암호화를 적용합니다. RC4 암호화는 안전하지 않으므로 이 옵션을 사용하면 보안 위험도가 높아집니다.</translation> <translation id="9056810968620647706">일치하는 항목이 없습니다.</translation> <translation id="9057354806206861646">업데이트 일정</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index ee917e0e..292a8b32 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -1027,7 +1027,7 @@ <translation id="214169863967063661">Сырткы көрүнүш жөндөөлөрүн ачуу</translation> <translation id="2142328300403846845">Шилтемени төмөнкү катары ачуу</translation> <translation id="2142582065325732898">Акыркы ачылган Chrome өтмөктөрүн көрүү үчүн <ph name="LINK1_BEGIN" />Chrome шайкештирүүнү<ph name="LINK1_END" /> күйгүзүңүз. <ph name="LINK2_BEGIN" />Кеңири маалымат<ph name="LINK2_END" /></translation> -<translation id="2143765403545170146">Толук экранда куралдар тилкеси ар дайым көрсөтүлсүн</translation> +<translation id="2143765403545170146">Толук экранда куралдар тилкеси ар дайым көрүнсүн</translation> <translation id="2143778271340628265">Проксини кол менен конфигурациялоо</translation> <translation id="2144536955299248197">Тастыктамага көз чаптыргыч: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Linux Android колдонмосун иштеп чыгуу</translation> @@ -1661,7 +1661,7 @@ <translation id="2841837950101800123">Жабдуучу</translation> <translation id="2844169650293029770">USB-C түзмөгү (сол жактагы маңдайкы оюкча)</translation> <translation id="2844809857160214557">Басып чыгаруу тапшырмаларын көрүп жана башкарасыз</translation> -<translation id="2845382757467349449">Кыстармалар тилкеси ар дайым көрсөтүлсүн</translation> +<translation id="2845382757467349449">Кыстармалар тилкеси ар дайым көрүнсүн</translation> <translation id="284805635805850872">Зыянкеч программа алынып салынсынбы?</translation> <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation> <translation id="284975061945174219">Тазалоо катасы</translation> @@ -2968,7 +2968,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> колдонмосу терезесин бөлүшүүдө.</translation> <translation id="4364830672918311045">Эскертмелерди чагылдыруу</translation> <translation id="4366138410738374926">Басып чыгаруу башталды</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> тууралуу кеңештерди, сунуштарды жана жаңылыктарды алып, пикир билдириңиз. Жазылууну каалаган убакта токтотууга болот.</translation> <translation id="4370425812909262207">Себеттер жашырылды. Алар өзгөртүү киргизгениңизде көрүнөт.</translation> <translation id="4370975561335139969">Киргизилген электрондук почта дареги менен сырсөз дал келбейт</translation> <translation id="4374831787438678295">Linux орноткучу</translation> @@ -6838,7 +6837,7 @@ <translation id="8855977033756560989">Бул Chromebook Enterprise түзмөгүндө Chrome Enterprise Upgrade камтылган. Ишкананын мүмкүнчүлүктөрүн пайдалануу үчүн бул түзмөктү Google админ аккаунту менен каттаңыз.</translation> <translation id="8856028055086294840">Колдонмолорду жана барактарды калыбына келтирүү</translation> <translation id="885701979325669005">Сактагыч</translation> -<translation id="8859057652521303089">Тилиңизди тандаңыз:</translation> +<translation id="8859057652521303089">Тил тандаңыз:</translation> <translation id="8859174528519900719">Көмөкчү алкак: <ph name="SUBFRAME_SITE" /></translation> <translation id="8859402192569844210">Тейлөө шарттары жүктөлгөн жок</translation> <translation id="8859662783913000679">Ата-эненин аккаунту</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index d6e9077..9efa55f 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">ເຂົ້າຫາອຸປະກອນ Bluetooth ແລະ Serial ຂອງທ່ານ</translation> <translation id="114036956334641753">ສຽງ ແລະ ຄຳບັນຍາຍ</translation> <translation id="1140746652461896221">ບລັອກເນື້ອຫາໃນໜ້າໃດໆກໍຕາມທີ່ທ່ານເຂົ້າເບິ່ງ</translation> +<translation id="1141953877381847186">ອະນຸຍາດໃຫ້ຜູ້ຊ່ວຍໃຊ້ຂໍ້ມູນໃນໜ້າຈໍເພື່ອໃຫ້ຄຳຕອບດ່ວນ ເຊັ່ນ: ຄຳແປ, ຄຳນິຍາມ, ການປ່ຽນຫົວໜ່ວຍ ແລະ ອື່ນໆອີກ. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ຈື່ວ່າ:<ph name="END_BOLD" /> ທ່ານສາມາດປ່ຽນສິ່ງນີ້ໃນພາຍຫຼັງໄດ້ໃນການຕັ້ງຄ່າຜູ້ຊ່ວຍ Google > ຂໍ້ມູນທີ່ກ່ຽວຂ້ອງ.</translation> <translation id="1143142264369994168">ຜູ້ເຊັນໃບຢັ້ງຢືນ</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome ບໍ່ພົບຊອບແວອັນຕະລາຍໃນຄອມພິວເຕີຂອງທ່ານ • ກວດເມື່ອ 1 ນາທີກ່ອນ}other{Chrome ບໍ່ພົບຊອບແວອັນຕະລາຍໃນຄອມພິວເຕີຂອງທ່ານ • ກວດເມື່ອ {NUM_MINS} ນາທີກ່ອນ}}</translation> <translation id="1145593918056169051">ເຄື່ອງພິມໄດ້ຢຸດແລ້ວ</translation> @@ -1430,7 +1433,9 @@ <translation id="2594999711683503743">ຊອກຫາໃນ Google ຫຼື ພິມ URL</translation> <translation id="2602501489742255173">ປັດຂຶ້ນເພື່ອເລີ່ມຕົ້ນ</translation> <translation id="2603115962224169880">ອະນາໄມຄອມພິວເຕີ</translation> +<translation id="2603355571917519942">Voice Match ພ້ອມແລ້ວ</translation> <translation id="2603463522847370204">ເປີດຢູ່ໃນໜ້າຕ່າງທີ່ບໍ່ເຜີຍຕົນຕົວ</translation> +<translation id="2604138917550693049">ຊອກຫາຮູບພາບດ້ວຍ Google Lens</translation> <translation id="2604255671529671813">ການເຊື່ອມຕໍ່ເຄືອຂ່າຍຜິດພາດ</translation> <translation id="2606246518223360146">ລິ້ງຂໍ້ມູນ</translation> <translation id="2606454609872547359">ບໍ່, ສືບຕໍ່ໂດຍບໍ່ໃຊ້ ChromeVox</translation> @@ -1772,6 +1777,7 @@ <translation id="2963151496262057773">ປລັກອິນຕໍ່ໄປນີ້ບໍ່ຕອບຮັບ: <ph name="PLUGIN_NAME" />ທ່ານຢາກຈະຢຸດມັນບໍ?</translation> <translation id="2964193600955408481">ປິດໃຊ້ງານ Wi-Fi</translation> <translation id="2964245677645334031">ການເບິ່ງເຫັນການແບ່ງປັນໃກ້ຄຽງ</translation> +<translation id="2966216232069818096">ອະນຸຍາດໃຫ້ຜູ້ຊ່ວຍຂອງທ່ານໃຊ້ຂໍ້ມູນໃນໜ້າຈໍເພື່ອຊ່ວຍ</translation> <translation id="2966937470348689686">ຈັດການການຕັ້ງຄ່າ Android</translation> <translation id="2972581237482394796">ເຮັດຄືນ</translation> <translation id="2973324205039581528">ປິດເວັບໄຊ</translation> @@ -1867,6 +1873,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">ແຖບນີ້ກໍາລັງໃຊ້ກ້ອງຖ່າຍຮູບຫຼືໄມໂຄຣໂຟນຂອງທ່ານ.</translation> <translation id="3083193146044397360">ບລັອກໄວ້ຊົ່ວຄາວແລ້ວເພື່ອປົກປ້ອງຄວາມປອດໄພຂອງທ່ານ</translation> +<translation id="3083899879156272923">ຍ້າຍໜ້າຈໍໂດຍຮັກສາເມົ້າໄວ້ຢູ່ເຄິ່ງກາງໜ້າຈໍ</translation> <translation id="3084548735795614657">ວາງລົງເພື່ອຕິດຕັ້ງ</translation> <translation id="3084771660770137092">Chrome ໝົດຄວາມຈໍາ ຫຼືຂະບວນການສໍາລັບໜ້າເວັບຖືກສິ້ນສຸດລົງດ້ວຍເຫດຜົນໃດໜຶ່ງ. ເພື່ອສືບຕໍ່, ໂຫຼດຄືນໃໝ່ ແລະໄປຫາໜ້າອື່ນ.</translation> <translation id="3084958266922136097">ປິດການນຳໃຊ້ສກຣີນເຊັບເວີ</translation> @@ -2360,6 +2367,9 @@ <translation id="3654045516529121250">ອ່ານການຕັ້ງຄ່າຄວາມສາມາດເຂົ້າຫາ</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ມັນມີການເຂົ້າຫາໜຶ່ງໄຟລ໌ຖາວອນ.}other{ມັນມີການເຂົ້າຫາ # ໄຟລ໌ຖາວອນ.}}</translation> <translation id="3658871634334445293">ການເລັ່ງຄວາມໄວ TrackPoint</translation> +<translation id="3659830472545192450">Voice Match ຊ່ວຍຜູ້ຊ່ວຍ Google ຂອງທ່ານລະບຸສຽງຂອງທ່ານໃນ Chromebook ຂອງທ່ານ ແລະ ຈຳແນກທ່ານຈາກຄົນອື່ນ. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ຈື່ວ່າ:<ph name="END_BOLD" /> ສຽງ ແລະ ບັນທຶກສຽງທີ່ຄ້າຍຄືກັນອາດຈະສາມາດເຂົ້າເຖິງຜົນການຊອກຫາສ່ວນຕົວຂອງທ່ານໄດ້ເຊັ່ນກັນ. ທ່ານສາມາດລຶບການອະນຸຍາດ Voice Match ອອກໄດ້ໃນພາຍຫຼັງ ໂດຍການປິດມັນໃນການຕັ້ງຄ່າຜູ້ຊ່ວຍ.</translation> <translation id="3660234220361471169">ບໍ່ເຊື່ອຖືໄດ້</translation> <translation id="3664511988987167893">ໄອຄອນສ່ວນຂະຫຍາຍ</translation> <translation id="3665589677786828986">Chrome ກວດພົບວ່າ ການຕັ້ງຄ່າຂອງທ່ານບາງຕົວໄດ້ຮັບຄວາມເສຍຫາຍໂດຍໂປຣແກຼມອື່ນ ແລະໄດ້ຕັ້ງຄ່າພວກມັນໄປເປັນຄ່າມາດຕະຖານເດີມຂອງພວກມັນແລ້ວ.</translation> @@ -2966,7 +2976,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> ກຳລັງແບ່ງປັນໜ້າຈໍ.</translation> <translation id="4364830672918311045">ສະແດງການແຈ້ງເຕືອນ</translation> <translation id="4366138410738374926">ເລີ່ມການພິມແລ້ວ</translation> -<translation id="437004882363131692">ຮັບເຄັດລັບ, ຂໍ້ສະເໜີ ແລະ ການອັບເດດກ່ຽວກັບ <ph name="DEVICE_TYPE" /> ແລະ ແບ່ງປັນຄຳຕິຊົມ. ຍົກເລີກການສະໝັກໃຊ້ໄດ້ທຸກເວລາ.</translation> <translation id="4370425812909262207">ເຊື່ອງກະຕ່າໄວ້ແລ້ວ. ພວກມັນຈະບໍ່ປາກົດຂຶ້ນມາອີກເມື່ອທ່ານສ້າງການປ່ຽນແປງ.</translation> <translation id="4370975561335139969">ອີເມວ ແລະລະຫັດຜ່ານທີ່ທ່ານປ້ອນເຂົ້າບໍ່ກົງກັນ.</translation> <translation id="4374831787438678295">ຕົວຕິດຕັ້ງ Linux</translation> @@ -3543,6 +3552,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">ບໍ່ຮອງຮັບການກວດການສະກົດຄຳສຳລັບພາສາທີ່ທ່ານເລືອກ</translation> <translation id="5052499409147950210">ແກ້ໄຂເວັບໄຊ</translation> +<translation id="5053962746715621840">ຊອກຫາຮູບພາບດ້ວຍ Google Lens</translation> <translation id="5057110919553308744">ເມື່ອທ່ານຄລິກສ່ວນຂະຫຍາຍ</translation> <translation id="5057403786441168405">ຈັດການບັນຊີທີ່ເຂົ້າສູ່ລະບົບຂອງທ່ານ. ເວັບໄຊ, ແອັບ ແລະ ສ່ວນຂະຫຍາຍໃນ Chrome ແລະ Google Play ອາດຈະໃຊ້ບັນຊີເຫຼົ່ານີ້ເພື່ອປັບແຕ່ງປະສົບການຂອງທ່ານ, ໂດຍຂຶ້ນກັບການອະນຸຍາດ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="5059241099014281248">ຈຳກັດການເຂົ້າສູ່ລະບົບ</translation> @@ -4024,6 +4034,9 @@ <translation id="5610038042047936818">ປ່ຽນເປັນໂໝດກ້ອງຖ່າຍຮູບ</translation> <translation id="561030196642865721">ຄຸກກີ້ພາກສ່ວນທີສາມໄດ້ຮັບອະນຸຍາດໃນເວັບໄຊນີ້</translation> <translation id="5612734644261457353">ຂໍອະໄພ, ລະຫັດຜ່ານຂອງທ່ານຍັງບໍ່ສາມາດກວດສອບໄດ້. ໝາຍເຫດ: ຖ້າທ່ານປ່ຽນລະຫັດຜ່ານຂອງທ່ານເມື່ອບໍ່ດົນມານີ້, ລະຫັດຜ່ານໃໝ່ຂອງທ່ານຈະຖືກນໍາໃຊ້ອີກ ເມື່ອທ່ານອອກລະບົບ, ກະລຸນາໃຊ້ລະຫັດເກົ່າຢູ່ທີ່ນີ້.</translation> +<translation id="561308544008485315">Voice Match ຊ່ວຍຜູ້ຊ່ວຍ Google ຂອງທ່ານລະບຸສຽງຂອງທ່ານໃນ Chromebook ຂອງທ່ານ ແລະ ຈຳແນກທ່ານຈາກຄົນອື່ນ. ເພື່ອປະຢັດແບັດເຕີຣີ, "Ok Google" ພຽງແຕ່ເປີດເມື່ອອຸປະກອນຂອງທ່ານເຊື່ອມຕໍ່ກັບແຫຼ່ງຈ່າຍໄຟເທົ່ານັ້ນ. ເພື່ອປ່ຽນແປງ, ກະລຸນາໄປທີ່ການຕັ້ງຄ່າ. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ຈື່ວ່າ:<ph name="END_BOLD" /> ສຽງ ແລະ ບັນທຶກສຽງທີ່ຄ້າຍຄືກັນອາດຈະສາມາດເຂົ້າເຖິງຜົນການຊອກຫາສ່ວນຕົວຂອງທ່ານໄດ້ເຊັ່ນກັນ. ທ່ານສາມາດລຶບການອະນຸຍາດ Voice Match ອອກໄດ້ໃນພາຍຫຼັງ ໂດຍການປິດມັນໃນການຕັ້ງຄ່າຜູ້ຊ່ວຍ.</translation> <translation id="5614190747811328134">ແຈ້ງການຜູ້ໃຊ້</translation> <translation id="5614553682702429503">ບັນທຶກລະຫັດຜ່ານໄວ້ບໍ?</translation> <translation id="5616726534702877126">ຈອງຂະໜາດ</translation> @@ -5047,6 +5060,7 @@ <translation id="6824584962142919697">&ກວດກາອົງປະກອບ</translation> <translation id="6825184156888454064">ຮຽງຕາມຊື່</translation> <translation id="6826872289184051766">ຢັ້ງຢືນຜ່ານ USB</translation> +<translation id="6827604573767207488">ປາກົດວ່າທ່ານໄດ້ຕັ້ງຄ່າຜູ້ຊ່ວຍແບບເປັນສ່ວນຕົວໃນອຸປະກອນອື່ນແລ້ວ. ໄດ້ປະໂຫຍດຫຼາຍຍິ່ງຂຶ້ນຈາກຜູ້ຊ່ວຍຂອງທ່ານໂດຍການເປີດການຕັ້ງຄ່າຕໍ່ໄປນີ້.</translation> <translation id="6828153365543658583">ຈໍາກັດລົງຊື່ເຂົ້າລະບົບຕໍ່ຜູ້ໃຊ້ຕໍ່ໄປນີ້:</translation> <translation id="6828182567531805778">ປ້ອນລະຫັດຜ່ານຂອງທ່ານເພື່ອຊິ້ງຂໍ້ມູນຂອງທ່ານ</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5481,6 +5495,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> ໄດ້ປິດການນຳໃຊ້ການດີບັກ ADB ແລ້ວ. ເມື່ອທ່ານຣີສະຕາດ <ph name="DEVICE_TYPE" /> ຂອງທ່ານແລ້ວ, ທ່ານຈະບໍ່ສາມາດໂຫຼດແອັບຢ່າງບໍ່ເປັນທາງການໄດ້.</translation> <translation id="7328867076235380839">ການລວມເຂົ້າກັນບໍ່ຖືກຕ້ອງ</translation> <translation id="7329154610228416156">ລົງຊື່ເຂົ້າໃຊ້ບໍ່ສໍາເລັດ ເພາະວ່າມັນບໍ່ຖືກປັບຕັ້ງຄ່າໃຫ້ໃຊ້ URL ທີ່ບໍ່ປອດໄພ (<ph name="BLOCKED_URL" />). ກະລຸນາຕິດຕໍ່ຜູ້ຄວບຄຸມຂອງທ່ານ.</translation> +<translation id="7329932885428707942">ນີ້ອາດຈະເຮັດໃຫ້ເຄືອຂ່າຍມືຖືຕັດການເຊື່ອມຕໍ່ຊົ່ວຄາວ.</translation> <translation id="7332053360324989309">ຜູ້ເຮັດວຽກສະເພາະຢ່າງ: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">ເປີດນຳໃຊ້ແວ່ນຂະຫຍາຍທີ່ຕັ້ງໄວ້ແລ້ວ</translation> <translation id="7335974957018254119">ໃຊ້ການກວດການສະກົດຄໍາສຳລັບ</translation> @@ -6148,6 +6163,7 @@ <translation id="8059417245945632445">ກວດກາອຸປະກອນ</translation> <translation id="8059456211585183827">ບໍ່ມີເຄື່ອງພິມພ້ອມໃຫ້ບັນທຶກໄວ້.</translation> <translation id="8061091456562007989">ປ່ຽນກັບຄືນ</translation> +<translation id="8061991877177392872">ປາກົດວ່າທ່ານໄດ້ຕັ້ງຄ່າ Voice Match ກັບຜູ້ຊ່ວຍຂອງທ່ານຢູ່ໃນອຸປະກອນອື່ນແລ້ວ. ບັນທຶກສຽງກ່ອນໜ້າເຫຼົ່ານີ້ຖືກໃຊ້ເພື່ອສ້າງຮູບແບບສຽງໃນອຸປະກອນນີ້.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{ເຈ້ຍ 1 ແຜ່ນ}other{ເຈ້ຍ {COUNT} ແຜ່ນ}}</translation> <translation id="8062879968880283306">ສະແກນລະຫັດ QR ໂດຍໃຊ້ກ້ອງຂອງອຸປະກອນ ຫຼື ປ້ອນລະຫັດການເປີດນຳໃຊ້ທີ່ຜູ້ໃຫ້ບໍລິການຂອງທ່ານສະໜອງໃຫ້.</translation> <translation id="8063235345342641131">ຮູບແທນຕົວສີຂຽວຕາມຄ່າເລີ່ມຕົ້ນ</translation> @@ -6417,6 +6433,7 @@ <translation id="8379991678458444070">ກັບຄືນຫາບ່ອນນີ້ໄດ້ຢ່າງວ່ອງໄວດ້ວຍການບຸກມາກແຖບນີ້ໄວ້</translation> <translation id="8382913212082956454">ກັອບປີ້ທີ່ຢູ່ອີເມວ</translation> <translation id="8386091599636877289">ບໍ່ເຫັນນະໂຍບາຍ.</translation> +<translation id="8386819192691131213">ອະນຸຍາດໃຫ້ຜູ້ຊ່ວຍໃຊ້ຂໍ້ມູນໃນໜ້າຈໍເພື່ອໃຫ້ຄຳຕອບດ່ວນ ເຊັ່ນ: ຄຳແປ, ຄຳນິຍາມ, ການປ່ຽນຫົວໜ່ວຍ ແລະ ອື່ນໆອີກ</translation> <translation id="8386903983509584791">ສຳເລັດການສະແກນແລ້ວ</translation> <translation id="8387361103813440603">ບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ເຫັນສະຖານທີ່ຂອງທ່ານ</translation> <translation id="8389264703141926739">ບລັອກການແຈ້ງເຕືອນ</translation> @@ -6894,6 +6911,7 @@ <translation id="8915370057835397490">ກໍາລັງໂຫຼດຄໍາແນະນໍາ</translation> <translation id="8916476537757519021">ຂອບຍ່ອຍທີ່ບໍ່ເຜີຍຕົນຕົວ: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> ຂອງ <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">ຍ້າຍໜ້າຈໍເມື່ອເມົ້າສຳຜັດຂອບໜ້າຈໍ</translation> <translation id="8923880975836399332">ສີຂຽວອົມຟ້າເຂັ້ມ</translation> <translation id="8925458182817574960">ການຕັ້ງຄ່າ</translation> <translation id="8926389886865778422">ຢ່າຖາມອີກ</translation> @@ -6971,6 +6989,7 @@ <translation id="9009708085379296446">ທ່ານຕັ້ງໃຈຈະປ່ຽນໜ້ານີ້ບໍ?</translation> <translation id="9011163749350026987">ສະແດງໄອຄອນສະເໝີ</translation> <translation id="9011393886518328654">ບັນທຶກການປ່ຽນແປງ</translation> +<translation id="9012122671773859802">ຍ້າຍໜ້າຈໍໄດ້ຢ່າງຕໍ່ເນື່ອງໃນເວລາເມົ້າຍ້າຍ</translation> <translation id="9013037634206938463">ຈຳເປັນຕ້ອງມີພື້ນທີ່ຫວ່າງ <ph name="INSTALL_SIZE" /> ເພື່ອຕິດຕັ້ງ Linux. ເພື່ອເພີ່ມພື້ນທີ່ຫວ່າງ, ກະລຸນາລຶບໄຟລ໌ຕ່າງໆອອກຈາກອຸປະກອນຂອງທ່ານ.</translation> <translation id="9013707997379828817">ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານໄດ້ຍ້ອນກັບອຸປະກອນນີ້. ກະລຸນາບັນທຶກໄຟລ໌, ຈາກນັ້ນປິດເປີດຄືນໃໝ່. ຂໍ້ມູນທັງໝົດໃນອຸປະກອນນີ້ຈະຖືກລຶບ.</translation> <translation id="901668144954885282">ສຳຮອງຂໍ້ມູນໄປໃສ່ Google Drive</translation> @@ -7015,6 +7034,7 @@ <translation id="9052404922357793350">ສືບຕໍ່ບລັອກໄວ້</translation> <translation id="9053563360605707198">ພິມທັງສອງດ້ານ</translation> <translation id="9053893665344928494">ຈື່ການເລືອກຂອງຂ້ອຍ</translation> +<translation id="9055278955535611574">ເຂົ້າເຖິງຜູ້ຊ່ວຍຂອງທ່ານດ້ວຍ "Ok Google"</translation> <translation id="9055636786322918818">ບັງຄັບໃຊ້ການເຂົ້າລະຫັດ RC4. ການໃຊ້ຕົວເລືອກນີ້ເພີ່ມຄວາມສ່ຽງຂອງທ່ານ ເພາະວ່າລະຫັດລັບ RC4 ບໍ່ປອດໄພ.</translation> <translation id="9056810968620647706">ບໍ່ພົບການຈັບຄູ່ອັນໃດ.</translation> <translation id="9057354806206861646">ອັບເດດກຳນົດເວລາ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index be62b4e..cd6ec85 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Pasiekti „Bluetooth“ ir nuosekliuosius įtaisus</translation> <translation id="114036956334641753">Garsas ir subtitrai</translation> <translation id="1140746652461896221">Blokuoti turinį bet kuriame puslapyje, kuriame lankotės</translation> +<translation id="1141953877381847186">Leiskite Padėjėjui naudoti ekrane esančią informaciją, kad jis galėtų pateikti greitus atsakymus, pvz., vertimą, apibrėžtį, matavimo vienetų konvertavimą ir daugiau. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Atminkite:<ph name="END_BOLD" /> vėliau galėsite bet kada tai pakeisti skiltyje „Google“ padėjėjo nustatymai“ > „Susijusi informacija“.</translation> <translation id="1143142264369994168">Sertifikatą pasirašantis asmuo</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{„Chrome“ kompiuteryje nerado žalingos programinės įrangos. • Tikrinta prieš 1 minutę}one{„Chrome“ kompiuteryje nerado žalingos programinės įrangos. • Tikrinta prieš {NUM_MINS} minutę}few{„Chrome“ kompiuteryje nerado žalingos programinės įrangos. • Tikrinta prieš {NUM_MINS} minutes}many{„Chrome“ kompiuteryje nerado žalingos programinės įrangos. • Tikrinta prieš {NUM_MINS} minutės}other{„Chrome“ kompiuteryje nerado žalingos programinės įrangos. • Tikrinta prieš {NUM_MINS} minučių}}</translation> <translation id="1145593918056169051">Spausdintuvas sustabdytas</translation> @@ -1439,7 +1442,9 @@ <translation id="2594999711683503743">Ieškokite „Google“ arba įveskite URL</translation> <translation id="2602501489742255173">Perbraukite aukštyn, jei norite pradėti</translation> <translation id="2603115962224169880">Išvalykite kompiuterį</translation> +<translation id="2603355571917519942">„Voice Match“ paruošta naudoti</translation> <translation id="2603463522847370204">Atidaryti &inkognito lange</translation> +<translation id="2604138917550693049">Vaizdo paieška naudojant „Google Lens“</translation> <translation id="2604255671529671813">Tinklo ryšio klaida</translation> <translation id="2606246518223360146">Susieti duomenis</translation> <translation id="2606454609872547359">Ne, tęsti be „ChromeVox“</translation> @@ -1782,6 +1787,7 @@ <translation id="2963151496262057773">Šis papildinys neatsako: „<ph name="PLUGIN_NAME" />“ Ar norite jį sustabdyti?</translation> <translation id="2964193600955408481">Neleisti „Wi-Fi“</translation> <translation id="2964245677645334031">Bendrinimo netoliese matomumas</translation> +<translation id="2966216232069818096">Leiskite Padėjėjui naudoti ekrane esančią informaciją, kad jis galėtų padėti</translation> <translation id="2966937470348689686">Tvarkyti „Android“ nuostatas</translation> <translation id="2972581237482394796">&Atlikti iš naujo</translation> <translation id="2973324205039581528">Nutildyti svetainę</translation> @@ -1878,6 +1884,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Šiame skirtuko lape naudojama vaizdo kamera arba mikrofonas.</translation> <translation id="3083193146044397360">Laikinai užblokuota, siekiant užtikrinti jūsų saugumą</translation> +<translation id="3083899879156272923">Perkelti ekraną paliekant pelę ekrano centre</translation> <translation id="3084548735795614657">Nuvilkite, jei norite diegti</translation> <translation id="3084771660770137092">Nebėra laisvos „Chrome“ atminties vietos arba tinklalapio procesas buvo nutrauktas dėl kitos priežasties. Jei norite tęsti, įkelkite iš naujo arba eikite į kitą puslapį.</translation> <translation id="3084958266922136097">Išjungti ekrano užsklandą</translation> @@ -2373,6 +2380,9 @@ <translation id="3654045516529121250">Skaitykite pasiekiamumo nustatymus</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Suteikta nuolatinė prieiga prie vieno failo.}one{Suteikta nuolatinė prieiga prie # failo.}few{Suteikta nuolatinė prieiga prie # failų.}many{Suteikta nuolatinė prieiga prie # failo.}other{Suteikta nuolatinė prieiga prie # failų.}}</translation> <translation id="3658871634334445293">„TrackPoint“ spartinimas</translation> +<translation id="3659830472545192450">Naudojant „Voice Match“ „Google“ padėjėjas gali atpažinti jūsų balsą „Chromebook“ įrenginyje ir atskirti nuo kitų. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Atminkite:<ph name="END_BOLD" /> asmeninio turinio rezultatus taip pat galima pasiekti panašiu balsu ar naudojant panašį įrašą. Vėliau galėsite pašalinti „Voice Match“ leidimą išjungę jį „Google“ padėjėjo nustatymuose.</translation> <translation id="3660234220361471169">Nepatikima</translation> <translation id="3664511988987167893">Plėtinio piktograma</translation> <translation id="3665589677786828986">„Chrome“ aptiko, kad kai kuriuos nustatymus sugadino kita programa, ir nustatė juos iš naujo į pirminius numatytuosius nustatymus.</translation> @@ -2981,7 +2991,6 @@ <translation id="4364567974334641491">„<ph name="APP_NAME" />“ bendrina langą.</translation> <translation id="4364830672918311045">Pateikti pranešimus</translation> <translation id="4366138410738374926">Spausdinimas pradėtas</translation> -<translation id="437004882363131692">Gaukite „<ph name="DEVICE_TYPE" />“ patarimų, pasiūlymų bei naujinių ir pateikite atsiliepimų. Atsisakyti prenumeratos galėsite bet kuriuo metu.</translation> <translation id="4370425812909262207">Krepšeliai paslėpti. Jie bus vėl rodomi, kai atliksite pakeitimus.</translation> <translation id="4370975561335139969">Įvestas slaptažodis neatitinka el. pašto adreso</translation> <translation id="4374831787438678295">„Linux“ diegimo programa</translation> @@ -3561,6 +3570,7 @@ <translation id="5050330054928994520">TĮK</translation> <translation id="5051836348807686060">Jūsų pasirinktų kalbų rašybos tikrinimas nepalaikomas</translation> <translation id="5052499409147950210">Svetainės redagavimas</translation> +<translation id="5053962746715621840">Vaizdo paieška naudojant „Google Lens“</translation> <translation id="5057110919553308744">Spustelėjus plėtinį</translation> <translation id="5057403786441168405">Tvarkykite paskyras, prie kurių esate prisijungę. Svetainės, programos ir plėtiniai naršyklėje „Chrome“ ir „Google Play“ gali naudoti šias paskyras jums teikiamoms funkcijoms tinkinti pagal jūsų leidimus. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Prisijungimo apribojimas</translation> @@ -4045,6 +4055,9 @@ <translation id="5610038042047936818">Perjungti į fotoaparato režimą</translation> <translation id="561030196642865721">Šioje svetainėje leidžiami trečiųjų šalių slapukai</translation> <translation id="5612734644261457353">Deja, jūsų slaptažodžio patvirtinti vis tiek nepavyko. Pastaba: jei neseniai pakeitėte slaptažodį, naujas slaptažodis bus taikomas, kai atsijungsite. Čia naudokite senąjį slaptažodį.</translation> +<translation id="561308544008485315">Naudojant „Voice Match“ „Google“ padėjėjas gali atpažinti jūsų balsą „Chromebook“ įrenginyje ir atskirti nuo kitų. Siekiant tausoti akumuliatoriaus energiją, funkcija „Ok Google“ įjungiama, tik kai įrenginys prijungtas prie maitinimo šaltinio. Jei norite pakeisti, eikite į skiltį „Nustatymai“. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Atminkite:<ph name="END_BOLD" /> asmeninio turinio rezultatus taip pat galima pasiekti panašiu balsu ar naudojant panašį įrašą. Vėliau galėsite pašalinti „Voice Match“ leidimą išjungę jį „Google“ padėjėjo nustatymuose.</translation> <translation id="5614190747811328134">Naudotojo pastaba</translation> <translation id="5614553682702429503">Išsaugoti slaptažodį?</translation> <translation id="5616726534702877126">Rezervuoti tam tikro dydžio vietą</translation> @@ -5076,6 +5089,7 @@ <translation id="6824584962142919697">&Tikrinti elementus</translation> <translation id="6825184156888454064">Rūšiuoti pagal pavadinimą</translation> <translation id="6826872289184051766">Patvirtinti per USB</translation> +<translation id="6827604573767207488">Panašu, kad jau esate nustatę suasmenintą Padėjėją kitame įrenginyje. Dar geriau išnaudokite Padėjėjo galimybes įjungę tolesnį nustatymą.</translation> <translation id="6828153365543658583">Apriboti prisijungimą šiems naudotojams:</translation> <translation id="6828182567531805778">Įveskite slaptafrazę, kad sinchronizuotumėte duomenis</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5511,6 +5525,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> išjungė ADB derinimą. Kai iš naujo paleisite „<ph name="DEVICE_TYPE" />“, negalėsite tiesiogiai įkelti programų.</translation> <translation id="7328867076235380839">Netinkamas derinys</translation> <translation id="7329154610228416156">Nepavyko prisijungti, nes buvo sukonfigūruota naudoti nesaugų URL (<ph name="BLOCKED_URL" />). Susisiekite su administratoriumi.</translation> +<translation id="7329932885428707942">Dėl to mobiliojo ryšio tinklas gali būti trumpam atjungtas.</translation> <translation id="7332053360324989309">Skirtasis elementas: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Įgalinti prie doko prijungtą didintuvą</translation> <translation id="7335974957018254119">Naudoti rašybos tikrinimą</translation> @@ -6181,6 +6196,7 @@ <translation id="8059417245945632445">&Tikrinti įrenginius</translation> <translation id="8059456211585183827">Nėra galimų išsaugoti spausdintuvų.</translation> <translation id="8061091456562007989">Grąžinti ankstesnį variantą</translation> +<translation id="8061991877177392872">Panašu, kad jau esate nustatę „Voice Match“ naudodami Padėjėją kitame įrenginyje. Ankstesni įrašai buvo naudojami kuriant balso modelį šiame įrenginyje.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 popieriaus lapas}one{{COUNT} popieriaus lapas}few{{COUNT} popieriaus lapai}many{{COUNT} popieriaus lapo}other{{COUNT} popieriaus lapų}}</translation> <translation id="8062879968880283306">Nuskaitykite QR kodą naudodami įrenginio fotoaparatą arba įveskite operatoriaus pateiktą aktyvinimo kodą.</translation> <translation id="8063235345342641131">Numatytasis žalias pseudoportretas</translation> @@ -6452,6 +6468,7 @@ <translation id="8379991678458444070">Grįžkite čia greičiau pasižymėję šį skirtuką</translation> <translation id="8382913212082956454">Kopijuoti &el. pašto adresą</translation> <translation id="8386091599636877289">Politika nerasta.</translation> +<translation id="8386819192691131213">Leiskite Padėjėjui naudoti ekrane esančią informaciją, kad jis galėtų pateikti greitus atsakymus, pvz., vertimą, apibrėžtį, matavimo vienetų konvertavimą ir daugiau</translation> <translation id="8386903983509584791">Nuskaitymas baigtas</translation> <translation id="8387361103813440603">Neleidžiama peržiūrėti vietovės</translation> <translation id="8389264703141926739">Blokuoti pranešimus</translation> @@ -6937,6 +6954,7 @@ <translation id="8915370057835397490">Įkeliamas pasiūlymas</translation> <translation id="8916476537757519021">Inkognito antrinis kadras: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />, <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">Perkelti ekraną pelei pasiekus ekrano kraštus</translation> <translation id="8923880975836399332">Tamsi žalsvai mėlyna</translation> <translation id="8925458182817574960">&Nustatymai</translation> <translation id="8926389886865778422">Neklauskite dar kartą</translation> @@ -7015,6 +7033,7 @@ <translation id="9009708085379296446">Ar norėjote pakeisti šį puslapį?</translation> <translation id="9011163749350026987">Visada rodyti piktogramą</translation> <translation id="9011393886518328654">Laidos informacija</translation> +<translation id="9012122671773859802">Perkelti ekraną nepertraukiamai judinant pelę</translation> <translation id="9013037634206938463">Norint įdiegti „Linux“ reikia <ph name="INSTALL_SIZE" /> laisvos vietos. Kad padidintumėte nemokamos saugyklos vietos, ištrinkite failus iš įrenginio.</translation> <translation id="9013707997379828817">Administratorius atkūrė šį įrenginį. Išsaugokite svarbius failus, tada paleiskite jį iš naujo. Visi šiame įrenginyje esantys duomenys bus ištrinti.</translation> <translation id="901668144954885282">Atsarginės kopijos kūrimas „Google“ diske</translation> @@ -7059,6 +7078,7 @@ <translation id="9052404922357793350">Toliau blokuoti</translation> <translation id="9053563360605707198">Spausdinti abiejose pusėse</translation> <translation id="9053893665344928494">Prisiminti mano pasirinkimą</translation> +<translation id="9055278955535611574">Pasiekite Padėjėją pasakę „Ok Google“</translation> <translation id="9055636786322918818">Taikyti RC4 šifruotę. Naudojant šią parinktį padidėja rizika, nes RC4 šifrai nesaugūs.</translation> <translation id="9056810968620647706">Nerasta jokių atitikčių.</translation> <translation id="9057354806206861646">Tvarkaraščio atnaujinimas</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 228964dc..e2ade2cc 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -2970,7 +2970,6 @@ <translation id="4364567974334641491">Lietotne <ph name="APP_NAME" /> koplieto logu.</translation> <translation id="4364830672918311045">Parādīt paziņojumus</translation> <translation id="4366138410738374926">Drukāšana ir sākta</translation> -<translation id="437004882363131692">Saņemiet <ph name="DEVICE_TYPE" /> padomus, piedāvājumus un jaunumus, kā arī sniedziet atsauksmes. Varat anulēt abonementu jebkurā laikā.</translation> <translation id="4370425812909262207">Iepirkumu grozi paslēpti. Ja ieviesīsiet izmaiņas, tie tiks rādīti atkārtoti.</translation> <translation id="4370975561335139969">Ievadītā e-pasta adrese un parole neatbilst.</translation> <translation id="4374831787438678295">Linux instalēšanas programma</translation> @@ -3123,6 +3122,7 @@ <translation id="4538417792467843292">Dzēst vārdu</translation> <translation id="4538684596480161368">Vienmēr bloķēt smilškastē neievietotos spraudņus vietnē <ph name="HOST" /></translation> <translation id="4538792345715658285">Instalēts atbilstoši uzņēmuma politikai.</translation> +<translation id="4541123282641193691">Nevarēja verificēt kontu. Mēģiniet vēlreiz vai restartējiet Chromebook datoru.</translation> <translation id="4541662893742891060">Nevar izveidot savienojumu ar šo profilu. Lai saņemtu tehnisko atbalstu, sazinieties ar mobilo sakaru operatoru.</translation> <translation id="4542520061254486227">Lasīt jūsu datus vietnēs <ph name="WEBSITE_1" /> un <ph name="WEBSITE_2" /></translation> <translation id="4543778593405494224">Sertifikātu pārvaldnieks</translation> @@ -4141,6 +4141,7 @@ <translation id="574209121243317957">Tonis</translation> <translation id="5742505912938664543">Ja šeit pievienosiet sekundāro kontu, varēsiet to lietot, lai pārlūkotu tīmekļa saturu, lejupielādētu lietotnes, skatītu Gmail iesūtni un izmantotu citus Google pakalpojumus.</translation> <translation id="5746169159649715125">Saglabāt kā PDF failu</translation> +<translation id="5746261205461426123">Atvērt iestatīšanas ceļvedi</translation> <translation id="5747552184818312860">Termiņš</translation> <translation id="5747785204778348146">Izstrādātāju — nav stabila</translation> <translation id="5747809636523347288">Ielīmēt un doties uz <ph name="URL" /></translation> @@ -5292,6 +5293,7 @@ <translation id="708278670402572152">Atvienojiet, lai iespējotu skenēšanu</translation> <translation id="7084321615353200053">Atļaut vietnēm pieprasīt atļauju piekļūt jūsu kamerai (ieteicams)</translation> <translation id="7085389578340536476">Vai atļaut pārlūkam Chrome ierakstīt audio?</translation> +<translation id="7085805695634549980">Nevarēja izveidot savienojumu ar Google pakalpojumiem. Kļūdas kods: <ph name="ERROR_CODE" />.</translation> <translation id="7086672505018440886">Iekļaut Chrome žurnālfailus arhīvā.</translation> <translation id="7088434364990739311">Neizdevās palaist atjauninājumu pārbaudi (kļūdas kods: <ph name="ERROR" />).</translation> <translation id="7088561041432335295">Zip arhivētājs — atveriet un pakojiet ZIP failus lietotnē Faili.</translation> @@ -5529,6 +5531,7 @@ <translation id="7374376573160927383">Pārvaldīt USB ierīces</translation> <translation id="7375235221357833624">{0,plural, =1{Ierīce jāatjaunina stundas laikā}zero{Ierīce jāatjaunina # stundu laikā}one{Ierīce jāatjaunina # stundas laikā}other{Ierīce jāatjaunina # stundu laikā}}</translation> <translation id="7376553024552204454">Izcelt peles kursoru, kad tas tiek kustināts</translation> +<translation id="737728204345822099">Ieraksts par jūsu apmeklējumu šajā vietnē var tikt reģistrēts jūsu drošības atslēgā.</translation> <translation id="7377451353532943397">Turpināt bloķēt piekļuvi sensoriem</translation> <translation id="7378611153938412599">Nedrošas paroles ir viegli uzminēt. Noteikti izveidojiet drošas paroles. <ph name="BEGIN_LINK" />Skatiet vairāk drošības padomu.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Atveriet Chrome interneta veikalu</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 48c86ba2..eabf71b 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Пристапете до сериските уреди и уредите со Bluetooth</translation> <translation id="114036956334641753">Аудио и титлови</translation> <translation id="1140746652461896221">Блокирајте ги содржините на сите страници што ги посетувате</translation> +<translation id="1141953877381847186">Дозволете „Помошникот“ да ги користи информациите на екранот за да дава брзи одговори како превод, дефиниции, конверзија на единици и друго. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Имајте предвид:<ph name="END_BOLD" /> секогаш може да го промените ова подоцна во „Поставки за Помошникот на Google > Поврзани информации“.</translation> <translation id="1143142264369994168">Потписник на сертификат</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome не најде штетен софтвер на вашиот компјутер • Проверено пред 1 минута}one{Chrome не најде штетен софтвер на вашиот компјутер • Проверено пред {NUM_MINS} минута}other{Chrome не најде штетен софтвер на вашиот компјутер • Проверено пред {NUM_MINS} минути}}</translation> <translation id="1145593918056169051">Печатачот запре</translation> @@ -1437,7 +1440,9 @@ <translation id="2594999711683503743">Пребарајте на Google или внесете URL-адреса</translation> <translation id="2602501489742255173">Повлечете нагоре за да започнете</translation> <translation id="2603115962224169880">Чистење на компјутерот</translation> +<translation id="2603355571917519942">Voice Match е подготвена</translation> <translation id="2603463522847370204">Отвори во &инкогнито прозорец</translation> +<translation id="2604138917550693049">Пребарај ја сликата со Google Lens</translation> <translation id="2604255671529671813">Грешка во мрежното поврзување</translation> <translation id="2606246518223360146">Поврзи ги податоците</translation> <translation id="2606454609872547359">Не, продолжи без ChromeVox</translation> @@ -1780,6 +1785,7 @@ <translation id="2963151496262057773">Следниов приклучок не реагира: <ph name="PLUGIN_NAME" />Дали сакате да го запрете?</translation> <translation id="2964193600955408481">Оневозможи Wi-Fi</translation> <translation id="2964245677645334031">Видливост на „Споделување во близина“</translation> +<translation id="2966216232069818096">Дозволете вашиот „Помошник“ да користи информации на екранот за да ви помага</translation> <translation id="2966937470348689686">Управувајте со поставките за Android</translation> <translation id="2972581237482394796">&Повтори</translation> <translation id="2973324205039581528">Исклучи звук за сајт</translation> @@ -1876,6 +1882,7 @@ <translation id="308268297242056490">УРИ</translation> <translation id="3082780749197361769">Картичкава го користи фотоапаратот или микрофонот.</translation> <translation id="3083193146044397360">Привремено блокирано за да се заштити вашата безбедност</translation> +<translation id="3083899879156272923">Движи го екранот, а глувчето нека остане во центарот на екранот</translation> <translation id="3084548735795614657">Испушти за да се инсталира</translation> <translation id="3084771660770137092">Chrome остана без меморија или процесот за веб-страницата беше прекинат поради друга причина. За да продолжите, повторно вчитајте ја оваа или одете на друга страница.</translation> <translation id="3084958266922136097">Оневозможете го заштитникот на екранот</translation> @@ -2371,6 +2378,9 @@ <translation id="3654045516529121250">Прочитајте ги поставките за пристапност</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Има постојан пристап до една датотека.}one{Има постојан пристап до # датотека.}other{Има постојан пристап до # датотеки.}}</translation> <translation id="3658871634334445293">Забрзување на TrackPoint</translation> +<translation id="3659830472545192450">Voice Match му помага на вашиот „Помошник на Google“ да го идентификува вашиот глас на Chromebook и да ве разликува од останатите. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Имајте предвид:<ph name="END_BOLD" /> и сличен глас или снимка може да пристапат до вашите лични резултати. Подоцна може да ја отстраните дозволата за Voice Match, така што ќе ја исклучите во „Поставки за Помошникот“.</translation> <translation id="3660234220361471169">Недоверливи</translation> <translation id="3664511988987167893">Икона за екстензијата</translation> <translation id="3665589677786828986">Chrome откри дека некои од поставките на прелистувачот ги оштетила друга програма и ги ресетирала на првичните стандардни вредности.</translation> @@ -2979,7 +2989,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> споделува прозорец.</translation> <translation id="4364830672918311045">Прикажи ги известувањата</translation> <translation id="4366138410738374926">Печатењето започна</translation> -<translation id="437004882363131692">Добивајте совети, понуди и новости за <ph name="DEVICE_TYPE" /> и споделувајте повратни информации. Отпишете се во секое време.</translation> <translation id="4370425812909262207">Кошничките се сокриени. Ќе се појават повторно кога ќе извршите промени.</translation> <translation id="4370975561335139969">Е-поштата и лозинката што ги внесовте не се совпаѓаат</translation> <translation id="4374831787438678295">Инсталатор на Linux</translation> @@ -3559,6 +3568,7 @@ <translation id="5050330054928994520">Од текст во говор</translation> <translation id="5051836348807686060">Проверката на правопис не е поддржана за јазиците што ги избравте</translation> <translation id="5052499409147950210">Изменете го сајтот</translation> +<translation id="5053962746715621840">Пребарај ја сликата со Google Lens</translation> <translation id="5057110919553308744">Кога ќе кликнете на екстензијата</translation> <translation id="5057403786441168405">Управувајте со најавените сметки. Веб-сајтовите, апликациите и екстензиите во Chrome и Google Play може да ги користат сметкиве за приспособување на вашето доживување, зависно од дозволите. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Ограничи најавување</translation> @@ -4042,6 +4052,9 @@ <translation id="5610038042047936818">Префрли на режим на фотоапарат</translation> <translation id="561030196642865721">Колачиња од трети страни се дозволени на сајтов</translation> <translation id="5612734644261457353">Извинете, лозинката сепак не може да се потврди. Забелешка: доколку неодамна сте ја промениле лозинката, новата лозинка ќе се примени откако ќе се одјавите. Тука употребете ја старата лозинка.</translation> +<translation id="561308544008485315">Voice Match му помага на вашиот „Помошник на Google“ да го идентификува вашиот глас на Chromebook и да ве разликува од останатите. За да се заштеди батерија, „Ok Google“ е вклучено само кога уредот е поврзан на извор на напојување. За да извршите промени, одете во „Поставки“. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Имајте предвид:<ph name="END_BOLD" /> и сличен глас или снимка може да пристапат до вашите лични резултати. Подоцна може да ја отстраните дозволата за Voice Match, така што ќе ја исклучите во „Поставки за Помошникот“.</translation> <translation id="5614190747811328134">Известување за корисникот</translation> <translation id="5614553682702429503">Дали да се зачува лозинката?</translation> <translation id="5616726534702877126">Резервирајте големина</translation> @@ -5072,6 +5085,7 @@ <translation id="6824584962142919697">&Проверете ги елементите</translation> <translation id="6825184156888454064">Подреди по име</translation> <translation id="6826872289184051766">Потврди преку USB</translation> +<translation id="6827604573767207488">Се чини дека веќе сте поставиле персонализиран „Помошник“ на друг уред. Добијте уште повеќе од вашиот „Помошник“ со вклучување на следнава поставка.</translation> <translation id="6828153365543658583">Ограничи пријавување на следните корисници:</translation> <translation id="6828182567531805778">Внесете ја лозинката за да ги синхронизирате податоците</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5507,6 +5521,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> го оневозможи отстранувањето грешки на ADB Откако ќе го рестартирате вашиот <ph name="DEVICE_TYPE" />, нема да може да инсталирате апликации од непознат извор.</translation> <translation id="7328867076235380839">Неважечка комбинација</translation> <translation id="7329154610228416156">Најавувањето не успеа бидејќи беше конфигурирано да користи небезбедна URL-адреса (<ph name="BLOCKED_URL" />). Контактирајте со администраторот.</translation> +<translation id="7329932885428707942">Ова може да предизвика краток прекин на врската со мобилната мрежа.</translation> <translation id="7332053360324989309">Доделен работник: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Овозможи закотвена лупа</translation> <translation id="7335974957018254119">Користете проверка на правопис за</translation> @@ -5550,6 +5565,7 @@ <translation id="7374376573160927383">Управувајте со USB-уредите</translation> <translation id="7375235221357833624">{0,plural, =1{Ажурирајте го уредот во рок од еден час}one{Ажурирајте го уредот во рок од # час}other{Ажурирајте го уредот во рок од # часа}}</translation> <translation id="7376553024552204454">Нагласување на покажувачот на глувчето при движење</translation> +<translation id="737728204345822099">Запис за вашата посета на сајтов можеби ќе се чува на вашиот безбедносен клуч.</translation> <translation id="7377451353532943397">Продолжи со блокирање на пристапот до сензорите</translation> <translation id="7378611153938412599">Слабите лозинки се лесни за погаѓање. Уверете се дека создавате силни лозинки. <ph name="BEGIN_LINK" />Погледнете повеќе совети за безбедност.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Отворете ја Веб-продавницата на Chrome</translation> @@ -6176,6 +6192,7 @@ <translation id="8059417245945632445">&Провери уреди</translation> <translation id="8059456211585183827">Нема достапни печатачи за зачувување.</translation> <translation id="8061091456562007989">Врати како што беше</translation> +<translation id="8061991877177392872">Се чини дека веќе сте ја поставиле Voice Match за вашиот „Помошник на Google“ на друг уред. Претходните снимки се користеа за да се направи гласовниот модел за уредов.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 лист хартија}one{{COUNT} лист хартија}other{{COUNT} листови хартија}}</translation> <translation id="8062879968880283306">Скенирајте го QR-кодот со камерата на уредот или внесете код за активација од операторот.</translation> <translation id="8063235345342641131">Стандарден зелен аватар</translation> @@ -6450,6 +6467,7 @@ <translation id="8379991678458444070">Ако ја обележите картичкава, ќе може да се вратите тука набрзина</translation> <translation id="8382913212082956454">Копирај &адреса на е-пошта</translation> <translation id="8386091599636877289">Правилото не е пронајдено.</translation> +<translation id="8386819192691131213">Дозволете „Помошникот“ да ги користи информациите на екранот за да дава брзи одговори како превод, дефиниции, конверзија на единици и друго</translation> <translation id="8386903983509584791">Скенирањето заврши</translation> <translation id="8387361103813440603">Не им е дозволено да ја гледаат локацијата</translation> <translation id="8389264703141926739">Блокирај ги известувањата</translation> @@ -6933,6 +6951,7 @@ <translation id="8915370057835397490">Се вчитува предлог</translation> <translation id="8916476537757519021">Инкогнито подрамка: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> на <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Движи го екранот кога глувчето ги допира рабовите на екранот</translation> <translation id="8923880975836399332">Темна синозелена</translation> <translation id="8925458182817574960">&Поставки</translation> <translation id="8926389886865778422">Не прашувај повторно</translation> @@ -7011,6 +7030,7 @@ <translation id="9009708085379296446">Дали мислевте да ја промените страницава?</translation> <translation id="9011163749350026987">Секогаш прикажувај ја иконата</translation> <translation id="9011393886518328654">Белешки за верзијата</translation> +<translation id="9012122671773859802">Движи го екранот континуирано кога се движи глувчето</translation> <translation id="9013037634206938463">Потребни се <ph name="INSTALL_SIZE" /> слободен простор за инсталирање на Linux. За да го зголемите слободниот простор, избришете датотеки од уредот.</translation> <translation id="9013707997379828817">Администраторот го врати уредов на фабричките поставки. Зачувајте ги важните датотеки, а потоа рестартирајте. Ќе се избришат сите податоци на уредот.</translation> <translation id="901668144954885282">Направете бекап на Google Drive</translation> @@ -7055,6 +7075,7 @@ <translation id="9052404922357793350">Продолжи со блокирање</translation> <translation id="9053563360605707198">Двострано печатење</translation> <translation id="9053893665344928494">Запомни го мојот избор</translation> +<translation id="9055278955535611574">Пристапувајте до вашиот „Помошник“ со „Ok Google“</translation> <translation id="9055636786322918818">Наметнете RC4-шифрирање. Ако ја користите опцијава, ви се зголемува ризикот бидејќи RC4-шифрите се небезбедни.</translation> <translation id="9056810968620647706">Не се најдени совпаѓања.</translation> <translation id="9057354806206861646">Распоред за ажурирање</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 3d7442df96..111ae65 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -2964,7 +2964,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" />, ഒരു വിൻഡോ പങ്കിടുന്നു.</translation> <translation id="4364830672918311045">അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുക</translation> <translation id="4366138410738374926">പ്രിന്റ് ചെയ്യൽ ആരംഭിച്ചു</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> നുറുങ്ങുകൾ, ഓഫറുകൾ, അപ്ഡേറ്റുകൾ എന്നിവ നേടുകയും ഫീഡ്ബാക്ക് പങ്കിടുകയും ചെയ്യുക. ഏത് സമയത്തും വരിക്കാരല്ലാതാവുക.</translation> <translation id="4370425812909262207">കാർട്ടുകൾ മറച്ചിരിക്കുന്നു. നിങ്ങൾ മാറ്റങ്ങൾ വരുത്തുമ്പോൾ അവ വീണ്ടും ദൃശ്യമാകും.</translation> <translation id="4370975561335139969">നിങ്ങൾ നൽകിയ ഇമെയിലും പാസ്വേഡും പൊരുത്തപ്പെടുന്നില്ല</translation> <translation id="4374831787438678295">Linux ഇൻസ്റ്റാളർ</translation> @@ -3117,6 +3116,7 @@ <translation id="4538417792467843292">പദം ഇല്ലാതാക്കുക</translation> <translation id="4538684596480161368"><ph name="HOST" /> എന്നതില് എല്ലായ്പ്പോഴും ഈ അൺസാൻഡ്ബോക്സ് ചെയ്ത പ്ലഗിന്നുകളെ തടയുക</translation> <translation id="4538792345715658285">എന്റർപ്രൈസ് നയത്തിനാൽ ഇൻസ്റ്റാൾ ചെയ്യപ്പെട്ടത്</translation> +<translation id="4541123282641193691">നിങ്ങളുടെ അക്കൗണ്ട് പരിശോധിച്ചുറപ്പിക്കാനായില്ല. വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ Chromebook റീസ്റ്റാർട്ട് ചെയ്യുക.</translation> <translation id="4541662893742891060">ഈ പ്രൊഫൈലിലേക്ക് കണക്റ്റ് ചെയ്യാനാകുന്നില്ല. സാങ്കേതിക പിന്തുണയ്ക്ക് നിങ്ങളുടെ സേവനദാതാവിനെ ബന്ധപ്പെടുക.</translation> <translation id="4542520061254486227"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> എന്നിവയിലെ നിങ്ങളുടെ വിവരം വായിക്കുക</translation> <translation id="4543778593405494224">സർട്ടിഫിക്കറ്റ് മാനേജർ</translation> @@ -4136,6 +4136,7 @@ <translation id="574209121243317957">പിച്ച്</translation> <translation id="5742505912938664543">ഇവിടെ ഒരു ദ്വിതീയ അക്കൗണ്ട് ചേർക്കുമ്പോൾ, ആ അക്കൗണ്ട് ഉപയോഗിച്ച് വെബ് ബ്രൗസ് ചെയ്യാനും ആപ്പുകൾ ഡൗൺലോഡ് ചെയ്യാനും നിങ്ങളുടെ Gmail പരിശോധിക്കാനും മറ്റ് Google സേവനങ്ങൾ ഉപയോഗിക്കാനും നിങ്ങൾക്ക് കഴിയും.</translation> <translation id="5746169159649715125">PDF ആയി സംരക്ഷിക്കുക</translation> +<translation id="5746261205461426123">സജ്ജീകരണ ഗൈഡ് തുറക്കുക</translation> <translation id="5747552184818312860">കാലഹരണപ്പെടുന്നു</translation> <translation id="5747785204778348146">ഡെവലപ്പർ - അസ്ഥിരം</translation> <translation id="5747809636523347288">ഒട്ടിച്ച്, <ph name="URL" /> എന്നതിലേക്ക് പോവുക</translation> @@ -5288,6 +5289,7 @@ <translation id="708278670402572152">സ്കാനിംഗ് പ്രവർത്തനക്ഷമമാക്കാൻ വിച്ഛേദിക്കുക</translation> <translation id="7084321615353200053">നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാൻ സൈറ്റുകൾക്ക് അനുവാദം ചോദിക്കാം (നിർദ്ദേശിക്കുന്നത്)</translation> <translation id="7085389578340536476">ഓഡിയോ റെക്കോർഡ് ചെയ്യാൻ Chrome-നെ അനുവദിക്കണോ?</translation> +<translation id="7085805695634549980">Google സേവനങ്ങളുമായി കണക്റ്റ് ചെയ്യാനായില്ല. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation> <translation id="7086672505018440886">ശേഖരത്തിൽ Chrome ലോഗ് ഫയലുകൾ ഉൾപ്പെടുത്തുക.</translation> <translation id="7088434364990739311">അപ്ഡേറ്റ് പരിശോധന ആരംഭിക്കുന്നതിൽ പരാജയപ്പെട്ടു (പിശക് കോഡ് <ph name="ERROR" />).</translation> <translation id="7088561041432335295">Zip Archiver - Files ആപ്പിൽ ZIP ഫയലുകൾ തുറന്ന്, പായ്ക്ക് ചെയ്യുക.</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index b039235..9f397708 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -2962,7 +2962,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> цонх хуваалцаж байна.</translation> <translation id="4364830672918311045">Дэлгэцийн мэдэгдэл</translation> <translation id="4366138410738374926">Хэвлэж эхэлсэн</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" />-н зөвлөгөө, санал болон шинэчлэлтийг авч, cанал хүсэлт хуваалцаарай. Хүссэн үедээ захиалгаа цуцална уу.</translation> <translation id="4370425812909262207">Сагснуудыг нуусан. Таныг өөрчлөлт хийх үед тэд дахин гарч ирнэ.</translation> <translation id="4370975561335139969">Таны оруулсан имэйл болон нууц үг таарахгүй байна</translation> <translation id="4374831787438678295">Linux суулгагч</translation> @@ -5520,6 +5519,7 @@ <translation id="7374376573160927383">USB төхөөрөмжүүдийг удирдах</translation> <translation id="7375235221357833624">{0,plural, =1{Төхөөрөмжийг нэг цагийн дотор шинэчилнэ үү}other{Төхөөрөмжийг # цагийн дотор шинэчилнэ үү}}</translation> <translation id="7376553024552204454">Хулганы курсорыг хөдлөх явцад нь тодруулна уу</translation> +<translation id="737728204345822099">Таны энэ сайтад зочилсон тухай бүртгэлийг таны аюулгүй байдлын түлхүүрт хадгалж болзошгүй.</translation> <translation id="7377451353532943397">Мэдрэгчийн хандалтыг үргэлжлүүлэн хориглох</translation> <translation id="7378611153938412599">Сул нууц үгийг таахад хялбар байдаг. Сайн нууц үг үүсгэж байгаа эсэхээ шалгаарай. <ph name="BEGIN_LINK" />Аюулгүй байдлын бусад зөвлөгөөг харна уу.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome Веб Дэлгүүр нээх</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 0327261..ad4499d 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -2962,7 +2962,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> विंडो शेअर करीत आहे.</translation> <translation id="4364830672918311045">सूचना डिस्प्ले करा</translation> <translation id="4366138410738374926">प्रिंट करण्याच्या प्रक्रियेला सुरुवात झाली</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> बाबत टिपा, ऑफर व अपडेट मिळवा आणि फीडबॅक शेअर करा. सदस्यत्व कधीही रद्द करा.</translation> <translation id="4370425812909262207">कार्ट लपवली. तुम्ही बदल केल्यावर ती पुन्हा दिसतील.</translation> <translation id="4370975561335139969">तुम्ही एंटर केलेला ईमेल आणि पासवर्ड जुळत नाही</translation> <translation id="4374831787438678295">Linux इंस्टॉलर</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index c592b80..0f761169 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Akses peranti Bluetooth dan Bersiri anda</translation> <translation id="114036956334641753">Audio dan kapsyen</translation> <translation id="1140746652461896221">Sekat kandungan pada mana-mana halaman yang anda lawati</translation> +<translation id="1141953877381847186">Benarkan Assistant menggunakan maklumat pada skrin untuk memberikan jawapan pantas seperti terjemahan, takrif, penukaran unit dan pelbagai lagi. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Perlu diingat:<ph name="END_BOLD" /> Anda boleh menukar tetapan ini pada bila-bila masa kemudian dalam Tetapan Google Assistant > Maklumat berkaitan.</translation> <translation id="1143142264369994168">Penandatangan Sijil</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome tidak menemukan perisian berbahaya pada komputer anda • Disemak seminit yang lalu}other{Chrome tidak menemukan perisian berbahaya pada komputer anda • Disemak {NUM_MINS} minit yang lalu}}</translation> <translation id="1145593918056169051">Pencetak telah dihentikan</translation> @@ -1432,7 +1435,9 @@ <translation id="2594999711683503743">Cari Google atau taipkan URL</translation> <translation id="2602501489742255173">Leret ke atas untuk memulakan</translation> <translation id="2603115962224169880">Bersihkan komputer</translation> +<translation id="2603355571917519942">Voice Match sudah sedia</translation> <translation id="2603463522847370204">Buka dalam tetingkap &inkognito</translation> +<translation id="2604138917550693049">Cari imej dengan Google Lens</translation> <translation id="2604255671529671813">Ralat sambungan rangkaian</translation> <translation id="2606246518223360146">Pautkan Data</translation> <translation id="2606454609872547359">Tidak, teruskan tanpa ChromeVox</translation> @@ -1774,6 +1779,7 @@ <translation id="2963151496262057773">Pemalam berikut tidak responsif: <ph name="PLUGIN_NAME" />Adakah anda ingin menghentikannya?</translation> <translation id="2964193600955408481">Lumpuhkan Wi-Fi</translation> <translation id="2964245677645334031">Keterlihatan Kongsi Berdekatan</translation> +<translation id="2966216232069818096">Benarkan Assistant menggunakan maklumat pada skrin anda untuk memberikan bantuan</translation> <translation id="2966937470348689686">Urus pilihan Android</translation> <translation id="2972581237482394796">&Buat Semula</translation> <translation id="2973324205039581528">Redam Tapak</translation> @@ -1869,6 +1875,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Tab ini menggunakan kamera atau mikrofon anda.</translation> <translation id="3083193146044397360">Disekat buat sementara waktu untuk melindungi keselamatan anda</translation> +<translation id="3083899879156272923">Gerakkan skrin semasa tetikus dibiarkan di tengah-tengah skrin</translation> <translation id="3084548735795614657">Lepaskan untuk memasang</translation> <translation id="3084771660770137092">Sama ada Chrome kehabisan memori atau proses untuk halaman web dihentikan kerana beberapa sebab lain. Untuk meneruskan, muatkan semula atau pergi ke halaman lain.</translation> <translation id="3084958266922136097">Lumpuhkan penyelamat skrin</translation> @@ -2362,6 +2369,9 @@ <translation id="3654045516529121250">Baca tetapan kebolehaksesan anda</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Apl mempunyai akses tetap kepada satu fail.}other{Apl mempunyai akses tetap kepada # fail.}}</translation> <translation id="3658871634334445293">Pemecutan TrackPoint</translation> +<translation id="3659830472545192450">Voice Match membantu Google Assistant mengenal pasti suara anda pada Chromebook dan membezakan anda daripada orang lain. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Perlu diingat:<ph name="END_BOLD" /> Suara yang serupa atau rakaman suara mungkin dapat mengakses hasil carian peribadi anda juga. Anda boleh mengalih keluar kebenaran Voice Match kemudian dengan mematikannya dalam Tetapan Assistant.</translation> <translation id="3660234220361471169">Tidak Dipercayai</translation> <translation id="3664511988987167893">Ikon Sambungan</translation> <translation id="3665589677786828986">Chrome mengesan bahawa sesetengah tetapan anda telah terganggu oleh program lain dan menetapkannya semula kepada tetapan lalainya yang asal.</translation> @@ -2968,7 +2978,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> berkongsi tetingkap.</translation> <translation id="4364830672918311045">Paparkan pemberitahuan</translation> <translation id="4366138410738374926">Pencetakan dimulakan</translation> -<translation id="437004882363131692">Dapatkan petua, tawaran dan kemaskinian <ph name="DEVICE_TYPE" />, serta kongsikan maklum balas. Hentikan langganan pada bila-bila masa.</translation> <translation id="4370425812909262207">Troli disembunyikan. Troli akan dipaparkan semula apabila anda membuat perubahan.</translation> <translation id="4370975561335139969">E-mel dan kata laluan yang anda masukkan tidak padan</translation> <translation id="4374831787438678295">Pemasang Linux</translation> @@ -3545,6 +3554,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Semak ejaan tidak disokong untuk bahasa yang anda pilih</translation> <translation id="5052499409147950210">Edit tapak</translation> +<translation id="5053962746715621840">Cari Imej dengan Google Lens</translation> <translation id="5057110919553308744">Apabila anda mengklik sambungan</translation> <translation id="5057403786441168405">Urus akaun log masuk anda. Tapak web, apl dan sambungan dalam Chrome dan Google Play mungkin menggunakan akaun ini untuk menyesuaikan pengalaman anda, bergantung pada kebenaran. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Sekat log masuk</translation> @@ -4027,6 +4037,9 @@ <translation id="5610038042047936818">Beralih ke mod kamera</translation> <translation id="561030196642865721">Kuki pihak ketiga dibenarkan di tapak ini</translation> <translation id="5612734644261457353">Maaf, kata laluan anda masih tidak dapat disahkan. Perhatian: jika anda menukar kata laluan anda baru-baru ini, kata laluan baharu anda akan digunakan apabila anda log keluar, sila gunakan kata laluan yang lama di sini.</translation> +<translation id="561308544008485315">Voice Match membantu Google Assistant mengenal pasti suara anda pada Chromebook dan membezakan anda daripada orang lain. Untuk menjimatkan bateri, “Ok Google” hanya dihidupkan apabila peranti anda disambungkan kepada sumber kuasa. Untuk membuat perubahan, pergi ke Tetapan. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Perlu diingat:<ph name="END_BOLD" /> Suara yang serupa atau rakaman suara mungkin dapat mengakses hasil carian peribadi anda juga. Anda boleh mengalih keluar kebenaran Voice Match kemudian dengan mematikannya dalam Tetapan Assistant.</translation> <translation id="5614190747811328134">Notis Pengguna</translation> <translation id="5614553682702429503">Simpan kata laluan?</translation> <translation id="5616726534702877126">Saiz rizab</translation> @@ -5050,6 +5063,7 @@ <translation id="6824584962142919697">&Periksa unsur</translation> <translation id="6825184156888454064">Isih mengikut nama</translation> <translation id="6826872289184051766">Sahkan melalui USB</translation> +<translation id="6827604573767207488">Nampaknya anda telah pun menyediakan Assistant yang diperibadikan pada peranti lain. Dapatkan pelbagai lagi manfaat daripada Assistant anda dengan menghidupkan tetapan berikut.</translation> <translation id="6828153365543658583">Hadkan log masuk bagi pengguna berikut:</translation> <translation id="6828182567531805778">Masukkan ungkapan laluan anda untuk menyegerakkan data anda</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5484,6 +5498,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> telah melumpuhkan penyahpepijatan ADB. Sebaik sahaja anda memulakan semula <ph name="DEVICE_TYPE" />, anda tidak akan dapat memuat sisi apl.</translation> <translation id="7328867076235380839">Gabungan tidak sah</translation> <translation id="7329154610228416156">Log masuk gagal kerana telah dikonfigurasikan untuk menggunakan URL tidak selamat (<ph name="BLOCKED_URL" />). Sila hubungi pentadbir anda.</translation> +<translation id="7329932885428707942">Tindakan ini mungkin mengakibatkan rangkaian selular terputus sambungan sebentar.</translation> <translation id="7332053360324989309">Pekerja Khusus: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Dayakan penggadang yang didok</translation> <translation id="7335974957018254119">Gunakan semak ejaan untuk</translation> @@ -5527,6 +5542,7 @@ <translation id="7374376573160927383">Urus peranti USB</translation> <translation id="7375235221357833624">{0,plural, =1{Kemas kini peranti dalam masa sejam}other{Kemas kini peranti dalam masa # jam}}</translation> <translation id="7376553024552204454">Serlahkan kursor tetikus semasa kursor bergerak</translation> +<translation id="737728204345822099">Rekod lawatan anda ke laman ini mungkin disimpan pada kunci keselamatan anda.</translation> <translation id="7377451353532943397">Teruskan menyekat akses penderia</translation> <translation id="7378611153938412599">Kata laluan lemah mudah diteka. Pastikan anda membuat kata laluan kukuh. <ph name="BEGIN_LINK" />Lihat pelbagai lagi petua keselamatan.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Buka Gedung Web Chrome</translation> @@ -6153,6 +6169,7 @@ <translation id="8059417245945632445">&Periksa peranti</translation> <translation id="8059456211585183827">Tiada pencetak tersedia untuk disimpan.</translation> <translation id="8061091456562007989">Tukar kepada asal</translation> +<translation id="8061991877177392872">Nampaknya anda telah pun menyediakan Voice Match dengan Assistant pada peranti lain. Rakaman terdahulu ini telah digunakan untuk membuat model suara pada peranti ini.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 helai kertas}other{{COUNT} helai kertas}}</translation> <translation id="8062879968880283306">Imbas kod QR menggunakan kamera peranti atau masukkan kod pengaktifan yang disediakan oleh pembawa anda.</translation> <translation id="8063235345342641131">Avatar hijau lalai</translation> @@ -6423,6 +6440,7 @@ <translation id="8379991678458444070">Tandai tab ini untuk kembali ke sini dengan cepat</translation> <translation id="8382913212082956454">Salin &alamat e-mel</translation> <translation id="8386091599636877289">Dasar tidak ditemui.</translation> +<translation id="8386819192691131213">Benarkan Assistant menggunakan maklumat pada skrin untuk memberikan jawapan pantas seperti terjemahan, takrif, penukaran unit dan pelbagai lagi</translation> <translation id="8386903983509584791">Pengimbasan selesai</translation> <translation id="8387361103813440603">Tidak dibenarkan untuk melihat lokasi anda</translation> <translation id="8389264703141926739">Sekat pemberitahuan</translation> @@ -6900,6 +6918,7 @@ <translation id="8915370057835397490">Memuatkan cadangan</translation> <translation id="8916476537757519021">Subbingkai Inkognito: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Gerakkan skrin apabila tetikus menyentuh tepi skrin</translation> <translation id="8923880975836399332">Hijau kebiruan gelap</translation> <translation id="8925458182817574960">&Tetapan</translation> <translation id="8926389886865778422">Jangan tanya lagi</translation> @@ -6977,6 +6996,7 @@ <translation id="9009708085379296446">Adakah anda bermaksud untuk menukar halaman ini?</translation> <translation id="9011163749350026987">Sentiasa tunjukkan ikon</translation> <translation id="9011393886518328654">Nota keluaran</translation> +<translation id="9012122671773859802">Gerakkan skrin secara berterusan semasa tetikus digerakkan</translation> <translation id="9013037634206938463"><ph name="INSTALL_SIZE" /> ruang kosong diperlukan untuk memasang Linux. Untuk meningkatkan ruang kosong, padamkan fail daripada peranti anda.</translation> <translation id="9013707997379828817">Pentadbir anda membalikkan peranti ini. Sila simpan fail penting, kemudian mulakan semula. Semua data pada peranti akan dipadamkan.</translation> <translation id="901668144954885282">Sandarkan pada Google Drive</translation> @@ -7021,6 +7041,7 @@ <translation id="9052404922357793350">Teruskan menyekat</translation> <translation id="9053563360605707198">Cetak pada kedua-dua belah halaman</translation> <translation id="9053893665344928494">Ingat pilihan saya</translation> +<translation id="9055278955535611574">Akses Assistant anda dengan "Ok Google"</translation> <translation id="9055636786322918818">Kuat kuasakan penyulitan RC4. Penggunaan pilihan ini akan meningkatkan risiko anda, kerana sifer RC4 tidak selamat.</translation> <translation id="9056810968620647706">Tiada padanan dijumpai.</translation> <translation id="9057354806206861646">Kemas kini jadual</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 3eadcef..f024101b1 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -2978,7 +2978,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> သည်ဝင်းဒိုးတစ်ခုကို မျှဝေနေပါသည်။</translation> <translation id="4364830672918311045">ပြသမှု သတိပေးချက်များ</translation> <translation id="4366138410738374926">ပုံနှိပ်ခြင်း စတင်ပါပြီ</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> အကြံပြုချက်၊ ကမ်းလှမ်းချက်နှင့် အပ်ဒိတ်များ ရယူပြီး အကြံပြုချက်ကို မျှဝေပါ။ မှာယူမှုကို အချိန်မရွေး ရပ်ဆိုင်းနိုင်သည်။</translation> <translation id="4370425812909262207">ဈေးခြင်းတောင်းများ ဖျောက်ထားသည်။ အပြောင်းအလဲများလုပ်သောအခါ ပေါ်လာမည်။</translation> <translation id="4370975561335139969">အီးမေးလိပ်စာနှင့် သင်ရိုက်ထည့်သော စကားဝှက် ကိုက်ညီမှု မရှိပါ</translation> <translation id="4374831787438678295">Linux ထည့်သွင်းကိရိယာ</translation> @@ -5547,6 +5546,7 @@ <translation id="7374376573160927383">USB ကိရိယာများ စီမံရန်</translation> <translation id="7375235221357833624">{0,plural, =1{စက်ကို တစ်နာရီအတွင်း အပ်ဒိတ်လုပ်ပါ}other{စက်ကို # နာရီအတွင်း အပ်ဒိတ်လုပ်ပါ}}</translation> <translation id="7376553024552204454">မြှားရွေ့လျားနေသည့်အချိန်တွင် ၎င်းကိုထင်ရှားအောင်ပြုလုပ်ပါ</translation> +<translation id="737728204345822099">သင်၏ လုံခြုံရေးကီးတွင် ဤဝဘ်ဆိုက်သို့ ဝင်ကြည့်သည့်မှတ်တမ်းကို သိမ်းထားနိုင်သည်။</translation> <translation id="7377451353532943397">အာရုံခံကိရိယာ အသုံးပြုခွင့်ကို ဆက်လက်ပိတ်ထားရန်</translation> <translation id="7378611153938412599">လုံခြုံမှုလျော့နည်းသည့် စကားဝှက်များကို အလွယ်တကူ ခန့်မှန်းနိုင်သည်။ လုံခြုံမှုမြင့်သည့် စကားဝှက်များကို သတ်မှတ်ပါ။ <ph name="BEGIN_LINK" />နောက်ထပ် လုံခြုံရေးအကြံပြုချက်များ ကြည့်ရန်။<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome Web စတိုးကို ဖွင့်ရန်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 02bb835..63cd23f 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -125,6 +125,9 @@ <translation id="1140351953533677694">तपाईंको ब्लूटूथ र सिरियल यन्त्रहरूको पहुँच गर्नुहोस्</translation> <translation id="114036956334641753">अडियो तथा क्याप्सनहरू</translation> <translation id="1140746652461896221">तपाईं जाने जुनसुकै पृष्ठका सामग्रीलाई रोक लगाउने</translation> +<translation id="1141953877381847186">अनुवाद, परिभाषा, एकाइ रूपान्तरणलगायतका द्रुत जवाफहरू दिने प्रयोजनका लागि सहायकलाई स्क्रिनमा भएको जानकारी प्रयोग गर्ने अनुमति दिनुहोस्। + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ख्याल गर्नुहोस्:<ph name="END_BOLD" /> तपाईं Google सहायकसम्बन्धी सेटिङ > सम्बन्धित जानकारीमा गई पछि जुनसुकै बेला यो सेटिङ परिवर्तन गर्न सक्नुहुन्छ।</translation> <translation id="1143142264369994168">प्रमाणपत्र साइनर</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome ले तपाईंको कम्प्युटरमा कुनै हानिकारक सफ्टवेयर भेट्टाएन • १ मिनेटअघि जाँच गरिएको}other{Chrome ले तपाईंको कम्प्युटरमा कुनै हानिकारक सफ्टवेयर भेट्टाएन • {NUM_MINS} मिनेटअघि जाँच गरिएको}}</translation> <translation id="1145593918056169051">प्रिन्टरले काम गरेको छैन</translation> @@ -1428,7 +1431,9 @@ <translation id="2594999711683503743">Google मा खोज्नुहोस् वा URL टाइप गर्नुहोस्</translation> <translation id="2602501489742255173">सुरु गर्न माथितिर स्वाइप गर्नुहोस्</translation> <translation id="2603115962224169880">कम्प्युटरमा ठाउँ खाली गर्नुहोस्</translation> +<translation id="2603355571917519942">Voice Match तयार छ</translation> <translation id="2603463522847370204">&इनकगनिटो विण्डोमा खोल्नुहोस्</translation> +<translation id="2604138917550693049">Google लेन्समार्फत फोटो खोज्नुहोस्</translation> <translation id="2604255671529671813">नेटवर्कको जडानसम्बन्धी त्रुटि</translation> <translation id="2606246518223360146">डेटा लिंक गर्नुहोस्</translation> <translation id="2606454609872547359">अहँ, ChromeVox सक्रिय नगरी अगाडि बढ्नुहोस्</translation> @@ -1771,6 +1776,7 @@ <translation id="2963151496262057773">निम्न प्लगइनले जवाफहीन छ: <ph name="PLUGIN_NAME" /> के तपाईं यसलाई बन्द गर्न चाहनुहुन्छ?</translation> <translation id="2964193600955408481">Wi-Fi असक्षम गर्नुहोस्</translation> <translation id="2964245677645334031">नजिकैका यन्त्रसँग सेयर गर्ने सुविधामा भएको पहुँचसम्बन्धी सेटिङ</translation> +<translation id="2966216232069818096">तपाईंलाई मद्दत गर्ने प्रयोजनका लागि सहायकलाई तपाईंको यन्त्रको स्क्रिनमा भएको जानकारी प्रयोग गर्न दिनुहोस्</translation> <translation id="2966937470348689686">Android सम्बन्धी प्राथमिकताहरूको व्यवस्थापन गर्नुहोस्</translation> <translation id="2972581237482394796">&फेरि गर्नुहोस्</translation> <translation id="2973324205039581528">साइट म्युट गर्नुहोस्</translation> @@ -1866,6 +1872,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">यो ट्याबले तपाईंको क्यामेरा वा माइक्रोफोन प्रयोग गरिरहेको छ।</translation> <translation id="3083193146044397360">तपाईंको सुरक्षाको बचाउ गर्नका लागि यसमाथि केही बेर रोक लगाइएको छ</translation> +<translation id="3083899879156272923">माउसको कर्सर स्क्रिनको केन्द्रमा राखेर स्क्रिन सारियोस्</translation> <translation id="3084548735795614657">स्थापना गर्नको लागि छोड्नुहोस्</translation> <translation id="3084771660770137092">या त Chrome स्मृतिबाहिर गयो वा केही अन्य कारणले गर्दा वेवपेज समाप्त भयो । जारी राख्न, रिलोड गर्नुहोस् वा अर्को पानामा जानुहोस् ।</translation> <translation id="3084958266922136097">स्क्रिन सेभर असक्षम पार्नुहोस्</translation> @@ -2359,6 +2366,9 @@ <translation id="3654045516529121250">तपाइँका पहुँच सेटिङहरू पढ्नुहोस्</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ यसको एउटा फाइलमा स्थायी पहुँच छ।}other{ यसको # फाइलहरूमा स्थायी पहुँच छ।}}</translation> <translation id="3658871634334445293">TrackPoint एक्सिलेरेसन</translation> +<translation id="3659830472545192450">Google सहायकले तपाईंको Chromebook मा Voice Match का सहायताले तपाईंको आवाज चिन्छ र बोल्ने व्यक्ति तपाईं हो कि अरू हो भन्ने कुरा छुट्याउँछ। + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ख्याल राख्नुहोस्:<ph name="END_BOLD" /> तपाईंको आवाजसँग मिल्दोजुल्दो आवाज वा रेकर्डिङको प्रयोग गरेर पनि तपाईंका व्यक्तिगत परिणाम हेर्न सकिने सम्भावना हुन्छ। तपाईं पछि सहायकसम्बन्धी सेटिङमा गई Voice Match लाई दिइएको अनुमति अफ गरेर सो अनुमति रद्द गर्न सक्नुहुन्छ।</translation> <translation id="3660234220361471169">अविश्वासनीय</translation> <translation id="3664511988987167893">विस्तारसम्बन्धी आइकन</translation> <translation id="3665589677786828986">Chrome ले तपाईंका केही सेटिङहरू अर्को कार्यक्रमले विकृत भएका थिए भनि पत्ता लगाएर तिनीहरूलाई तिनीहरूको मूल पूर्वनिर्धारितहरूमा रिसेट गर्यो।</translation> @@ -2964,7 +2974,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> एउटा विन्डोलाई साझेदारी गर्दैछ</translation> <translation id="4364830672918311045">सूचनाहरू देखाउनुहोस्</translation> <translation id="4366138410738374926">प्रिन्ट गर्ने कार्य सुरु भयो</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> सम्बन्धी सुझाव, योजना तथा अपडेटहरू प्राप्त गर्नुहोस् र प्रतिक्रिया दिनुहोस्। जुनसुकै बेला सदस्यता रद्द गर्नुहोस्।</translation> <translation id="4370425812909262207">कार्टहरू नदेखिने पारिएको छ। तपाईंले सेटिङ बदल्नुभयो भने ती कार्टहरू फेरि देखिने छन्।</translation> <translation id="4370975561335139969">तपाईँले प्रविष्टि गर्नुभएको इमेल र पासवर्ड मेल खाँदैनन्</translation> <translation id="4374831787438678295">Linux को स्थापनाकर्ता</translation> @@ -3117,6 +3126,7 @@ <translation id="4538417792467843292">शब्द मेट्नुहोस्</translation> <translation id="4538684596480161368"><ph name="HOST" />मा स्यान्डबक्स हटाइएको प्लग इनहरूलाई सधैँ रोक्नुहोस्।</translation> <translation id="4538792345715658285">उद्योग नीतिद्वारा स्थपित।</translation> +<translation id="4541123282641193691">तपाईंको खाता पुष्टि गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस् वा आफ्नो Chromebook रिस्टार्ट गर्नुहोस्।</translation> <translation id="4541662893742891060">यो प्रोफाइलमा कनेक्ट गर्न सकिएन। प्राविधिक सहायता प्राप्त गर्न कृपया आफ्नो मोबाइल सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।</translation> <translation id="4542520061254486227"><ph name="WEBSITE_1" /> र <ph name="WEBSITE_2" />मा तपाईंको डेटा पढ्नुहोस्</translation> <translation id="4543778593405494224">प्रमाणपत्र व्यवस्थापक</translation> @@ -3541,6 +3551,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">तपाईंले चयन गर्नुभएको भाषामा हिज्जे परीक्षण गर्ने सुविधा प्रयोग गर्न मिल्दैन</translation> <translation id="5052499409147950210">साइट सम्पादन गर्नुहोस्</translation> +<translation id="5053962746715621840">Google लेन्समार्फत फोटो खोज्नुहोस्</translation> <translation id="5057110919553308744">तपाईंले विस्तारमा क्लिक गर्दा</translation> <translation id="5057403786441168405">आफ्ना साइन इन गरिएका खाताहरू व्यवस्थापन गर्नुहोस्। Chrome तथा Google Play मा रहेका वेबसाइट, एप र एक्स्टेन्सनहरूले तपाईंले अनुमति दिएअनुसार तपाईंको अनुभव तपाईं अनुकूल पार्न यी खाताहरू प्रयोग गर्न सक्छन्। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation> <translation id="5059241099014281248">साइन इन गर्ने कार्य प्रतिबन्धित गर्नुहोस्</translation> @@ -4022,6 +4033,9 @@ <translation id="5610038042047936818">क्यामेरा मोड प्रयोग गर्नुहोस्</translation> <translation id="561030196642865721">यो साइटमा तेस्रो पक्षीय कुकीहरूलाई अनुमति दिइएको छ</translation> <translation id="5612734644261457353">माफ गर्नुहोस्, तपाइँको पासवर्ड अझै पनि रुजू गर्न सकिएन। नोट: यदि तपाइँले हालै तपाइँको पासवर्ड परिवर्तन गर्नुभएको छ भने, तपाइँले साइन आउट गरे पछि तपाइँको नयाँ पासवर्ड लागू हुनेछ, कृपया पुरानो पासवर्ड यहाँ प्रयोग गर्नुहोस्।</translation> +<translation id="561308544008485315">Google सहायकले तपाईंको Chromebook मा Voice Match का सहायताले तपाईंको आवाज चिन्छ र बोल्ने व्यक्ति तपाईं हो कि अरू हो भन्ने कुरा छुट्याउँछ। ब्याट्री बचत गर्न सकियोस् भन्नाका खातिर तपाईंको यन्त्र बिजुलीको स्रोतमा जोडिएका बेला मात्र "Ok Google" अन हुन्छ। यो सेटिङ परिवर्तन गर्न सेटिङमा जानुहोस्। + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ख्याल राख्नुहोस्:<ph name="END_BOLD" /> तपाईंको आवाजसँग मिल्दोजुल्दो आवाज वा रेकर्डिङको प्रयोग गरेर पनि तपाईंका व्यक्तिगत परिणाम हेर्न सकिने सम्भावना हुन्छ। तपाईं पछि सहायकसम्बन्धी सेटिङमा गई Voice Match लाई दिइएको अनुमति अफ गरेर सो अनुमति रद्द गर्न सक्नुहुन्छ।</translation> <translation id="5614190747811328134">प्रयोगकर्त सूचना</translation> <translation id="5614553682702429503">पासवर्ड सुरक्षित गर्नुहोस्</translation> <translation id="5616726534702877126">आकार रिजर्भ गर्नुहोस्</translation> @@ -4134,6 +4148,7 @@ <translation id="574209121243317957">पिच</translation> <translation id="5742505912938664543">तपाईंले यहाँ कुनै दोस्रो खाता हाल्नुभयो भने तपाईं त्यो खाता प्रयोग गरी वेब चलाउन, एपहरू डाउनलोड गर्न, आफ्नो Gmail जाँच्न तथा Google का अन्य सेवाहरू प्रयोग गर्न सक्नु हुने छ।</translation> <translation id="5746169159649715125">पीडीएपको रूपमा बचत गर्नुहोस्</translation> +<translation id="5746261205461426123">सेटअप गाइड खोल्नुहोस्</translation> <translation id="5747552184818312860">म्याद सकिन्छ</translation> <translation id="5747785204778348146">विकासकर्ता - अस्थिर</translation> <translation id="5747809636523347288">टाँस्नुहोस् र <ph name="URL" /> मा जानुहोस्</translation> @@ -5044,6 +5059,7 @@ <translation id="6824584962142919697">तत्त्वहरूको निरीक्षण गर्नुहोस्</translation> <translation id="6825184156888454064">नामअनुसार क्रमबद्ध गर्नुहोस्</translation> <translation id="6826872289184051766">USB मार्फत पुष्टि गर्नुहोस्</translation> +<translation id="6827604573767207488">तपाईंले कुनै अर्को यन्त्रमा आफ्नो आवश्यकताअनुसार सहायक सेटअप गरिसक्नुभएको छ जस्तो देखिन्छ। निम्न सेटिङ अन गरी आफ्नो सहायकबाट अझ बढी फाइदा लिनुहोस्।</translation> <translation id="6828153365543658583">निम्न प्रयोगकर्ता साइन इन प्रतिबन्धित गर्नुहोस्ः</translation> <translation id="6828182567531805778">आफ्नो डेटा सिंक गर्न आफ्नो पासफ्रेज प्रविष्टि गर्नुहोस्</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5284,6 +5300,7 @@ <translation id="708278670402572152">स्क्यान गर्ने कार्यलाई सक्षम पार्न जडान विच्छेद गर्नुहोस्</translation> <translation id="7084321615353200053">साइटहरूले तपाईंको क्यामेरा प्रयोग गर्ने अनुमति माग्न सक्छन् (सिफारिस गरिएको)</translation> <translation id="7085389578340536476">Chrome लाई अडियो रेकर्ड गर्न दिने हो?</translation> +<translation id="7085805695634549980">Google का सेवाहरूमा कनेक्ट गर्न सकिएन। त्रुटिसम्बन्धी कोड: <ph name="ERROR_CODE" />।</translation> <translation id="7086672505018440886">अभिलेखमा Chrome का लग फाइलहरू समावेश गरियोस्।</translation> <translation id="7088434364990739311">अद्यावधिक जाँच सुरु हुन असफल भयो (त्रुटि कोड <ph name="ERROR" />)।</translation> <translation id="7088561041432335295">Zip Archiver - फाइल अनुप्रयोगमार्फत जिप फाइलहरू खोल्नुहोस् र प्याक गर्नुहोस्।</translation> @@ -5478,6 +5495,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> ले ADB डिबग प्रक्रिया अफ गर्नुभएको छ। तपाईंले आफ्नो <ph name="DEVICE_TYPE" /> रिस्टार्ट गरेपछि तपाईं एपहरू प्ले स्टोर बाहेकका श्रोतबाट इन्स्टल सक्नु हुने छैन।</translation> <translation id="7328867076235380839">अमान्य संयोजन</translation> <translation id="7329154610228416156">साइन इन विफल भयो किनभने यसलाई एउटा गैर-सुरक्षित URL (<ph name="BLOCKED_URL" />) सँग कन्फिगर गरिएको थियो। कृपया तपाईँको प्रशासकसँग सम्पर्क गर्नुहोस्।</translation> +<translation id="7329932885428707942">तपाईंले यसो गर्नुभयो भने मोबाइल नेटवर्क केही समयका लागि डिस्कनेक्ट हुन सक्छ।</translation> <translation id="7332053360324989309">यसै कामको लागि तोकिएको कर्मचारी: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">डक गरिएको म्याग्निफायर सक्षम पार्नुहोस्</translation> <translation id="7335974957018254119">यी भाषाहरूका लागि हिज्जे जाँच प्रयोग गर्नुहोस्</translation> @@ -6146,6 +6164,7 @@ <translation id="8059417245945632445">यन्त्रहरू &निरीक्षण गर्नुहोस्</translation> <translation id="8059456211585183827">सुरक्षित गर्नका लागि कुनै पनि प्रिन्टर उपलब्ध छैन।</translation> <translation id="8061091456562007989">यसलाई परिवर्तन गरी पहिलेको जस्तै बनाउनुहोस्</translation> +<translation id="8061991877177392872">तपाईंले आफ्नो सहायकमार्फत अर्को यन्त्रमा Voice Match सेटअप गरिसक्नुभएको छ जस्तो देखिन्छ। यो यन्त्रमा आवाजको मोडेल बनाउनका लागि ती पहिलेका रेकर्डिङहरू प्रयोग गरिएका छन्।</translation> <translation id="8062844841289846053">{COUNT,plural, =1{कागजको एउटा पाना}other{कागजका {COUNT} वटा पाना}}</translation> <translation id="8062879968880283306">यन्त्रको क्यामेरा प्रयोग गरी QR कोड स्क्यान गर्नुहोस् वा आफ्नो मोबाइल सेवा प्रदायकले उपलब्ध गराएको सक्रिय गर्ने कोड हाल्नुहोस्।</translation> <translation id="8063235345342641131">पूर्वनिर्धारित हरियो अवतार</translation> @@ -6415,6 +6434,7 @@ <translation id="8379991678458444070">यो ट्याबमा पुस्तक चिन्ह लगाएर छिट्टै यहाँ फर्कनुहोस्</translation> <translation id="8382913212082956454">&इमेल ठेगानाको प्रतिलिपी बनाउनुहोस्</translation> <translation id="8386091599636877289">नीति फेला परेन।</translation> +<translation id="8386819192691131213">अनुवाद, परिभाषा, एकाइ रूपान्तरणलगायतका द्रुत जवाफहरू दिने प्रयोजनका लागि सहायकलाई स्क्रिनमा भएको जानकारी प्रयोग गर्ने अनुमति दिनुहोस्</translation> <translation id="8386903983509584791">स्क्यान कार्य पूरा भयो</translation> <translation id="8387361103813440603">तपाईंको स्थान हेर्ने अनुमति नदिइएका साइटहरू</translation> <translation id="8389264703141926739">सूचनाहरू ब्लक गर्नुहोस्</translation> @@ -6892,6 +6912,7 @@ <translation id="8915370057835397490">सुझावहरू लोड गर्दै</translation> <translation id="8916476537757519021">इनकगनिटो सबफ्रेम: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> को <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">माउसको कर्सरले स्क्रिनका किनारामा छुँदा स्क्रिन सारियोस्</translation> <translation id="8923880975836399332">गाढा निलो-हरियो मिश्रित रङ्ग</translation> <translation id="8925458182817574960">&सेटिङहरू</translation> <translation id="8926389886865778422">फेरि नसोध्नुहोस्</translation> @@ -6969,6 +6990,7 @@ <translation id="9009708085379296446">तपाईंले यो पृष्ठ परिवर्तन गर्न खोज्नुभएको हो?</translation> <translation id="9011163749350026987">सधैँ आइकन देखाउनुहोस्</translation> <translation id="9011393886518328654">विमोचन टिप्पणी</translation> +<translation id="9012122671773859802">माउसको कर्सर सरेसँगै स्क्रिन पनि निरन्तर सारियोस्</translation> <translation id="9013037634206938463">Linux प्रयोग गर्न कम्तीमा पनि <ph name="INSTALL_SIZE" /> खाली ठाउँ आवश्यक पर्छ। थप ठाउँ खाली गर्न आफ्नो यन्त्रमा भएका फाइलहरू मेटाउनुहोस्।</translation> <translation id="9013707997379828817">तपाईंको प्रशासकले यो यन्त्रलाई पहिलेको स्थितिमा फर्काउनुभयो। कृपया महत्त्वपूर्ण फाइलहरू सुरक्षित गरी पुनः सुरु गर्नुहोस्। यन्त्रमा रहेका सम्पूर्ण डेटा मेटाइने छ।</translation> <translation id="901668144954885282">Google ड्राइभमा ब्याकअप गर्नुहोस्</translation> @@ -7013,6 +7035,7 @@ <translation id="9052404922357793350">रोक लगाइराख्नुहोस्</translation> <translation id="9053563360605707198">दुवैतिर प्रिन्ट गर्नुहोस्</translation> <translation id="9053893665344928494">मेरो छनोट सम्झनुहोस्</translation> +<translation id="9055278955535611574">"Ok Google" भनेर आफ्नो सहायक सक्रिय गर्नुहोस्</translation> <translation id="9055636786322918818">RC4 इन्क्रिप्सन लागू गर्नुहोस्। RC4 साइफरहरू असुरक्षित हुने हुनाले यो विकल्पको प्रयोग गर्नुले तपाईंको जोखिममा वृद्धि हुन्छ।</translation> <translation id="9056810968620647706">जोडाहरू भेटिएन।</translation> <translation id="9057354806206861646">अद्यावधिक तालिका</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index c6c02bf..7e6c6628 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -2978,7 +2978,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> deelt een venster.</translation> <translation id="4364830672918311045">Meldingen weergeven</translation> <translation id="4366138410738374926">Afdrukken gestart</translation> -<translation id="437004882363131692">Krijg tips, aanbiedingen en updates over <ph name="DEVICE_TYPE" /> en deel je feedback. Je kunt je afmelden wanneer je maar wilt.</translation> <translation id="4370425812909262207">Winkelwagens zijn verborgen. Ze worden opnieuw getoond als je wijzigingen aanbrengt.</translation> <translation id="4370975561335139969">Het opgegeven e-mailadres en wachtwoord komen niet overeen</translation> <translation id="4374831787438678295">Linux-installatieprogramma</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 211e3ae..3a1f3d6 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">bruke Bluetooth og de seriekoblede enhetene dine</translation> <translation id="114036956334641753">Lyd og teksting</translation> <translation id="1140746652461896221">Blokkér innhold på sider du besøker</translation> +<translation id="1141953877381847186">La assistenten bruke informasjon på skjermen for å gi hurtigsvar, som oversettelser, definisjoner, enhetsomregninger med mer. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Husk:<ph name="END_BOLD" /> Du kan alltid endre dette senere i Google Assistent-innstillinger > Relatert informasjon.</translation> <translation id="1143142264369994168">Sertifikat-signatar</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome fant ingen skadelig programvare på datamaskinen • sjekket for 1 minutt siden}other{Chrome fant ingen skadelig programvare på datamaskinen • sjekket for {NUM_MINS} minutter siden}}</translation> <translation id="1145593918056169051">Skriveren har stoppet</translation> @@ -1433,7 +1436,9 @@ <translation id="2594999711683503743">Søk på Google, eller skriv inn en nettadresse</translation> <translation id="2602501489742255173">Sveip opp for å komme i gang</translation> <translation id="2603115962224169880">Rydd opp i datamaskinen</translation> +<translation id="2603355571917519942">Voice Match er klar</translation> <translation id="2603463522847370204">Åpne i &inkognitovindu</translation> +<translation id="2604138917550693049">Søk etter bildet med Google Lens</translation> <translation id="2604255671529671813">Feil i nettverkstilkobling</translation> <translation id="2606246518223360146">Knytt sammen dataene</translation> <translation id="2606454609872547359">Nei, fortsett uten ChromeVox</translation> @@ -1776,6 +1781,7 @@ <translation id="2963151496262057773">Følgende programtillegg svarer ikke: <ph name="PLUGIN_NAME" />Vil du stoppe det?</translation> <translation id="2964193600955408481">Deaktiver Wi-Fi</translation> <translation id="2964245677645334031">Tilgang for nærdeling</translation> +<translation id="2966216232069818096">La assistenten bruke informasjon på skjermen for å hjelpe deg</translation> <translation id="2966937470348689686">Administrer Android-innstillinger</translation> <translation id="2972581237482394796">Gjø&r om</translation> <translation id="2973324205039581528">Kutt lyden for nettsted</translation> @@ -1872,6 +1878,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Denne fanen bruker kameraet eller mikrofonen.</translation> <translation id="3083193146044397360">Midlertidig blokkert for å ivareta sikkerheten din</translation> +<translation id="3083899879156272923">Beveg skjermen slik at musen blir værende midt på skjermen</translation> <translation id="3084548735795614657">Slipp for å installere</translation> <translation id="3084771660770137092">Chrome gikk tom for minne, eller prosessen for nettsiden ble avsluttet av andre årsaker. Hvis du vil fortsette, laster du inn siden på nytt, eller går til en annen side.</translation> <translation id="3084958266922136097">Slå av skjermspareren</translation> @@ -2367,6 +2374,9 @@ <translation id="3654045516529121250">lese tilgjengelighetsinnstillingene dine</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Den har permanent tilgang til én fil.}other{Den har permanent tilgang til # filer.}}</translation> <translation id="3658871634334445293">TrackPoint-akselerasjon</translation> +<translation id="3659830472545192450">Med Voice Match kan Google-assistenten identifisere stemmen din på Chromebook og skille deg fra andre. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Husk:<ph name="END_BOLD" /> Lignende stemmer eller opptak av stemmen din kan kanskje også brukes for å få tilgang til de personlige resultatene dine. Du kan fjerne Voice Match-tillatelsen senere ved å slå den av i Assistent-innstillingene.</translation> <translation id="3660234220361471169">Uklarert</translation> <translation id="3664511988987167893">Utvidelsesikon</translation> <translation id="3665589677786828986">Chrome har oppdaget at noen av innstillingene ble ødelagt av et annet program og tilbakestille dem til originalinnstillingene.</translation> @@ -2973,7 +2983,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> deler et vindu.</translation> <translation id="4364830672918311045">Vis varsler</translation> <translation id="4366138410738374926">Utskriften er påbegynt</translation> -<translation id="437004882363131692">Få tips om, tilbud på og oppdateringer for <ph name="DEVICE_TYPE" />, og gi tilbakemeldinger. Du kan avslutte abonnementet når som helst.</translation> <translation id="4370425812909262207">Handlekurvene er skjult. De blir synlige igjen når du gjør endringer.</translation> <translation id="4370975561335139969">E-posten og passordet du skrev inn, stemmer ikke overens.</translation> <translation id="4374831787438678295">Linux-installasjonsprogram</translation> @@ -3553,6 +3562,7 @@ <translation id="5050330054928994520">TTT</translation> <translation id="5051836348807686060">Stavekontroll støttes ikke for språkene du har valgt</translation> <translation id="5052499409147950210">Rediger nettstedet</translation> +<translation id="5053962746715621840">Søk etter bildet med Google Lens</translation> <translation id="5057110919553308744">Når du klikker på utvidelsen</translation> <translation id="5057403786441168405">Administrer de påloggede kontoene dine. Nettsteder, apper og utvidelser i Chrome og Google Play kan bruke disse kontoene til å tilpasse opplevelsen din, avhengig av tillatelser. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Begrens pålogging</translation> @@ -4037,6 +4047,9 @@ <translation id="5610038042047936818">Bytt til kameramodus</translation> <translation id="561030196642865721">Informasjonskapsler fra tredjeparter tillates på dette nettstedet</translation> <translation id="5612734644261457353">Passordet ditt kunne fortsatt ikke bekreftes. Merk: Hvis du endret passordet ditt nylig, blir det nye passordet ditt tatt i bruk når du logger deg av. Du må bruke det gamle passordet her.</translation> +<translation id="561308544008485315">Med Voice Match kan Google-assistenten identifisere stemmen din på Chromebook og skille deg fra andre. For å spare batteri er «Hey Google» bare på når enheten er koblet til en strømkilde. For å gjøre endringer, gå til Innstillinger. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Husk:<ph name="END_BOLD" /> Lignende stemmer eller opptak av stemmen din kan kanskje også brukes for å få tilgang til de personlige resultatene dine. Du kan fjerne Voice Match-tillatelsen senere ved å slå den av i Assistent-innstillingene.</translation> <translation id="5614190747811328134">Brukerinformasjon</translation> <translation id="5614553682702429503">Vil du lagre passordet?</translation> <translation id="5616726534702877126">Reservér størrelse</translation> @@ -5067,6 +5080,7 @@ <translation id="6824584962142919697">&Undersøk elementer</translation> <translation id="6825184156888454064">Sortér etter navn</translation> <translation id="6826872289184051766">Bekreft via USB</translation> +<translation id="6827604573767207488">Ser ut til at du allerede har konfigurert assistenten med personlig preg på en annen enhet. Få enda mer ut av assistenten ved å slå på denne innstillingen.</translation> <translation id="6828153365543658583">Begrens pålogging til følgende brukere:</translation> <translation id="6828182567531805778">Skriv inn passordfrasen for å synkronisere dataene dine</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5502,6 +5516,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> har slått av ADB-feilsøking. Når du starter <ph name="DEVICE_TYPE" /> på nytt, kan du ikke sideinnlaste apper lenger.</translation> <translation id="7328867076235380839">Ugyldig kombinasjon</translation> <translation id="7329154610228416156">Påloggingen mislyktes fordi den var konfigurert til å bruke en usikret nettadresse (<ph name="BLOCKED_URL" />). Kontakt administratoren din.</translation> +<translation id="7329932885428707942">Dette kan medføre at du midlertidig blir koblet fra mobilnettverket.</translation> <translation id="7332053360324989309">Dedikert arbeider: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Aktivér den dokkede lupen</translation> <translation id="7335974957018254119">Bruk stavekontroll for</translation> @@ -5545,6 +5560,7 @@ <translation id="7374376573160927383">Administrer USB-enheter</translation> <translation id="7375235221357833624">{0,plural, =1{Oppdater enheten innen en time}other{Oppdater enheten innen # timer}}</translation> <translation id="7376553024552204454">Fremhev musepekeren når den beveger seg</translation> +<translation id="737728204345822099">Besøket ditt på dette nettstedet kan bli registrert på sikkerhetsnøkkelen.</translation> <translation id="7377451353532943397">Fortsett blokkering av sensortilgang</translation> <translation id="7378611153938412599">Svake passord er enkle å gjette. Sørg for at du lager sterke passord. <ph name="BEGIN_LINK" />Se flere sikkerhetstips.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Åpne Chrome Nettmarked</translation> @@ -6172,6 +6188,7 @@ <translation id="8059417245945632445">&Inspiser enheter</translation> <translation id="8059456211585183827">Det er ingen skrivere tilgjengelig for lagring.</translation> <translation id="8061091456562007989">Endre tilbake</translation> +<translation id="8061991877177392872">Det ser ut til at du allerede har konfigurert Voice Match med assistenten din på en annen enhet. Disse tidligere opptakene ble brukt til å lage en stemmemodell på denne enheten.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 ark}other{{COUNT} ark}}</translation> <translation id="8062879968880283306">Skann QR-koden med kameraet på enheten, eller skriv inn aktiveringskoden du har fått av operatøren din.</translation> <translation id="8063235345342641131">Grønt standardbrukerbilde</translation> @@ -6443,6 +6460,7 @@ <translation id="8379991678458444070">Kom raskt tilbake hit ved å bokmerke denne fanen</translation> <translation id="8382913212082956454">Kopier &e-postadresse</translation> <translation id="8386091599636877289">Fant ikke regelen.</translation> +<translation id="8386819192691131213">La assistenten bruke informasjon på skjermen for å gi hurtigsvar, som oversettelser, definisjoner, enhetsomregninger med mer</translation> <translation id="8386903983509584791">Skanningen er fullført</translation> <translation id="8387361103813440603">Nettsteder som ikke har lov til å se posisjonen din</translation> <translation id="8389264703141926739">Blokkér varsler</translation> @@ -6925,6 +6943,7 @@ <translation id="8915370057835397490">Laster inn forslag …</translation> <translation id="8916476537757519021">Inkognito-underramme: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> – <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">Beveg skjermen når musen berører kantene av skjermen</translation> <translation id="8923880975836399332">Mørk blågrønn</translation> <translation id="8925458182817574960">&Innstillinger</translation> <translation id="8926389886865778422">Ikke spør igjen</translation> @@ -7003,6 +7022,7 @@ <translation id="9009708085379296446">Var det meningen å endre denne siden?</translation> <translation id="9011163749350026987">Vis alltid ikonet</translation> <translation id="9011393886518328654">Versjonsnotater</translation> +<translation id="9012122671773859802">Beveg skjermen kontinuerlig når musen beveger seg</translation> <translation id="9013037634206938463">Det kreves <ph name="INSTALL_SIZE" /> ledig plass for å installere Linux. For å få mer ledig plass, slett filer fra enheten.</translation> <translation id="9013707997379828817">Administratoren tilbakestiller denne enheten til forrige versjon. Lagre viktige filer, og start enheten på nytt. Alle data på enheten blir slettet.</translation> <translation id="901668144954885282">Sikkerhetskopiér til Google Disk</translation> @@ -7047,6 +7067,7 @@ <translation id="9052404922357793350">Fortsett blokkering</translation> <translation id="9053563360605707198">Skriv ut på begge sider</translation> <translation id="9053893665344928494">Husk valget mitt</translation> +<translation id="9055278955535611574">Bruk assistenten med «Hey Google»</translation> <translation id="9055636786322918818">Start håndheving av RC4-kryptering. Hvis du bruker dette alternativet, øker risikoen, ettersom RC4-chiffere ikke er sikre.</translation> <translation id="9056810968620647706">Finner ingen treff.</translation> <translation id="9057354806206861646">Oppdateringsplan</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 0a42e8a..e26c034 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">ଆପଣଙ୍କର ବ୍ଲୁଟୁଥ୍ ଏବଂ ସିରିୟଲ୍ ଡିଭାଇସ୍ଗୁଡ଼ିକ ଆକ୍ସେସ୍ କରନ୍ତୁ</translation> <translation id="114036956334641753">ଅଡିଓ ଏବଂ କ୍ୟାପ୍ସନ୍ଗୁଡ଼ିକ</translation> <translation id="1140746652461896221">ଯେକୌଣସି ପୃଷ୍ଠାରେ ଆପଣଙ୍କ ଦ୍ୱାରା ଦେଖାଯାଇଥିବା ବିଷୟବସ୍ତୁକୁ ଅବରୋଧ କରନ୍ତୁ</translation> +<translation id="1141953877381847186">ଅନୁବାଦ, ସଂଜ୍ଞା, ୟୁନିଟ୍ କନଭର୍ସନ୍ ଏବଂ ଆହୁରି ଅନେକ କିଛି ପରି କ୍ୱିକ୍ ଉତ୍ତରଗୁଡ଼ିକ ପ୍ରଦାନ କରିବା ପାଇଁ Assistantକୁ ସ୍କ୍ରିନରେ ଥିବା ସୂଚନାକୁ ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ। + <ph name="BR" /> +<ph name="BEGIN_BOLD" />ମନେ ରଖନ୍ତୁ:<ph name="END_BOLD" /> ଆପଣ ପରେ Google Assistant ସେଟିଂସ୍ > ସମ୍ବନ୍ଧିତ ସୂଚନାରେ ଏହାକୁ ସର୍ବଦା ପରିବର୍ତ୍ତନ କରିପାରିବେ।</translation> <translation id="1143142264369994168">ସାର୍ଟିଫିକେଟ୍ ଦସ୍ତଖତକାରୀ</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରରେ କ୍ଷତିକାରକ ସଫ୍ଟୱେରକୁ ଖୋଜି ପାଇଲା ନାହିଁ • 1 ମିନିଟ୍ ପୂର୍ବେ ଯାଞ୍ଚ କରାଯାଇଛି}other{Chrome ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରରେ କ୍ଷତିକାରକ ସଫ୍ଟୱେରକୁ ଖୋଜି ପାଇଲା ନାହିଁ • {NUM_MINS} ମିନିଟ୍ ପୂର୍ବେ ଯାଞ୍ଚ କରାଯାଇଛି}}</translation> <translation id="1145593918056169051">ପ୍ରିଣ୍ଟର୍ ବନ୍ଦ ହୋଇଯାଇଛି</translation> @@ -1423,7 +1426,9 @@ <translation id="2594999711683503743">Googleରେ ସନ୍ଧାନ କରନ୍ତୁ କିମ୍ବା URL ଟାଇପ୍ କରନ୍ତୁ</translation> <translation id="2602501489742255173">ଆରମ୍ଭ କରିବା ପାଇଁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ</translation> <translation id="2603115962224169880">କମ୍ପ୍ୟୁଟର୍ ଖାଲି କରନ୍ତୁ</translation> +<translation id="2603355571917519942">Voice Match ପ୍ରସ୍ତୁତ ଅଛି</translation> <translation id="2603463522847370204">&ଇନ୍କଗ୍ନିଟୋ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ</translation> +<translation id="2604138917550693049">Google Lens ମାଧ୍ୟମରେ ଛବି ଖୋଜନ୍ତୁ</translation> <translation id="2604255671529671813">ନେଟ୍ୱାର୍କ ସଂଯୋଗରେ ତ୍ରୁଟି</translation> <translation id="2606246518223360146">ଡାଟା ଲିଙ୍କ୍ କରନ୍ତୁ</translation> <translation id="2606454609872547359">ନା, ChromeVox ବିନା ଜାରି ରଖନ୍ତୁ</translation> @@ -1765,6 +1770,7 @@ <translation id="2963151496262057773">ନିମ୍ନୋକ୍ତ ପ୍ଲଗ୍ଇନ୍ଟି ଅପ୍ରତିକ୍ରିୟାଶୀଳ ଅଟେ: <ph name="PLUGIN_NAME" />ଆପଣ ଏହାକୁ ସ୍ଥଗିତ ରଖିବାକୁ ଚାହିଁବେ କି?</translation> <translation id="2964193600955408481">ୱାଇ-ଫାଇ ଅକ୍ଷମ କରନ୍ତୁ</translation> <translation id="2964245677645334031">Nearby Share ଭିଜିବିଲିଟୀ</translation> +<translation id="2966216232069818096">ସାହାଯ୍ୟ କରିବା ପାଇଁ ଆପଣଙ୍କ Assistantକୁ ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଥିବା ସୂଚନାକୁ ବ୍ୟବହାର କରିବାକୁ ଦିଅନ୍ତୁ</translation> <translation id="2966937470348689686">Android ଅଗ୍ରାଧିକାରକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="2972581237482394796">&ପୁନଃବତ୍</translation> <translation id="2973324205039581528">ସାଇଟ୍କୁ ମ୍ୟୁଟ୍ କରନ୍ତୁ</translation> @@ -1860,6 +1866,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">ଏହି ଟାବ୍ ଆପଣଙ୍କର କ୍ୟାମେରା ଏବଂ ମାଇକ୍ରୋଫୋନ୍ ବ୍ୟବହାର କରୁଛି।</translation> <translation id="3083193146044397360">ଆପଣଙ୍କର ନିରାପତ୍ତକୁ ରକ୍ଷା କରିବା ପାଇଁ ସାମୟିକ ଭାବେ ବ୍ଲକ୍ କରାଯାଇଛି</translation> +<translation id="3083899879156272923">ମାଉସକୁ ସ୍କ୍ରିନର କେନ୍ଦ୍ରରେ ରଖି ସ୍କ୍ରିନକୁ ମୁଭ୍ କରନ୍ତୁ</translation> <translation id="3084548735795614657">ଇନ୍ଷ୍ଟଲ୍ କରିବା ପାଇଁ ଡ୍ରପ୍ କରନ୍ତୁ</translation> <translation id="3084771660770137092">Chromeରେ ମେମୋରୀ ସରିଯାଇଥିଲା କିମ୍ବା ୱେବ୍ପୃଷ୍ଠା ପାଇଁ ପ୍ରକ୍ରିୟା ଅଗ୍ରାହ୍ୟ କରାଯାଇଥିଲା। ଜାରି ରଖିବାକୁ, ପୁଣି ଲୋଡ୍ କରନ୍ତୁ କିମ୍ବା ଅନ୍ୟ ଏକ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ।</translation> <translation id="3084958266922136097">ସ୍କ୍ରିନ୍ ସେଭର୍ ଅକ୍ଷମ କରନ୍ତୁ</translation> @@ -2353,6 +2360,9 @@ <translation id="3654045516529121250">ଆପଣଙ୍କର ଆକ୍ସେସିବିଲିଟୀ ସେଟିଂସ୍ ପଢ଼ନ୍ତୁ</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ଏହାର ଗୋଟିଏ ଫାଇଲ୍ରେ ସ୍ଥାୟୀ ଆକ୍ସେସ୍ ରହିଛି।}other{ଏହାର #ଟି ଫାଇଲ୍ରେ ସ୍ଥାୟୀ ଆକ୍ସେସ୍ ରହିଛି।}}</translation> <translation id="3658871634334445293">TrackPoint ଆକ୍ସଲରେସନ୍</translation> +<translation id="3659830472545192450">Voice Match ଆପଣଙ୍କ Chromebookରେ ଆପଣଙ୍କର ଭଏସକୁ ଚିହ୍ନଟ କରିବାରେ ଏବଂ ଆପଣଙ୍କୁ ଅନ୍ୟମାନଙ୍କଠାରୁ ଅଲଗା କରିବାରେ ଆପଣଙ୍କ Google Assistantକୁ ସାହାଯ୍ୟ କରେ। + <ph name="BR" /> +<ph name="BEGIN_BOLD" />ମନେ ରଖନ୍ତୁ:<ph name="END_BOLD" /> ଏକ ସମାନ ଭଏସ୍ କିମ୍ବା ରେକର୍ଡିଂ ଆପଣଙ୍କ ବ୍ୟକ୍ତିଗତ ଫଳାଫଳଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିବାରେ ମଧ୍ୟ ସକ୍ଷମ ହୋଇପାରେ। ଆପଣ Assistant ସେଟିଂସରେ Voice Match ଅନୁମତିକୁ ବନ୍ଦ କରି ପରେ ଏହାକୁ କାଢ଼ି ଦେଇପାରିବେ।</translation> <translation id="3660234220361471169">ଭରସାଯୋଗ୍ୟ ନୁହେଁ</translation> <translation id="3664511988987167893">ଏକ୍ସଟେନ୍ସନ୍ ଆଇକନ୍</translation> <translation id="3665589677786828986">Chrome ଚିହ୍ନଟ କରିଛି କି ଅନ୍ୟ କୌଣସି ପ୍ରୋଗ୍ରାମ୍ ଦ୍ବାରା ଆପଣଙ୍କର କିଛି ସେଟିଂସ୍ ନଷ୍ଟ ହୋଇଯାଇଥିଲା ଏବଂ ସେଗୁଡ଼ିକୁ ସେମାନଙ୍କର ମୂଳ ଡିଫଲ୍ଟରେ ପୁନଃସେଟ୍ କରନ୍ତୁ।</translation> @@ -2957,7 +2967,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> ଏକ ୱିଣ୍ଡୋ ସେୟାର୍ କରୁଛି।</translation> <translation id="4364830672918311045">ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପ୍ରଦର୍ଶନ କରନ୍ତୁ</translation> <translation id="4366138410738374926">ପ୍ରିଣ୍ଟିଂ ଆରମ୍ଭ ହୋଇଛି</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> ପରାମର୍ଶ, ଅଫର୍ ଓ ଅପଡେଟଗୁଡ଼ିକ ପାଆନ୍ତୁ ଏବଂ ମତାମତ ସେୟାର୍ କରନ୍ତୁ। ଯେ କୌଣସି ସମୟରେ ସଦସ୍ୟତା ତ୍ୟାଗ କରନ୍ତୁ।</translation> <translation id="4370425812909262207">କାର୍ଟଗୁଡ଼ିକ ଲୁକ୍କାୟିତ ଅଛି। ଯେତେବେଳେ ଆପଣ ପରିବର୍ତ୍ତନ କରିବେ ସେଗୁଡ଼ିକ ପୁଣି ଦେଖାଯିବ।</translation> <translation id="4370975561335139969">ଆପଣ ଲେଖିଥିବା ଇମେଲ୍ ଓ ପାସ୍ୱର୍ଡ ମେଳ ହେଉନାହିଁ</translation> <translation id="4374831787438678295">Linux ଇନ୍ଷ୍ଟଲର୍</translation> @@ -3534,6 +3543,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">ଆପଣ ଚୟନ କରିଥିବା ଭାଷାଗୁଡ଼ିକ ପାଇଁ ବନାନ ଯାଞ୍ଚ ସମର୍ଥନ ନାହିଁ</translation> <translation id="5052499409147950210">ସାଇଟ୍ ଏଡିଟ୍ କରନ୍ତୁ</translation> +<translation id="5053962746715621840">Google Lens ମାଧ୍ୟମରେ ଛବି ଖୋଜନ୍ତୁ</translation> <translation id="5057110919553308744">ଆପଣ ଯେତେବେଳେ ଏକ୍ସଟେନ୍ସନ୍କୁ କ୍ଲିକ୍ କରିବେ</translation> <translation id="5057403786441168405">ଆପଣଙ୍କର ସାଇନ୍-ଇନ୍ କରାଯାଇଥିବା ଆକାଉଣ୍ଟଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ। Chrome ଏବଂ Google Playରେ ଥିବା ୱେବସାଇଟ, ଆପ୍ ଏବଂ ଏକ୍ସଟେନସନଗୁଡ଼ିକ ଆପଣଙ୍କ ଅନୁଭୂତିକୁ କଷ୍ଟମାଇଜ୍ କରିବା ପାଇଁ, ଅନୁମତିଗୁଡ଼ିକ ଆଧାରରେ ଏହି ଆକାଉଣ୍ଟଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିପାରେ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation> <translation id="5059241099014281248">ସାଇନ୍-ଇନ୍ ପ୍ରତିବନ୍ଧିତ କରନ୍ତୁ</translation> @@ -4016,6 +4026,9 @@ <translation id="5610038042047936818">କ୍ୟାମେରା ମୋଡ୍କୁ ସ୍ୱିଚ୍ କରନ୍ତୁ</translation> <translation id="561030196642865721">ଏହି ସାଇଟ୍ରେ ତୃତୀୟ-ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ଅନୁମତି ଅଛି</translation> <translation id="5612734644261457353">କ୍ଷମା କରିବେ, ଆପଣଙ୍କର ପାସ୍ୱର୍ଡ ଏବେମଧ୍ୟ ଯାଞ୍ଚ କରାଯାଇପାରିଲା ନାହିଁ। ଧ୍ୟାନ ଦିଅନ୍ତୁ: ଯଦି ବର୍ତ୍ତମାନ ଆପଣ ନିଜର ପାସ୍ୱର୍ଡକୁ ବଦଳାଇଥାଆନ୍ତି ତେବେ, ତାହା ଆପଣ ଥରେ ସାଇନ୍-ଆଉଟ୍ କରିବା ପରେ ନୂଆ ପାସ୍ୱର୍ଡ ଲାଗୁ ହେବ, ଦୟାକରି ଏଠାରେ ପୁରୁଣା ପାସ୍ୱର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ।</translation> +<translation id="561308544008485315">Voice Match ଆପଣଙ୍କ Chromebookରେ ଆପଣଙ୍କର ଭଏସକୁ ଚିହ୍ନଟ କରିବାରେ ଏବଂ ଆପଣଙ୍କୁ ଅନ୍ୟମାନଙ୍କଠାରୁ ଅଲଗା କରିବାରେ ଆପଣଙ୍କ Google Assistantକୁ ସାହାଯ୍ୟ କରେ। ବ୍ୟାଟେରୀ ସେଭ୍ କରିବାକୁ, ଆପଣଙ୍କ ଡିଭାଇସ୍ ଏକ ପାୱାର ସୋର୍ସ ସହ ସଂଯୁକ୍ତ ଥିବା ସମୟରେ କେବଳ "Hey Google" ଚାଲୁ ହୋଇଥାଏ। ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ, ସେଟିଂସକୁ ଯାଆନ୍ତୁ। + <ph name="BR" /> +<ph name="BEGIN_BOLD" />ମନେ ରଖନ୍ତୁ:<ph name="END_BOLD" /> ଏକ ସମାନ ଭଏସ୍ କିମ୍ବା ରେକର୍ଡିଂ ଆପଣଙ୍କ ବ୍ୟକ୍ତିଗତ ଫଳାଫଳଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିବାରେ ମଧ୍ୟ ସକ୍ଷମ ହୋଇପାରେ। ଆପଣ Assistant ସେଟିଂସରେ Voice Match ଅନୁମତିକୁ ବନ୍ଦ କରି ପରେ ଏହାକୁ କାଢ଼ି ଦେଇପାରିବେ।</translation> <translation id="5614190747811328134">ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ବିଜ୍ଞପ୍ତି</translation> <translation id="5614553682702429503">ପାସ୍ୱର୍ଡ ସେଭ୍ କରିବେ?</translation> <translation id="5616726534702877126">ଆକାର ରିଜର୍ଭ କରନ୍ତୁ</translation> @@ -5037,6 +5050,7 @@ <translation id="6824584962142919697">&ଉପାଦାନଗୁଡ଼ିକୁ ନିରୀକ୍ଷଣ କରନ୍ତୁ</translation> <translation id="6825184156888454064">ନାମ ଅନୁସାରେ ସଜାନ୍ତୁ</translation> <translation id="6826872289184051766">USB ମାଧ୍ୟମରେ ଯାଞ୍ଚ କରନ୍ତୁ</translation> +<translation id="6827604573767207488">ଏପରି ଜଣାପଡ଼ୁଛି ଯେ ଆପଣ ପୂର୍ବରୁ ଏକ ଭିନ୍ନ ଡିଭାଇସରେ ପର୍ସନାଲାଇଜ୍ କରାଯାଇଥିବା Assistant ସେଟ୍ ଅପ୍ କରିଛନ୍ତି। ନିମ୍ନୋକ୍ତ ସେଟିଂକୁ ଚାଲୁ କରି ଆପଣଙ୍କ Assistantରୁ ଆହୁରି ଅଧିକ ସୁବିଧା ପାଆନ୍ତୁ।</translation> <translation id="6828153365543658583">ନିମ୍ନଲିଖିତ ଉପଯୋଗକର୍ତ୍ତାମାନଙ୍କରେ ସାଇନ୍-ଇନ୍ କରିବାକୁ ରୋକନ୍ତୁ:</translation> <translation id="6828182567531805778">ଆପଣଙ୍କର ଡାଟା ସିଙ୍କ୍ କରିବାକୁ ଆପଣଙ୍କର ପାସ୍ଫ୍ରେଜ୍ ଲେଖନ୍ତୁ</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5471,6 +5485,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> ADB ଡିବଗିଂକୁ ଅକ୍ଷମ କରିଛି। ଆପଣ ଆପଣଙ୍କ <ph name="DEVICE_TYPE" />କୁ ରିଷ୍ଟାର୍ଟ କଲେ, ଆପଣ ଆପଗୁଡ଼ିକୁ ସାଇଡଲୋଡ୍ କରିବାକୁ ସକ୍ଷମ ହେବେ ନାହିଁ।</translation> <translation id="7328867076235380839">ଅବୈଧ ସଂଯୋଜନ</translation> <translation id="7329154610228416156">ସାଇନ୍-ଇନ୍ ବିଫଳ ହେଲା କାରଣ ଗୋଟିଏ ଅସୁରକ୍ଷିତ URL<ph name="BLOCKED_URL" />କୁ ବ୍ୟବହାର କରିବା ପାଇଁ ଏହାକୁ କନ୍ଫିଗର୍ କରାଯାଇଥିଲା। ଦୟାକରି ଆପଣଙ୍କର ଆଡ୍ମିନିଷ୍ଟ୍ରେଟର୍ଙ୍କ ସହିତ ଯୋଗାଯୋଗ କରନ୍ତୁ।</translation> +<translation id="7329932885428707942">ଏହା ଯୋଗୁଁ ସେଲ୍ୟୁଲାର୍ ନେଟୱାର୍କ ଅଳ୍ପ ସମୟ ପାଇଁ ବିଚ୍ଛିନ୍ନ ହୋଇପାରେ।</translation> <translation id="7332053360324989309">ଉତ୍ସର୍ଗୀକୃତ କର୍ମଚାରୀ: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">ଡକ୍ ହୋଇଥିବା ମ୍ୟାଗ୍ନିଫାୟର୍କୁ ସକ୍ଷମ କରନ୍ତୁ।</translation> <translation id="7335974957018254119">ଏହା ପାଇଁ ବନାନ ଯାଞ୍ଚ ବ୍ୟବହାର କରନ୍ତୁ</translation> @@ -6137,6 +6152,7 @@ <translation id="8059417245945632445">&ଡିଭାଇସ୍ ଯାଞ୍ଚ କରନ୍ତୁ</translation> <translation id="8059456211585183827">ସେଭ୍ କରିବା ପାଇଁ କୌଣସି ପ୍ରିଣ୍ଟର୍ ଉପଲବ୍ଧ ନାହିଁ।</translation> <translation id="8061091456562007989">ଏହାକୁ ପୂର୍ବ ଭଳି କରନ୍ତୁ</translation> +<translation id="8061991877177392872">ଏପରି ଜଣାପଡ଼ୁଛି ଯେ ଆପଣ ପୂର୍ବରୁ ଅନ୍ୟ ଏକ ଡିଭାଇସରେ ଆପଣଙ୍କର Assistant ସାହାଯ୍ୟରେ Voice Match ସେଟ୍ ଅପ୍ କରିଛନ୍ତି। ଏହି ଡିଭାଇସରେ ଏକ ଭଏସ୍ ମଡେଲ୍ ତିଆରି କରିବାକୁ ଏହି ପୂର୍ବବର୍ତ୍ତୀ ରେକର୍ଡିଂଗୁଡ଼ିକୁ ବ୍ୟବହାର କରାଯାଇଛି।</translation> <translation id="8062844841289846053">{COUNT,plural, =1{କାଗଜର 1ଟି ସିଟ୍}other{କାଗଜର {COUNT}ଟି ସିଟ୍}}</translation> <translation id="8062879968880283306">ଡିଭାଇସର କ୍ୟାମେରା ବ୍ୟବହାର କରି QR କୋଡ୍ ସ୍କାନ୍ କରନ୍ତୁ କିମ୍ବା ଆପଣଙ୍କ କ୍ୟାରିଅର୍ ଦ୍ୱାରା ପ୍ରଦାନ କରାଯାଇଥିବା ସକ୍ରିୟକରଣ କୋଡ୍ ଲେଖନ୍ତୁ।</translation> <translation id="8063235345342641131">ଡିଫଲ୍ଟ ସବୁଜ ଅବତାର</translation> @@ -6405,6 +6421,7 @@ <translation id="8379991678458444070">ଏହି ଟାବ୍କୁ ବୁକ୍ମାର୍କ କରି ଏଠାକୁ ଦ୍ରୁତଭାବରେ ପୁଣି ଆସନ୍ତୁ</translation> <translation id="8382913212082956454">ଇମେଲ୍ ଠିକଣା କପି କରନ୍ତୁ</translation> <translation id="8386091599636877289">ନୀତି ମିଳିଲା ନାହିଁ।</translation> +<translation id="8386819192691131213">ଅନୁବାଦ, ସଂଜ୍ଞା, ୟୁନିଟ୍ କନଭର୍ସନ୍ ଏବଂ ଆହୁରି ଅନେକ କିଛି ପରି କ୍ୱିକ୍ ଉତ୍ତରଗୁଡ଼ିକ ପ୍ରଦାନ କରିବା ପାଇଁ Assistantକୁ ସ୍କ୍ରିନରେ ଥିବା ସୂଚନାକୁ ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ</translation> <translation id="8386903983509584791">ସ୍କାନ୍ ସମ୍ପୂର୍ଣ୍ଣ ହେଲା</translation> <translation id="8387361103813440603">ଆପଣଙ୍କ ଲୋକେସନ୍ ଦେଖିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ</translation> <translation id="8389264703141926739">ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation> @@ -6881,6 +6898,7 @@ <translation id="8915370057835397490">ପରାମର୍ଶ ଲୋଡ୍ ହେଉଛି</translation> <translation id="8916476537757519021">ଇନ୍କଗ୍ନିଟୋ ସବଫ୍ରେମ୍: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />ଙ୍କ <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">ମାଉସ୍ ସ୍କ୍ରିନର ଧାରଗୁଡ଼ିକୁ ସ୍ପର୍ଶ କରିବା ସମୟରେ ସ୍କ୍ରିନକୁ ମୁଭ୍ କରନ୍ତୁ</translation> <translation id="8923880975836399332">ଗାଢ଼ ଟିଲ୍</translation> <translation id="8925458182817574960">&ସେଟିଂସ୍</translation> <translation id="8926389886865778422">ପୁର୍ନବାର ପଚାରନ୍ତୁ ନାହିଁ</translation> @@ -6958,6 +6976,7 @@ <translation id="9009708085379296446">ଆପଣ କଣ ଏହି ପୃଷ୍ଠା ପରିବର୍ତ୍ତନ କରିବାକୁ ଚାହୁଁଥିଲେ?</translation> <translation id="9011163749350026987">ସର୍ବଦା ଆଇକନ୍ ଦେଖାନ୍ତୁ</translation> <translation id="9011393886518328654">ନୋଟଗୁଡ଼ିକ ରିଲିଜ୍ କରନ୍ତୁ</translation> +<translation id="9012122671773859802">ମାଉସକୁ ମୁଭ୍ କରିବା ସମୟରେ ସ୍କ୍ରିନକୁ କ୍ରମାଗତ ଭାବେ ମୁଭ୍ କରନ୍ତୁ</translation> <translation id="9013037634206938463">Linux ଇନଷ୍ଟଲ୍ କରିବାକୁ <ph name="INSTALL_SIZE" />ର ଖାଲି ସ୍ଥାନ ଆବଶ୍ୟକ। ଖାଲି ସ୍ଥାନ ବଢ଼ାଇବାକୁ, ଆପଣଙ୍କ ଡିଭାଇସରୁ ଫାଇଲଗୁଡ଼ିକ ଡିଲିଟ୍ କରନ୍ତୁ।</translation> <translation id="9013707997379828817">ଆପଣଙ୍କ ବ୍ୟବସ୍ଥାପକ ଏହି ଡିଭାଇସ୍କୁ ଫେରାଇ ଆଣିଛନ୍ତି। ଦୟାକରି ଆପଣଙ୍କ ଗୁରୁତ୍ବପୂର୍ଣ୍ଣ ଫାଇଲ୍ଗୁଡ଼ିକୁ ସେଭ୍ କରନ୍ତୁ, ତାପରେ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ। ଏହି ଡିଭାଇସ୍ରେ ଥିବା ସମସ୍ତ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।</translation> <translation id="901668144954885282">Google Driveରେ ବ୍ୟାକଅପ୍ ନିଅନ୍ତୁ</translation> @@ -7002,6 +7021,7 @@ <translation id="9052404922357793350">ଅବରୋଧ କରିବା ଜାରି ରଖନ୍ତୁ</translation> <translation id="9053563360605707198">ଉଭୟ ପାର୍ଶ୍ୱରେ ପ୍ରିଣ୍ଟ କରନ୍ତୁ</translation> <translation id="9053893665344928494">ମୋ ପସନ୍ଦକୁ ମନେରଖନ୍ତୁ</translation> +<translation id="9055278955535611574">"Hey Google" କହି ଆପଣଙ୍କ Assistantକୁ ଆକ୍ସେସ୍ କରନ୍ତୁ</translation> <translation id="9055636786322918818">RC4 ଏନ୍କ୍ରିପସନ୍.ଲାଗୁ କରନ୍ତୁ। RC4 ସାଇଫର୍ଗୁଡ଼ିକ ଅସୁରକ୍ଷିତ ଥିବାରୁ ଏହି ବିକଳ୍ପର ବ୍ୟବହାର ଆପଣଙ୍କର ବିପଦ ବଢ଼ାଇଥାଏ।</translation> <translation id="9056810968620647706">କୌଣସି ମେଳ ମିଳିଲା ନାହିଁ</translation> <translation id="9057354806206861646">ସମୟ ସୂଚୀ ଅପ୍ଡେଟ୍ କରନ୍ତୁ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index a7cca46..6af3084 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">ਆਪਣੀ ਬਲੂਟੁੱਥ ਅਤੇ ਸੀਰੀਅਲ ਡਿਵਾਈਸਾਂ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰੋ</translation> <translation id="114036956334641753">ਆਡੀਓ ਅਤੇ ਸੁਰਖੀਆਂ</translation> <translation id="1140746652461896221">ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੇ ਜਾਂਦੇ ਕਿਸੇ ਵੀ ਪੰਨੇ 'ਤੇ ਸਮੱਗਰੀ ਨੂੰ ਬਲਾਕ ਕਰੋ</translation> +<translation id="1141953877381847186">ਤਤਕਾਲ ਜਵਾਬ, ਜਿਵੇਂ ਕਿ ਅਨੁਵਾਦ, ਪਰਿਭਾਸ਼ਾ, ਇਕਾਈ ਰੂਪਾਂਤਰਨ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਲਈ, Assistant ਨੂੰ ਸਕ੍ਰੀਨ 'ਤੇ ਦਿੱਤੀ ਜਾਣਕਾਰੀ ਵਰਤਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ। + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ਧਿਆਨ ਵਿੱਚ ਰੱਖੋ:<ph name="END_BOLD" /> ਤੁਸੀਂ ਬਾਅਦ ਵਿੱਚ ਕਦੇ ਵੀ ਇਸ ਨੂੰ Google Assistant ਸੈਟਿੰਗਾਂ > ਸੰਬੰਧਿਤ ਜਾਣਕਾਰੀ ਵਿੱਚ ਜਾ ਕੇ ਬਦਲ ਸਕਦੇ ਹੋ।</translation> <translation id="1143142264369994168">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਸਾਈਨਰ</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome ਨੂੰ ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ 'ਤੇ ਕੋਈ ਹਾਨੀਕਾਰਕ ਸਾਫ਼ਟਵੇਅਰ ਨਹੀਂ ਲੱਭਿਆ • 1 ਮਿੰਟ ਪਹਿਲਾਂ ਜਾਂਚ ਕੀਤੀ ਗਈ}one{Chrome ਨੂੰ ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ 'ਤੇ ਕੋਈ ਹਾਨੀਕਾਰਕ ਸਾਫ਼ਟਵੇਅਰ ਨਹੀਂ ਲੱਭਿਆ • {NUM_MINS} ਮਿੰਟ ਪਹਿਲਾਂ ਜਾਂਚ ਕੀਤੀ ਗਈ}other{Chrome ਨੂੰ ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ 'ਤੇ ਕੋਈ ਹਾਨੀਕਾਰਕ ਸਾਫ਼ਟਵੇਅਰ ਨਹੀਂ ਲੱਭਿਆ • {NUM_MINS} ਮਿੰਟ ਪਹਿਲਾਂ ਜਾਂਚ ਕੀਤੀ ਗਈ}}</translation> <translation id="1145593918056169051">ਪ੍ਰਿੰਟਰ ਰੁਕ ਗਿਆ ਹੈ</translation> @@ -1432,7 +1435,9 @@ <translation id="2594999711683503743">Google ਖੋਜੋ ਜਾਂ URL ਟਾਈਪ ਕਰੋ</translation> <translation id="2602501489742255173">ਸ਼ੁਰੂਆਤ ਕਰਨ ਲਈ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ</translation> <translation id="2603115962224169880">ਕੰਪਿਊਟਰ ਸਾਫ਼ ਕਰੋ</translation> +<translation id="2603355571917519942">Voice Match ਤਿਆਰ ਹੈ</translation> <translation id="2603463522847370204">&ਗੁਮਨਾਮ window ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> +<translation id="2604138917550693049">Google Lens ਨਾਲ ਚਿੱਤਰ ਖੋਜੋ</translation> <translation id="2604255671529671813">ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਗੜਬੜ</translation> <translation id="2606246518223360146">ਡਾਟਾ ਲਿੰਕ ਕਰੋ</translation> <translation id="2606454609872547359">ਨਹੀਂ, ChromeVox ਦੇ ਬਿਨਾਂ ਜਾਰੀ ਰੱਖੋ</translation> @@ -1773,6 +1778,7 @@ <translation id="2963151496262057773">ਹੇਠਾਂ ਦਿੱਤਾ ਪਲੱਗਇਨ ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਿਹਾ ਹੈ: <ph name="PLUGIN_NAME" />ਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਰੋਕਣਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> <translation id="2964193600955408481">Wi-Fi ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ</translation> <translation id="2964245677645334031">ਨਜ਼ਦੀਕੀ ਸਾਂਝ ਦੀ ਦਿਖਣਯੋਗਤਾ</translation> +<translation id="2966216232069818096">ਮਦਦ ਕਰਨ ਲਈ ਆਪਣੀ Assistant ਨੂੰ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ 'ਤੇ ਦਿੱਤੀ ਜਾਣਕਾਰੀ ਵਰਤਣ ਦਿਓ</translation> <translation id="2966937470348689686">Android ਤਰਜੀਹਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="2972581237482394796">&ਰੀਡੂ</translation> <translation id="2973324205039581528">ਸਾਈਟ ਮਿਊਟ ਕਰੋ</translation> @@ -1868,6 +1874,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">ਇਹ ਟੈਬ ਤੁਹਾਡਾ ਕੈਮਰਾ ਜਾਂ ਮਾਈਕ੍ਰੋਫੋਨ ਵਰਤ ਰਹੀ ਹੈ।</translation> <translation id="3083193146044397360">ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ ਅਸਥਾਈ ਤੌਰ 'ਤੇ ਬਲੌਕ ਕੀਤੀ ਗਈ</translation> +<translation id="3083899879156272923">ਮਾਊਸ ਨੂੰ ਸਕ੍ਰੀਨ ਦੇ ਵਿਚਾਲੇ ਰੱਖ ਕੇ ਸਕ੍ਰੀਨ ਨੂੰ ਹਿਲਾਓ</translation> <translation id="3084548735795614657">ਸਥਾਪਤ ਕਰਨ ਲਈ ਡ੍ਰੌਪ ਕਰੋ</translation> <translation id="3084771660770137092">Chrome ਦੀ ਮੈਮਰੀ ਖਤਮ ਹੋ ਗਈ ਜਾਂ ਵੈੱਬ-ਪੰਨਾ ਦੀ ਪ੍ਰਕਿਰਿਆ ਕਿਸੇ ਕਾਰਨ ਕਰਕੇ ਖਤਮ ਕਰ ਦਿੱਤੀ ਗਈ ਸੀ। ਜਾਰੀ ਰੱਖਣ ਲਈ, ਰੀਲੋੱਡ ਕਰੋ ਜਾਂ ਕਿਸੇ ਹੋਰ ਪੰਨੇ 'ਤੇ ਜਾਓ।</translation> <translation id="3084958266922136097">ਸਕ੍ਰੀਨ ਸੇਵਰ ਬੰਦ ਕਰੋ</translation> @@ -2361,6 +2368,9 @@ <translation id="3654045516529121250">ਆਪਣੀਆਂ ਪਹੁੰਚਯੋਗਤਾ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹੋ</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ਇਸਦੀ ਇੱਕ ਫਾਈਲ ਤੱਕ ਸਥਾਈ ਪਹੁੰਚ ਹੈ।}one{ਇਸਦੀ # ਫਾਈਲਾਂ ਤੱਕ ਸਥਾਈ ਪਹੁੰਚ ਹੈ।}other{ਇਸਦੀ # ਫਾਈਲਾਂ ਤੱਕ ਸਥਾਈ ਪਹੁੰਚ ਹੈ।}}</translation> <translation id="3658871634334445293">TrackPoint ਐਕਸੈੱਲਰੇਸ਼ਨ</translation> +<translation id="3659830472545192450">Voice Match ਤੁਹਾਡੀ Chromebook 'ਤੇ ਤੁਹਾਡੀ ਅਵਾਜ਼ ਦੀ ਪਛਾਣ ਕਰਨ ਵਿੱਚ ਤੁਹਾਡੀ Google Assistant ਦੀ ਮਦਦ ਕਰਦੀ ਹੈ ਅਤੇ ਤੁਹਾਨੂੰ ਹੋਰਾਂ ਲੋਕਾਂ ਤੋਂ ਵੱਖ ਕਰਦੀ ਹੈ। + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ਧਿਆਨ ਵਿੱਚ ਰੱਖੋ:<ph name="END_BOLD" /> ਕਿਸੇ ਮਿਲਦੀ-ਜੁਲਦੀ ਅਵਾਜ਼ ਜਾਂ ਅਵਾਜ਼ ਦੀ ਰਿਕਾਰਡਿੰਗ ਨਾਲ ਵੀ ਤੁਹਾਡੇ ਨਿੱਜੀ ਨਤੀਜਿਆਂ ਤੱਕ ਪਹੁੰਚ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ। ਤੁਸੀਂ ਬਾਅਦ ਵਿੱਚ Assistant ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਇਸਨੂੰ ਬੰਦ ਕਰਕੇ Voice Match ਇਜਾਜ਼ਤ ਨੂੰ ਹਟਾ ਸਕਦੇ ਹੋ।</translation> <translation id="3660234220361471169">ਭਰੋਸੇਯੋਗ ਨਹੀਂ</translation> <translation id="3664511988987167893">ਐਕਟੈਂਸ਼ਨ ਪ੍ਰਤੀਕ</translation> <translation id="3665589677786828986">Chrome ਨੇ ਪਤਾ ਲਗਾਇਆ ਕਿ ਕਿਸੇ ਹੋਰ ਪ੍ਰੋਗਰਾਮ ਨਾ ਤੁਹਾਡੀਆਂ ਕੁਝ ਸੈਟਿੰਗਾਂ ਨੂੰ ਖਰਾਬ ਕਰ ਦਿੱਤਾ ਹੈ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਮੂਲ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗਾਂ 'ਤੇ ਰੀਸੈੱਟ ਕੀਤਾ ਗਿਆ ਸੀ।</translation> @@ -2967,7 +2977,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।</translation> <translation id="4364830672918311045">ਡਿਸਪਲੇ ਸੂਚਨਾਵਾਂ</translation> <translation id="4366138410738374926">ਪ੍ਰਿੰਟ ਕਰਨਾ ਸ਼ੁਰੂ ਹੋ ਗਿਆ</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> ਨੁਕਤੇ, ਪੇਸ਼ਕਸ਼ਾਂ ਅਤੇ ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਕਰੋ ਅਤੇ ਵਿਚਾਰ ਸਾਂਝਾ ਕਰੋ। ਕਿਸੇ ਵੀ ਵੇਲੇ ਗਾਹਕੀ ਹਟਾਓ।</translation> <translation id="4370425812909262207">ਕਾਰਟ ਲੁਕਾਏ ਗਏ। ਜਦੋਂ ਤੁਸੀਂ ਤਬਦੀਲੀਆਂ ਕਰਦੇ ਹੋ ਤਾਂ ਉਹ ਦੁਬਾਰਾ ਦਿਖਾਈ ਦੇਣਗੇ।</translation> <translation id="4370975561335139969">ਤੁਹਾਡੇ ਵੱਲੋਂ ਦਰਜ ਕੀਤਾ ਈਮੇਲ ਅਤੇ ਪਾਸਵਰਡ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ</translation> <translation id="4374831787438678295">Linux ਸਥਾਪਨਾਕਾਰ</translation> @@ -3120,6 +3129,7 @@ <translation id="4538417792467843292">ਸ਼ਬਦ ਮਿਟਾਓ</translation> <translation id="4538684596480161368">ਹਮੇਸ਼ਾਂ <ph name="HOST" /> ਤੇ ਅਨਸੈਂਡਬੌਕਸਿਡ ਪਲਗਇੰਸ ਨੂੰ ਬਲੌਕ ਕਰੋ</translation> <translation id="4538792345715658285">ਐਂਟਰਪ੍ਰਾਈਜ ਨੀਤੀ ਵੱਲੋਂ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ।</translation> +<translation id="4541123282641193691">ਤੁਹਾਡੇ ਖਾਤੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ ਆਪਣੀ Chromebook ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ।</translation> <translation id="4541662893742891060">ਇਸ ਪ੍ਰੋਫਾਈਲ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਤਕਨੀਕੀ ਸਹਾਇਤਾ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</translation> <translation id="4542520061254486227"><ph name="WEBSITE_1" /> ਅਤੇ <ph name="WEBSITE_2" /> ਤੇ ਆਪਣਾ ਡਾਟਾ ਪੜ੍ਹੋ</translation> <translation id="4543778593405494224">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਪ੍ਰਬੰਧਕ</translation> @@ -3544,6 +3554,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚ ਦੀ ਸੁਵਿਧਾ ਤੁਹਾਡੇ ਵੱਲੋਂ ਚੁਣੀਆਂ ਭਾਸ਼ਾਵਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ</translation> <translation id="5052499409147950210">ਸਾਈਟ ਦਾ ਸੰਪਾਦਨ ਕਰੋ</translation> +<translation id="5053962746715621840">Google Lens ਨਾਲ ਚਿੱਤਰ ਖੋਜੋ</translation> <translation id="5057110919553308744">ਜਦੋਂ ਤੁਸੀਂ ਐਕਸਟੈਂਸ਼ਨ 'ਤੇ ਕਲਿੱਕ ਕਰਦੇ ਹੋ</translation> <translation id="5057403786441168405">ਆਪਣੇ ਸਾਈਨ-ਇਨ ਕੀਤੇ ਖਾਤਿਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ। Chrome ਅਤੇ Google Play ਵਿੱਚ ਵੈੱਬਸਾਈਟਾਂ, ਐਪਾਂ ਅਤੇ ਐਕਸਟੈਂਸ਼ਨਾਂ ਇਜਾਜ਼ਤਾਂ ਦੇ ਆਧਾਰ 'ਤੇ ਤੁਹਾਡੇ ਅਨੁਭਵ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰਨ ਲਈ ਇਹਨਾਂ ਖਾਤਿਆਂ ਨੂੰ ਵਰਤ ਸਕਦੀਆਂ ਹਨ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="5059241099014281248">ਸਾਈਨ-ਇਨ 'ਤੇ ਪਾਬੰਦੀ ਲਗਾਓ</translation> @@ -4025,6 +4036,9 @@ <translation id="5610038042047936818">ਕੈਮਰਾ ਮੋਡ 'ਤੇ ਸਵਿੱਚ ਕਰੋ</translation> <translation id="561030196642865721">ਇਸ ਸਾਈਟ 'ਤੇ ਤੀਜੀ-ਧਿਰ ਦੀਆਂ ਕੁਕੀਜ਼ ਦੀ ਆਗਿਆ ਹੈ</translation> <translation id="5612734644261457353">ਮਾਫ਼ ਕਰਨਾ, ਅਜੇ ਤੁਹਾਡੇ ਪਾਸਵਰਡ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਨੋਟ: ਜੇਕਰ ਤੁਸੀਂ ਹੁਣੇ ਹੀ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਿਆ ਹੈ, ਤਾਂ ਤੁਹਾਡਾ ਨਵਾਂ ਪਾਸਵਰਡ ਤੁਹਾਡੇ ਸਾਈਨ ਆਉਟ ਕਰਨ ਤੋਂ ਬਾਅਦ ਲਾਗੂ ਹੋਵੇਗਾ, ਕਿਰਪਾ ਕਰਕੇ ਇੱਥੇ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਵਰਤੋ।</translation> +<translation id="561308544008485315">Voice Match ਤੁਹਾਡੀ Chromebook 'ਤੇ ਤੁਹਾਡੀ ਅਵਾਜ਼ ਦੀ ਪਛਾਣ ਕਰਨ ਵਿੱਚ ਤੁਹਾਡੀ Google Assistant ਦੀ ਮਦਦ ਕਰਦੀ ਹੈ ਅਤੇ ਤੁਹਾਨੂੰ ਹੋਰਾਂ ਲੋਕਾਂ ਤੋਂ ਵੱਖ ਕਰਦੀ ਹੈ। ਬੈਟਰੀ ਬਚਾਉਣ ਲਈ, "Ok Google" ਸਿਰਫ਼ ਉਦੋਂ ਹੀ ਚਾਲੂ ਹੁੰਦਾ ਹੈ ਜਦੋਂ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਕਿਸੇ ਪਾਵਰ ਸਰੋਤ ਨਾਲ ਕਨੈਕਟ ਹੋਵੇ। ਤਬਦੀਲੀਆਂ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ 'ਤੇ ਜਾਓ। + <ph name="BR" /> + <ph name="BEGIN_BOLD" />ਧਿਆਨ ਵਿੱਚ ਰੱਖੋ:<ph name="END_BOLD" /> ਕਿਸੇ ਮਿਲਦੀ-ਜੁਲਦੀ ਅਵਾਜ਼ ਜਾਂ ਅਵਾਜ਼ ਦੀ ਰਿਕਾਰਡਿੰਗ ਨਾਲ ਵੀ ਤੁਹਾਡੇ ਨਿੱਜੀ ਨਤੀਜਿਆਂ ਤੱਕ ਪਹੁੰਚ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ। ਤੁਸੀਂ ਬਾਅਦ ਵਿੱਚ Assistant ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਇਸਨੂੰ ਬੰਦ ਕਰਕੇ Voice Match ਇਜਾਜ਼ਤ ਨੂੰ ਹਟਾ ਸਕਦੇ ਹੋ।</translation> <translation id="5614190747811328134">ਵਰਤੋਂਕਾਰ ਨੋਟਿਸ</translation> <translation id="5614553682702429503">ਕੀ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ?</translation> <translation id="5616726534702877126">ਆਕਾਰ ਰਾਖਵਾਂ ਕਰੋ</translation> @@ -4137,6 +4151,7 @@ <translation id="574209121243317957">ਪਿਚ</translation> <translation id="5742505912938664543">ਜਦੋਂ ਤੁਸੀਂ ਇੱਥੇ ਕੋਈ ਸੈਕੰਡਰੀ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਉਸ ਖਾਤੇ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਤੁਸੀਂ ਵੈੱਬ ਬ੍ਰਾਊਜ਼ ਕਰ ਸਕਦੇ ਹੋ, ਐਪਾਂ ਡਾਊਨਲੋਡ ਕਰ ਸਕਦੇ ਹੋ, ਆਪਣੀ Gmail ਦੀ ਜਾਂਚ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਹੋਰ Google ਸੇਵਾਵਾਂ ਵਰਤ ਸਕਦੇ ਹੋ।</translation> <translation id="5746169159649715125">PDF ਵਜੋਂ ਰੱਖਿਅਤ ਕਰੋ</translation> +<translation id="5746261205461426123">ਸੈੱਟਅੱਪ ਗਾਈਡ ਖੋਲ੍ਹੋ</translation> <translation id="5747552184818312860">ਮਿਆਦ ਸਮਾਪਤ ਹੁੰਦੀ ਹੈ</translation> <translation id="5747785204778348146">ਵਿਕਾਸਕਾਰ - ਅਸਥਿਰ</translation> <translation id="5747809636523347288"><ph name="URL" /> ਪੇਸਟ ਕਰਕੇ ਉਸ 'ਤੇ ਜਾਓ</translation> @@ -5048,6 +5063,7 @@ <translation id="6824584962142919697">&ਅੰਸ਼ਾਂ ਦੀ ਜਾਂਚ ਕਰੋ</translation> <translation id="6825184156888454064">ਨਾਮ ਮੁਤਾਬਕ ਕ੍ਰਮ-ਬੱਧ ਕਰੋ</translation> <translation id="6826872289184051766">USB ਰਾਹੀਂ ਪੁਸ਼ਟੀ ਕਰੋ</translation> +<translation id="6827604573767207488">ਇੰਝ ਲੱਗਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ 'ਤੇ ਵਿਅਕਤੀਗਤ ਬਣਾਈ Assistant ਦਾ ਸੈੱਟਅੱਪ ਕਰ ਲਿਆ ਹੈ। ਅੱਗੇ ਦਿੱਤੀ ਗਈ ਸੈਟਿੰਗ ਨੂੰ ਚਾਲੂ ਕਰਕੇ ਆਪਣੀ Assistant ਦਾ ਹੋਰ ਜ਼ਿਆਦਾ ਲਾਹਾ ਲਓ।</translation> <translation id="6828153365543658583">ਇਹਨਾਂ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਸਾਈਨ-ਇਨ 'ਤੇ ਪਾਬੰਦੀ ਲਗਾਓ:</translation> <translation id="6828182567531805778">ਆਪਣੇ ਡਾਟੇ ਦਾ ਸਮਕਾਲੀਕਰਨ ਕਰਨ ਲਈ ਆਪਣਾ ਪਾਸਫਰੇਜ਼ ਦਾਖਲ ਕਰੋ</translation> <translation id="682871081149631693">ਝੱਟ ਹੱਲ ਵਾਲਾ ਬਿਲਡ</translation> @@ -5288,6 +5304,7 @@ <translation id="708278670402572152">ਸਕੈਨ ਕਰਨਾ ਚਾਲੂ ਕਰਨ ਲਈ ਡਿਸਕਨੈਕਟ ਕਰੋ</translation> <translation id="7084321615353200053">ਸਾਈਟਾਂ ਤੁਹਾਡਾ ਕੈਮਰਾ ਵਰਤਣ ਲਈ ਪੁੱਛ ਸਕਦੀਆਂ ਹਨ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation> <translation id="7085389578340536476">ਕੀ Chrome ਨੂੰ ਆਡੀਓ ਰਿਕਾਰਡ ਕਰਨ ਦੇਣਾ ਹੈ?</translation> +<translation id="7085805695634549980">Google ਸੇਵਾਵਾਂ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਗੜਬੜ ਕੋਡ: <ph name="ERROR_CODE" />।</translation> <translation id="7086672505018440886">Chrome ਲੌਗ ਫ਼ਾਈਲਾਂ ਨੂੰ ਪੁਰਾਲੇਖ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ।</translation> <translation id="7088434364990739311">ਅੱਪਡੇਟ ਜਾਂਚ ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ (ਗੜਬੜ ਕੋਡ <ph name="ERROR" />)।</translation> <translation id="7088561041432335295">Zip Archiver - ਫ਼ਾਈਲ ਐਪ ਵਿੱਚ ਜ਼ਿਪ ਫ਼ਾਈਲਾਂ ਨੂੰ ਖੋਲ੍ਹੋ ਅਤੇ ਪੈਕ ਕਰੋ।</translation> @@ -5482,6 +5499,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> ਨੇ ADB ਡੀਬੱਗਿੰਗ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। ਇੱਕ ਵਾਰ ਤੁਹਾਡੇ ਵੱਲੋਂ ਤੁਹਾਡੀ <ph name="DEVICE_TYPE" /> ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ 'ਤੇ, ਤੁਸੀਂ ਅਗਿਆਤ ਸਰੋਤ ਤੋਂ ਐਪਾਂ ਸਥਾਪਤ ਨਹੀਂ ਕਰ ਸਕੋਗੇ।</translation> <translation id="7328867076235380839">ਅਵੈਧ ਸੁਮੇਲ</translation> <translation id="7329154610228416156">ਸਾਈਨ-ਇਨ ਅਸਫਲ ਹੋ ਗਿਆ ਕਿਉਂਕਿ ਇਹ ਕਿਸੇ ਗੈਰ-ਸੁਰੱਖਿਅਤ URL (<ph name="BLOCKED_URL" />) ਨਾਲ ਸੰਰੂਪਿਤ ਕੀਤਾ ਗਿਆ ਸੀ। ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</translation> +<translation id="7329932885428707942">ਇਸ ਨਾਲ ਥੋੜ੍ਹੇ ਸਮੇਂ ਲਈ ਸੈਲਿਊਲਰ ਨੈੱਟਵਰਕ ਡਿਸਕਨੈਕਟ ਹੋ ਸਕਦਾ ਹੈ।</translation> <translation id="7332053360324989309">ਸਮਰਪਿਤ ਕਰਮਚਾਰੀ: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">ਡੌਕ ਕੀਤਾ ਵਿਸਤਾਰਕ ਚਾਲੂ ਕਰੋ</translation> <translation id="7335974957018254119">ਇਹਨਾਂ ਲਈ ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚ ਵਰਤੋ</translation> @@ -6149,6 +6167,7 @@ <translation id="8059417245945632445">&ਡਿਵਾਈਸਾਂ ਦੀ ਜਾਂਚ ਕਰੋ</translation> <translation id="8059456211585183827">ਰੱਖਿਅਤ ਕਰਨ ਲਈ ਕੋਈ ਪ੍ਰਿੰਟਰ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।</translation> <translation id="8061091456562007989">ਇਸਨੂੰ ਵਾਪਸ ਬਦਲੋ</translation> +<translation id="8061991877177392872">ਇੰਝ ਲੱਗਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ 'ਤੇ ਆਪਣੀ Assistant ਨਾਲ ਪਹਿਲਾਂ ਹੀ Voice Match ਦਾ ਸੈੱਟਅੱਪ ਕਰ ਲਿਆ ਹੈ। ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਇਹਨਾਂ ਪਿਛਲੀਆਂ ਰਿਕਾਰਡਿੰਗਾਂ ਨੂੰ ਅਵਾਜ਼ੀ ਮਾਡਲ ਬਣਾਉਣ ਲਈ ਵਰਤਿਆ ਗਿਆ ਸੀ।</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 ਕਾਗਜ਼ ਦੀ ਸ਼ੀਟ}one{{COUNT} ਕਾਗਜ਼ ਦੀ ਸ਼ੀਟ}other{{COUNT} ਕਾਗਜ਼ ਦੀਆਂ ਸ਼ੀਟਾਂ}}</translation> <translation id="8062879968880283306">ਡੀਵਾਈਸ ਕੈਮਰਾ ਵਰਤ ਕੇ QR ਕੋਡ ਨੂੰ ਸਕੈਨ ਕਰੋ ਜਾਂ ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਵੱਲੋਂ ਮੁਹੱਈਆ ਕਰਵਾਇਆ ਗਿਆ 'ਕਿਰਿਆਸ਼ੀਲ ਕਰਨ ਲਈ ਕੋਡ' ਦਾਖਲ ਕਰੋ।</translation> <translation id="8063235345342641131">ਪੂਰਵ-ਨਿਰਧਾਰਤ ਹਰਾ ਅਵਤਾਰ</translation> @@ -6417,6 +6436,7 @@ <translation id="8379991678458444070">ਇਸ ਟੈਬ ਨੂੰ ਬੁੱਕਮਾਰਕ ਕਰੋ ਤਾਂ ਕਿ ਤੁਸੀਂ ਇੱਥੇ ਤੇਜ਼ੀ ਨਾਲ ਵਾਪਸ ਆ ਸਕੋ</translation> <translation id="8382913212082956454">&ਈਮੇਲ ਪਤਾ ਕਾਪੀ ਕਰੋ</translation> <translation id="8386091599636877289">ਨੀਤੀ ਨਹੀਂ ਮਿਲੀ।</translation> +<translation id="8386819192691131213">ਤਤਕਾਲ ਜਵਾਬ, ਜਿਵੇਂ ਕਿ ਅਨੁਵਾਦ, ਪਰਿਭਾਸ਼ਾ, ਇਕਾਈ ਰੂਪਾਂਤਰਨ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਲਈ, Assistant ਨੂੰ ਸਕ੍ਰੀਨ 'ਤੇ ਦਿੱਤੀ ਜਾਣਕਾਰੀ ਵਰਤਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ</translation> <translation id="8386903983509584791">ਸਕੈਨ ਪੂਰਾ ਹੋਈ</translation> <translation id="8387361103813440603">ਤੁਹਾਡੇ ਟਿਕਾਣੇ ਨੂੰ ਦੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ</translation> <translation id="8389264703141926739">ਸੂਚਨਾਵਾਂ ਨੂੰ ਬਲਾਕ ਕਰੋ</translation> @@ -6895,6 +6915,7 @@ <translation id="8915370057835397490">ਸੁਝਾਅ ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ</translation> <translation id="8916476537757519021">ਗੁਮਨਾਮ ਸਬਫ੍ਰੇਮ: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> ਦਾ <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">ਮਾਊਸ ਵੱਲੋਂ ਸਕ੍ਰੀਨ ਦੇ ਕਿਨਾਰਿਆਂ ਨੂੰ ਸਪਰਸ਼ ਕਰਨ 'ਤੇ ਸਕ੍ਰੀਨ ਨੂੰ ਹਿਲਾਓ</translation> <translation id="8923880975836399332">ਗੂੜ੍ਹਾ ਹਰਾ-ਨੀਲਾ</translation> <translation id="8925458182817574960">&ਸੈਟਿੰਗਾਂ</translation> <translation id="8926389886865778422">ਦੁਬਾਰਾ ਨਾ ਪੁੱਛੋ</translation> @@ -6972,6 +6993,7 @@ <translation id="9009708085379296446">ਕੀ ਤੁਸੀਂ ਇਹ ਪੰਨਾ ਬਦਲਣਾ ਸੀ?</translation> <translation id="9011163749350026987">ਹਮੇਸ਼ਾਂ ਚਿੰਨ੍ਹ ਦਿਖਾਓ</translation> <translation id="9011393886518328654">ਰਿਲੀਜ਼ ਨੋਟ-ਕਥਨ</translation> +<translation id="9012122671773859802">ਮਾਊਸ ਦੀ ਹਲਚਲ ਮੁਤਾਬਕ ਲਗਾਤਾਰ ਸਕ੍ਰੀਨ ਨੂੰ ਹਿਲਾਓ</translation> <translation id="9013037634206938463">Linux ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਲਈ <ph name="INSTALL_SIZE" /> ਖਾਲੀ ਜਗ੍ਹਾ ਦੀ ਲੋੜ ਹੈ। ਖਾਲੀ ਜਗ੍ਹਾ ਨੂੰ ਵਧਾਉਣ ਲਈ, ਆਪਣੇ ਡੀਵਾਈਸ ਵਿੱਚੋਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।</translation> <translation id="9013707997379828817">ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਇਸ ਡੀਵਾਈਸ ਨੂੰ ਪਿਛਲੇ ਵਰਜਨ 'ਤੇ ਵਾਪਸ ਲੈ ਆਇਆ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਜ਼ਰੂਰੀ ਫ਼ਾਈਲਾਂ ਰੱਖਿਅਤ ਕਰੋ ਅਤੇ ਫਿਰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ। ਡੀਵਾਈਸ 'ਤੇ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।</translation> <translation id="901668144954885282">'Google ਡਰਾਈਵ' ਵਿੱਚ ਬੈਕਅੱਪ ਲਓ</translation> @@ -7016,6 +7038,7 @@ <translation id="9052404922357793350">ਬਲਾਕ ਕਰਨਾ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="9053563360605707198">ਦੋਵੇਂ ਪਾਸੇ ਪ੍ਰਿੰਟ ਕਰੋ</translation> <translation id="9053893665344928494">ਮੇਰੀ ਪਸੰਦ ਯਾਦ ਰੱਖੋ</translation> +<translation id="9055278955535611574">"Ok Google" ਨਾਲ ਆਪਣੀ Assistant ਤੱਕ ਪਹੁੰਚ ਕਰੋ</translation> <translation id="9055636786322918818">RC4 ਇਨਕ੍ਰਿਪਸ਼ਨ ਲਾਜ਼ਮੀ ਬਣਾਓ। ਇਸ ਵਿਕਲਪ ਦੀ ਵਰਤੋਂ ਕਰਨਾ, RC4 ciphers ਦੇ ਅਸੁਰੱਖਿਅਤ ਹੋਣ ਕਰਕੇ ਤੁਹਾਡੇ ਜੋਖਮ ਨੂੰ ਵਧਾਉਂਦਾ ਹੈ।</translation> <translation id="9056810968620647706">ਕੋਈ ਮੇਲ ਨਹੀਂ ਮਿਲੇ ਸਨ।</translation> <translation id="9057354806206861646">ਅੱਪਡੇਟਾਂ ਦੀ ਸਮਾਂ-ਸੂਚੀ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index ccfe347..0af3afc 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Dostęp do urządzeń Bluetooth i szeregowych</translation> <translation id="114036956334641753">Dźwięk i napisy</translation> <translation id="1140746652461896221">Blokuj treść na każdej odwiedzanej stronie</translation> +<translation id="1141953877381847186">Zezwól Asystentowi na korzystanie z informacji na ekranie, aby mógł podawać szybkie odpowiedzi, takie jak tłumaczenia, definicje czy przeliczenia jednostek. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Pamiętaj:<ph name="END_BOLD" /> zawsze możesz zmienić to później, wybierając Ustawienia Asystenta Google > Powiązane informacje.</translation> <translation id="1143142264369994168">Podmiot podpisujący certyfikat</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Szkodliwe oprogramowanie nie zostało znalezione przez Chrome na komputerze • Sprawdzono minutę temu}few{Szkodliwe oprogramowanie nie zostało znalezione przez Chrome na komputerze • Sprawdzono {NUM_MINS} minuty temu}many{Szkodliwe oprogramowanie nie zostało znalezione przez Chrome na komputerze • Sprawdzono {NUM_MINS} minut temu}other{Szkodliwe oprogramowanie nie zostało znalezione przez Chrome na komputerze • Sprawdzono {NUM_MINS} minuty temu}}</translation> <translation id="1145593918056169051">Drukarka przestała działać</translation> @@ -1433,7 +1436,9 @@ <translation id="2594999711683503743">Wyszukaj w Google lub wpisz URL</translation> <translation id="2602501489742255173">Przesuń palcem w górę, by rozpocząć</translation> <translation id="2603115962224169880">Oczyść komputer</translation> +<translation id="2603355571917519942">Funkcja Voice Match jest gotowa</translation> <translation id="2603463522847370204">Otwórz w oknie &incognito</translation> +<translation id="2604138917550693049">Szukaj grafiki za pomocą Obiektywu Google</translation> <translation id="2604255671529671813">Błąd połączenia z siecią</translation> <translation id="2606246518223360146">Połącz dane</translation> <translation id="2606454609872547359">Nie, kontynuuj bez ChromeVoksa</translation> @@ -1776,6 +1781,7 @@ <translation id="2963151496262057773">Ta wtyczka nie odpowiada: <ph name="PLUGIN_NAME" />Chcesz ją zatrzymać?</translation> <translation id="2964193600955408481">Wyłącz Wi-Fi</translation> <translation id="2964245677645334031">Udostępnianie w pobliżu widoczność</translation> +<translation id="2966216232069818096">Aby korzystać z pomocy Asystenta, zezwól mu na dostęp do informacji na ekranie</translation> <translation id="2966937470348689686">Zarządzaj ustawieniami Androida</translation> <translation id="2972581237482394796">&Ponów</translation> <translation id="2973324205039581528">Wycisz stronę</translation> @@ -1872,6 +1878,7 @@ <translation id="308268297242056490">Identyfikator URI</translation> <translation id="3082780749197361769">Ta karta używa Twojej kamery lub mikrofonu.</translation> <translation id="3083193146044397360">Tymczasowo zablokowano, by chronić Twoje bezpieczeństwo</translation> +<translation id="3083899879156272923">Przesuwaj ekran, pozostawiając mysz na środku</translation> <translation id="3084548735795614657">Przeciągnij tutaj, by zainstalować</translation> <translation id="3084771660770137092">W przeglądarce Chrome zabrakło pamięci albo proces strony internetowej został zakończony z innego powodu. Aby kontynuować, załaduj stronę ponownie lub przejdź do innej strony.</translation> <translation id="3084958266922136097">Wyłącz wygaszacz ekranu</translation> @@ -2367,6 +2374,9 @@ <translation id="3654045516529121250">Odczyt ustawień ułatwień dostępu</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ma stały dostęp do jednego pliku.}few{Ma stały dostęp do # plików.}many{Ma stały dostęp do # plików.}other{Ma stały dostęp do # pliku.}}</translation> <translation id="3658871634334445293">Przyspieszenie TrackPointa</translation> +<translation id="3659830472545192450">Voice Match pomaga Asystentowi Google rozpoznawać Twój głos na Chromebooku i odróżniać Cię od innych osób. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Pamiętaj:<ph name="END_BOLD" /> osoby, które mają podobny głos lub użyją nagrania, również będą mogły uzyskać dostęp do Twoich wyników. Uprawnienie do używania funkcji Voice Match możesz później wyłączyć w ustawieniach Asystenta.</translation> <translation id="3660234220361471169">Niezaufany</translation> <translation id="3664511988987167893">Ikona rozszerzenia</translation> <translation id="3665589677786828986">Przeglądarka Chrome wykryła, że niektóre z jej ustawień zostały zmodyfikowane przez inny program, i przywróciła im pierwotne wartości domyślne.</translation> @@ -2975,7 +2985,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> udostępnia okno.</translation> <translation id="4364830672918311045">Wyświetlanie powiadomień</translation> <translation id="4366138410738374926">Rozpoczęto drukowanie</translation> -<translation id="437004882363131692">Otrzymuj wskazówki na temat urządzeń <ph name="DEVICE_TYPE" /> oraz najnowsze wiadomości i oferty. Dziel się swoją opinią. W dowolnej chwili możesz zrezygnować z subskrypcji.</translation> <translation id="4370425812909262207">Koszyki zostały ukryte. Pojawią się z powrotem, gdy wprowadzisz zmiany.</translation> <translation id="4370975561335139969">Podany adres e-mail i hasło nie pasują do siebie</translation> <translation id="4374831787438678295">Instalator Linuksa</translation> @@ -3555,6 +3564,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Sprawdzanie pisowni w wybranych językach nie jest obsługiwane</translation> <translation id="5052499409147950210">Edytowanie strony internetowej</translation> +<translation id="5053962746715621840">Szukanie grafiki za pomocą Obiektywu Google</translation> <translation id="5057110919553308744">Gdy klikniesz rozszerzenie</translation> <translation id="5057403786441168405">Zarządzanie kontami zalogowanych użytkowników. Witryny, aplikacje i rozszerzenia w Chrome i Google Play mogą używać tych kont do dostosowywania swojego wyglądu i działania (jeśli mają odpowiednie uprawnienia). <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Ograniczanie logowania się</translation> @@ -4038,6 +4048,9 @@ <translation id="5610038042047936818">Przełącz na tryb aparatu</translation> <translation id="561030196642865721">Pliki cookie innych firm są dozwolone na tej stronie</translation> <translation id="5612734644261457353">Nadal nie można zweryfikować Twojego hasła. Uwaga: jeśli ostatnio hasło było zmieniane, nowe hasło zostanie zastosowane, gdy się wylogujesz. Tu podaj stare hasło.</translation> +<translation id="561308544008485315">Voice Match pomaga Asystentowi Google rozpoznawać Twój głos na Chromebooku i odróżniać Cię od innych osób. Aby oszczędzać baterię, polecenie „OK Google” jest włączone tylko wtedy, gdy urządzenie jest podłączone do zasilania. Możesz to zmienić w Ustawieniach. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Pamiętaj:<ph name="END_BOLD" /> osoby, które mają podobny głos lub użyją nagrania, również będą mogły uzyskać dostęp do Twoich wyników. Uprawnienie do używania funkcji Voice Match możesz później wyłączyć w ustawieniach Asystenta.</translation> <translation id="5614190747811328134">Informacje dla użytkownika</translation> <translation id="5614553682702429503">Zapisać hasło?</translation> <translation id="5616726534702877126">Zarezerwuj rozmiar</translation> @@ -5066,6 +5079,7 @@ <translation id="6824584962142919697">&Sprawdź elementy</translation> <translation id="6825184156888454064">Sortuj według nazwy</translation> <translation id="6826872289184051766">Zweryfikuj przez USB</translation> +<translation id="6827604573767207488">Wygląda na to, że masz już spersonalizowanego Asystenta na innym urządzeniu. Wykorzystaj go jeszcze lepiej, włączając poniższe ustawienie.</translation> <translation id="6828153365543658583">Ogranicz logowanie do następujących użytkowników:</translation> <translation id="6828182567531805778">Aby synchronizować dane, wpisz hasło</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5500,6 +5514,7 @@ <translation id="7327989755579928735">Domena <ph name="MANAGER" /> wyłączyła debugowanie ADB. Po zrestartowaniu urządzenia <ph name="DEVICE_TYPE" /> nie będzie można instalować aplikacji z innych urządzeń.</translation> <translation id="7328867076235380839">Niepoprawna kombinacja</translation> <translation id="7329154610228416156">Nie udało się zalogować, bo mechanizm logowania korzysta z niezabezpieczonego URL-a (<ph name="BLOCKED_URL" />). Skontaktuj się z administratorem.</translation> +<translation id="7329932885428707942">Może to spowodować krótką przerwę w połączeniu z siecią komórkową.</translation> <translation id="7332053360324989309">Dedykowana instancja robocza: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Włącz lupę zadokowaną</translation> <translation id="7335974957018254119">Używaj sprawdzania pisowni dla języka:</translation> @@ -5543,6 +5558,7 @@ <translation id="7374376573160927383">Zarządzanie urządzeniami USB</translation> <translation id="7375235221357833624">{0,plural, =1{Aktualizacja urządzenia nastąpi w ciągu godziny}few{Aktualizacja urządzenia nastąpi w ciągu # godzin}many{Aktualizacja urządzenia nastąpi w ciągu # godzin}other{Aktualizacja urządzenia nastąpi w ciągu # godziny}}</translation> <translation id="7376553024552204454">Podświetlaj wskaźnik myszy, gdy się porusza</translation> +<translation id="737728204345822099">Wizyta na tej stronie może zostać zarejestrowana na Twoim kluczu bezpieczeństwa.</translation> <translation id="7377451353532943397">Nadal blokuj dostęp do czujników</translation> <translation id="7378611153938412599">Słabe hasła są łatwe do odgadnięcia. Pamiętaj, by używać tylko silnych haseł. <ph name="BEGIN_LINK" />Więcej wskazówek dotyczących bezpieczeństwa<ph name="END_LINK" /></translation> <translation id="73786666777299047">Otwórz Chrome Web Store</translation> @@ -6169,6 +6185,7 @@ <translation id="8059417245945632445">&Sprawdź urządzenia</translation> <translation id="8059456211585183827">Nie ma dostępnych drukarek do zapisania.</translation> <translation id="8061091456562007989">Cofnij zmiany</translation> +<translation id="8061991877177392872">Wygląda na to, że Asystent zna już Twój głos z innego urządzenia, na którym masz ustawioną funkcję Voice Match. Zapisane tam nagrania zostały użyte do utworzenia modelu głosu na tym urządzeniu.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 kartka}few{{COUNT} kartki}many{{COUNT} kartek}other{{COUNT} kartki}}</translation> <translation id="8062879968880283306">Zeskanuj kod QR, używając aparatu urządzenia, lub wpisz kod aktywacyjny podany przez operatora.</translation> <translation id="8063235345342641131">Domyślny zielony awatar</translation> @@ -6440,6 +6457,7 @@ <translation id="8379991678458444070">Dodaj tę stronę do zakładek, by szybko na nią wrócić</translation> <translation id="8382913212082956454">Kopiuj adres &e-mail</translation> <translation id="8386091599636877289">Nie znaleziono zasady.</translation> +<translation id="8386819192691131213">Zezwól Asystentowi na korzystanie z informacji na ekranie, aby mógł podawać szybkie odpowiedzi, takie jak tłumaczenia, definicje czy przeliczenia jednostek</translation> <translation id="8386903983509584791">Skanowanie ukończone</translation> <translation id="8387361103813440603">Nie zezwolono na sprawdzanie lokalizacji</translation> <translation id="8389264703141926739">Blokuj powiadomienia</translation> @@ -6924,6 +6942,7 @@ <translation id="8915370057835397490">Ładuję sugestie</translation> <translation id="8916476537757519021">Ramka podrzędna incognito: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />: <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">Przesuwaj ekran, gdy mysz dotyka krawędzi ekranu</translation> <translation id="8923880975836399332">Ciemny morski</translation> <translation id="8925458182817574960">&Ustawienia</translation> <translation id="8926389886865778422">Nie pytaj ponownie</translation> @@ -7001,6 +7020,7 @@ <translation id="9009708085379296446">Czy ta strona miała zostać zmieniona?</translation> <translation id="9011163749350026987">Zawsze pokazuj ikonę</translation> <translation id="9011393886518328654">Informacje o wersji</translation> +<translation id="9012122671773859802">Przesuwaj ekran razem z ruchem myszy</translation> <translation id="9013037634206938463">Do korzystania z Linuksa wymagane jest <ph name="INSTALL_SIZE" /> wolnego miejsca. Aby zwolnić miejsce, usuń pliki z urządzenia.</translation> <translation id="9013707997379828817">Administrator przywrócił wcześniejszą wersję oprogramowania na tym urządzeniu. Zapisz ważne pliki, a następnie uruchom ponownie urządzenie. Wszystkie dane zostaną usunięte z pamięci.</translation> <translation id="901668144954885282">Tworzenie kopii zapasowej na Dysku Google</translation> @@ -7045,6 +7065,7 @@ <translation id="9052404922357793350">Nadal blokuj</translation> <translation id="9053563360605707198">Drukuj obustronnie</translation> <translation id="9053893665344928494">Zapamiętaj mój wybór</translation> +<translation id="9055278955535611574">Uruchamiaj Asystenta, mówiąc „OK Google”.</translation> <translation id="9055636786322918818">Wymusza szyfrowanie RC4. Używanie tej opcji jest ryzykowne, ponieważ szyfrowanie RC4 nie zapewnia bezpieczeństwa.</translation> <translation id="9056810968620647706">Nie znaleziono żadnych dopasowań.</translation> <translation id="9057354806206861646">Harmonogram aktualizacji</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 93dc329..3009d6a 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Acessar seus dispositivos seriais e Bluetooth</translation> <translation id="114036956334641753">Áudio e legendas</translation> <translation id="1140746652461896221">Bloquear conteúdo em qualquer página visitada</translation> +<translation id="1141953877381847186">Permita que o Google Assistente use informações na tela para oferecer respostas rápidas, como traduções, definições, conversões de unidades e muito mais. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Lembre-se<ph name="END_BOLD" />: você pode mudar isso a qualquer momento em Configurações do Google Assistente > Informações relacionadas.</translation> <translation id="1143142264369994168">Signatário do certificado</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{O Chrome não encontrou softwares nocivos no computador • Verificado 1 minuto atrás}one{O Chrome não encontrou softwares nocivos no computador • Verificado {NUM_MINS} minuto atrás}other{O Chrome não encontrou softwares nocivos no computador • Verificado {NUM_MINS} minutos atrás}}</translation> <translation id="1145593918056169051">A impressora parou</translation> @@ -1432,7 +1435,9 @@ <translation id="2594999711683503743">Pesquisar no Google ou digitar o URL</translation> <translation id="2602501489742255173">Deslize para cima para começar</translation> <translation id="2603115962224169880">Limpar o computador</translation> +<translation id="2603355571917519942">O Voice Match está pronto</translation> <translation id="2603463522847370204">Abrir em &janela anônima</translation> +<translation id="2604138917550693049">Pesquisar imagem com o Google Lens</translation> <translation id="2604255671529671813">Erro de conexão da rede</translation> <translation id="2606246518223360146">Vincular dados</translation> <translation id="2606454609872547359">Não, continuar sem o ChromeVox</translation> @@ -1774,6 +1779,7 @@ <translation id="2963151496262057773">Este plug-in não responde: <ph name="PLUGIN_NAME" />. Quer interrompê-lo?</translation> <translation id="2964193600955408481">Desativar Wi-Fi</translation> <translation id="2964245677645334031">Visibilidade do Compartilhar por proximidade</translation> +<translation id="2966216232069818096">Permita que o Google Assistente use as informações na tela para oferecer ajuda</translation> <translation id="2966937470348689686">Gerenciar preferências do Android</translation> <translation id="2972581237482394796">&Refazer</translation> <translation id="2973324205039581528">Desativar som do site</translation> @@ -1869,6 +1875,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Esta guia está usando sua câmera ou microfone.</translation> <translation id="3083193146044397360">Bloqueada temporariamente para proteger sua segurança</translation> +<translation id="3083899879156272923">Mover a tela, mantendo o mouse no centro dela</translation> <translation id="3084548735795614657">Soltar para instalar</translation> <translation id="3084771660770137092">O Google Chrome ficou sem memória ou o processo da página foi encerrado por algum outro motivo. Para continuar, atualize a página ou vá para outra página.</translation> <translation id="3084958266922136097">Desativar o protetor de tela</translation> @@ -2362,6 +2369,9 @@ <translation id="3654045516529121250">Ler suas configurações de acessibilidade</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Tem acesso permanente a um arquivo.}one{Tem acesso permanente a # arquivos.}other{Tem acesso permanente a # arquivos.}}</translation> <translation id="3658871634334445293">Aceleração do TrackPoint</translation> +<translation id="3659830472545192450">O Voice Match ajuda o Google Assistente a identificar sua voz no Chromebook e diferenciá-la de outras. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Lembre-se<ph name="END_BOLD" />: é possível que uma pessoa com uma voz parecida ou uma gravação também consiga acessar seus resultados pessoais. Se quiser retirar a permissão do Voice Match, desative o recurso nas configurações do Google Assistente.</translation> <translation id="3660234220361471169">Não confiáveis</translation> <translation id="3664511988987167893">Ícone de extensão</translation> <translation id="3665589677786828986">O Google Chrome detectou que algumas das suas configurações foram corrompidas por outro programa e as redefiniu para os padrões originais.</translation> @@ -2968,7 +2978,6 @@ <translation id="4364567974334641491">O app <ph name="APP_NAME" /> está compartilhando uma janela.</translation> <translation id="4364830672918311045">Exibir notificações</translation> <translation id="4366138410738374926">Impressão iniciada</translation> -<translation id="437004882363131692">Receba ofertas, atualizações e dicas sobre o <ph name="DEVICE_TYPE" /> e compartilhe seu feedback. É possível cancelar a inscrição a qualquer momento.</translation> <translation id="4370425812909262207">Carrinhos ocultados. Eles aparecerão novamente quando você fizer mudanças.</translation> <translation id="4370975561335139969">O e-mail e a senha que você digitou não coincidem.</translation> <translation id="4374831787438678295">Instalador do Linux</translation> @@ -3545,6 +3554,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">A verificação ortográfica não é compatível com os idiomas selecionados</translation> <translation id="5052499409147950210">Editar site</translation> +<translation id="5053962746715621840">Pesquisar imagem com o Google Lens</translation> <translation id="5057110919553308744">Quando você clicar na extensão</translation> <translation id="5057403786441168405">Gerencie suas contas conectadas. Sites, apps e extensões no Chrome e no Google Play podem usar essas contas para personalizar sua experiência, dependendo das permissões. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Restringir o login</translation> @@ -4027,6 +4037,9 @@ <translation id="5610038042047936818">Alternar para o modo de câmera</translation> <translation id="561030196642865721">Cookies de terceiros são permitidos neste site</translation> <translation id="5612734644261457353">Não foi possível confirmar sua senha. Nota: se você alterou sua senha recentemente, a nova senha será aplicada depois que você sair. Use a senha antiga aqui.</translation> +<translation id="561308544008485315">O Voice Match ajuda o Google Assistente a identificar sua voz no Chromebook e diferenciá-la de outras. Para economizar bateria, o "Ok Google" só é ativado quando o dispositivo está conectado a uma fonte de energia. Se quiser mudar isso, acesse as configurações. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Lembre-se<ph name="END_BOLD" />: é possível que uma pessoa com uma voz parecida ou uma gravação também consiga acessar seus resultados pessoais. Se quiser retirar a permissão do Voice Match, desative o recurso nas configurações do Google Assistente.</translation> <translation id="5614190747811328134">Aviso para o usuário</translation> <translation id="5614553682702429503">Salvar senha?</translation> <translation id="5616726534702877126">Reservar tamanho</translation> @@ -5051,6 +5064,7 @@ <translation id="6824584962142919697">&Inspecionar elementos</translation> <translation id="6825184156888454064">Classificar por nome</translation> <translation id="6826872289184051766">Verificar por USB</translation> +<translation id="6827604573767207488">Parece que você já personalizou o Google Assistente em outro dispositivo. Ative a configuração a seguir para aproveitar ainda mais esse recurso.</translation> <translation id="6828153365543658583">Restringir o login para os seguintes usuários:</translation> <translation id="6828182567531805778">Insira a senha longa para sincronizar seus dados</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5485,6 +5499,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> desativou a depuração do adb. Não será possível transferir apps por sideload depois de reiniciar o <ph name="DEVICE_TYPE" />.</translation> <translation id="7328867076235380839">Combinação inválida</translation> <translation id="7329154610228416156">O login falhou porque foi configurado para usar um URL não seguro (<ph name="BLOCKED_URL" />). Entre em contato com o administrador.</translation> +<translation id="7329932885428707942">Isso pode causar uma desconexão momentânea da rede celular.</translation> <translation id="7332053360324989309">Worker dedicado: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Ativar lupa em área fixa</translation> <translation id="7335974957018254119">Usar verificação ortográfica para</translation> @@ -5528,6 +5543,7 @@ <translation id="7374376573160927383">Gerenciar dispositivos USB</translation> <translation id="7375235221357833624">{0,plural, =1{Atualize o dispositivo em uma hora}one{Atualize o dispositivo em # hora}other{Atualize o dispositivo em # horas}}</translation> <translation id="7376553024552204454">Destacar o cursor do mouse quando ele estiver se movendo</translation> +<translation id="737728204345822099">Um registro da visita a este site poderá ser mantido na sua chave de segurança.</translation> <translation id="7377451353532943397">Continuar bloqueando o acesso ao sensor</translation> <translation id="7378611153938412599">Senhas fracas são fáceis de adivinhar. Crie senhas fortes. <ph name="BEGIN_LINK" />Veja mais dicas de segurança<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Abrir a Chrome Web Store</translation> @@ -6154,6 +6170,7 @@ <translation id="8059417245945632445">&Inspecionar dispositivos</translation> <translation id="8059456211585183827">Não há impressoras disponíveis para salvar.</translation> <translation id="8061091456562007989">Mudar para configuração anterior</translation> +<translation id="8061991877177392872">Parece que você já configurou o Voice Match com o Google Assistente em outro dispositivo. As gravações anteriores foram usadas para criar um modelo de voz aqui.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 folha de papel}one{{COUNT} folha de papel}other{{COUNT} folhas de papel}}</translation> <translation id="8062879968880283306">Use a câmera do dispositivo para ler o código QR ou insira o código de ativação fornecido pela operadora.</translation> <translation id="8063235345342641131">Avatar verde padrão</translation> @@ -6423,6 +6440,7 @@ <translation id="8379991678458444070">Para voltar a esta guia rapidamente, adicione-a aos favoritos</translation> <translation id="8382913212082956454">Copiar &endereço de e-mail</translation> <translation id="8386091599636877289">Política não encontrada.</translation> +<translation id="8386819192691131213">Permita que o Google Assistente use informações na tela para oferecer respostas rápidas, como traduções, definições, conversões de unidades e muito mais</translation> <translation id="8386903983509584791">Verificação concluída</translation> <translation id="8387361103813440603">Bloquear o acesso à localização</translation> <translation id="8389264703141926739">Bloquear notificações</translation> @@ -6901,6 +6919,7 @@ <translation id="8915370057835397490">Carregando sugestão</translation> <translation id="8916476537757519021">Subquadro anônimo: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Mover a tela quando o mouse tocar na borda dela</translation> <translation id="8923880975836399332">Azul-petróleo-escuro</translation> <translation id="8925458182817574960">&Configurações</translation> <translation id="8926389886865778422">Não perguntar novamente</translation> @@ -6978,6 +6997,7 @@ <translation id="9009708085379296446">Você quis modificar esta página?</translation> <translation id="9011163749350026987">Sempre mostrar ícone</translation> <translation id="9011393886518328654">Notas da versão</translation> +<translation id="9012122671773859802">Mover a tela continuamente, seguindo o movimento do mouse</translation> <translation id="9013037634206938463">É necessário ter <ph name="INSTALL_SIZE" /> de espaço livre para instalar o Linux. Para liberar espaço, exclua arquivos do dispositivo.</translation> <translation id="9013707997379828817">O administrador reverteu este dispositivo. Salve arquivos importantes e reinicie. Todos os dados no dispositivo serão excluídos.</translation> <translation id="901668144954885282">Fazer backup no Google Drive</translation> @@ -7022,6 +7042,7 @@ <translation id="9052404922357793350">Continuar bloqueando</translation> <translation id="9053563360605707198">Imprimir dos dois lados</translation> <translation id="9053893665344928494">Lembrar minha escolha</translation> +<translation id="9055278955535611574">Acesse o Google Assistente usando o "Ok Google"</translation> <translation id="9055636786322918818">Aplicar a codificação RC4. O uso dessa opção é mais arriscado, porque as criptografias RC4 não são seguras.</translation> <translation id="9056810968620647706">Nenhuma correspondência foi encontrada.</translation> <translation id="9057354806206861646">Atualizar programação</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index d83fdf7..bad3978 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Aceder aos dispositivos Bluetooth e de série</translation> <translation id="114036956334641753">Áudio e legendas</translation> <translation id="1140746652461896221">Bloquear conteúdo em qualquer página visitada</translation> +<translation id="1141953877381847186">Permita que o Assistente utilize informações no ecrã para fornecer respostas rápidas, como tradução, definição, conversão de unidades e muito mais. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Tenha em atenção o seguinte:<ph name="END_BOLD" /> pode sempre alterar esta opção mais tarde nas Definições do Assistente Google > Informações relacionadas.</translation> <translation id="1143142264369994168">Signatário do certificado</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{O Chrome não encontrou software prejudicial no seu computador • Última verificação há 1 minuto}other{O Chrome não encontrou software prejudicial no seu computador • Última verificação há {NUM_MINS} minutos}}</translation> <translation id="1145593918056169051">A impressora parou</translation> @@ -1435,7 +1438,9 @@ <translation id="2594999711683503743">Pesquise no Google ou escreva o URL</translation> <translation id="2602501489742255173">Deslize rapidamente para cima para começar.</translation> <translation id="2603115962224169880">Limpar o computador</translation> +<translation id="2603355571917519942">O Voice Match está pronto</translation> <translation id="2603463522847370204">Abrir na janela de &navegação anónima</translation> +<translation id="2604138917550693049">Pesquisar imagem com o Google Lens</translation> <translation id="2604255671529671813">Erro de ligação à rede</translation> <translation id="2606246518223360146">Associar dados</translation> <translation id="2606454609872547359">Não, continuar com o ChromeVox</translation> @@ -1779,6 +1784,7 @@ Pretende pará-lo?</translation> <translation id="2964193600955408481">Desativar Wi-Fi</translation> <translation id="2964245677645334031">Visibilidade da funcionalidade Partilhar na proximidade</translation> +<translation id="2966216232069818096">Permita que o Assistente utilize informações no seu ecrã para ajudar</translation> <translation id="2966937470348689686">Gerir as preferências do Android</translation> <translation id="2972581237482394796">&Repetir</translation> <translation id="2973324205039581528">Desativar som do site</translation> @@ -1875,6 +1881,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Este separador está a utilizar a sua câmara ou microfone.</translation> <translation id="3083193146044397360">Foi bloqueado temporariamente para proteger a sua segurança</translation> +<translation id="3083899879156272923">Mover o ecrã mantendo o rato no centro do ecrã</translation> <translation id="3084548735795614657">Largar para instalar</translation> <translation id="3084771660770137092">O Chrome ficou sem memória ou o processo para a página Web foi terminado por qualquer outro motivo. Para continuar, atualize ou aceda a outra página.</translation> <translation id="3084958266922136097">Desativar proteção de ecrã</translation> @@ -2370,6 +2377,9 @@ <translation id="3654045516529121250">Ler definições de acessibilidade</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Tem acesso permanente a um ficheiro.}other{Tem acesso permanente a # ficheiros.}}</translation> <translation id="3658871634334445293">Aceleração do TrackPoint</translation> +<translation id="3659830472545192450">O Voice Match ajuda o Assistente Google a identificar a sua voz no Chromebook e a distingui-lo de outras pessoas. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Tenha em atenção o seguinte:<ph name="END_BOLD" /> uma voz semelhante ou uma gravação também pode conseguir aceder aos seus resultados pessoais. Pode remover a autorização do Voice Match mais tarde ao desativá-la nas Definições do Assistente.</translation> <translation id="3660234220361471169">Não fidedigno</translation> <translation id="3664511988987167893">Ícone da extensão</translation> <translation id="3665589677786828986">O Chrome detetou que algumas das suas definições foram danificadas por outro programa e repôs as respetivas predefinições originais.</translation> @@ -2978,7 +2988,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> está a partilhar uma janela.</translation> <translation id="4364830672918311045">Apresentar notificações</translation> <translation id="4366138410738374926">Impressão iniciada</translation> -<translation id="437004882363131692">Obtenha sugestões, ofertas e atualizações do <ph name="DEVICE_TYPE" /> e partilhe feedback. Anule a subscrição em qualquer altura.</translation> <translation id="4370425812909262207">Carrinhos ocultos. Serão apresentados novamente quando fizer alterações.</translation> <translation id="4370975561335139969">O email e a palavra-passe introduzidos não coincidem.</translation> <translation id="4374831787438678295">Instalador para o Linux</translation> @@ -3558,6 +3567,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">A verificação ortográfica não é suportada para os idiomas selecionados</translation> <translation id="5052499409147950210">Editar site</translation> +<translation id="5053962746715621840">Pesquisar imagem com o Google Lens</translation> <translation id="5057110919553308744">Quando clica na extensão</translation> <translation id="5057403786441168405">Faça a gestão das suas contas com sessão iniciada. Os Websites, as apps e as extensões no Chrome e Google Play podem utilizar estas contas para personalizar a sua experiência, consoante as autorizações. <ph name="LINK_BEGIN" />Saber mais<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Restringir início de sessão</translation> @@ -4042,6 +4052,9 @@ <translation id="5610038042047936818">Mudar para modo de câmara</translation> <translation id="561030196642865721">São permitidos cookies de terceiros neste site</translation> <translation id="5612734644261457353">Lamentamos, mas não foi possível confirmar a sua palavra-passe. Nota: se alterou a palavra-passe recentemente, a nova palavra-passe será aplicada quando terminar sessão. Utilize a palavra-passe antiga aqui.</translation> +<translation id="561308544008485315">O Voice Match ajuda o Assistente Google a identificar a sua voz no Chromebook e a distingui-lo de outras pessoas. Para poupar bateria, a funcionalidade "Ok Google" só é ativada quando o dispositivo estiver ligado a uma fonte de alimentação. Para efetuar alterações, aceda a Definições. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Tenha em atenção o seguinte:<ph name="END_BOLD" /> uma voz semelhante ou uma gravação também pode conseguir aceder aos seus resultados pessoais. Pode remover a autorização do Voice Match mais tarde ao desativá-la nas Definições do Assistente.</translation> <translation id="5614190747811328134">Aviso ao utilizador</translation> <translation id="5614553682702429503">Pretende guardar a palavra-passe?</translation> <translation id="5616726534702877126">Reservar tamanho</translation> @@ -5073,6 +5086,7 @@ <translation id="6824584962142919697">&Inspecionar elementos</translation> <translation id="6825184156888454064">Ordenar por nome</translation> <translation id="6826872289184051766">Validar através de USB</translation> +<translation id="6827604573767207488">Já configurou o Assistente personalizado num dispositivo diferente. Obtenha ainda mais com o Assistente ao ativar a seguinte definição.</translation> <translation id="6828153365543658583">Restringir início de sessão para os seguintes utilizadores:</translation> <translation id="6828182567531805778">Introduzir a frase de acesso para sincronizar os dados</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5508,6 +5522,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> desativou a depuração do ADB. Quando reiniciar o seu dispositivo <ph name="DEVICE_TYPE" />, não poderá fazer sideload de apps.</translation> <translation id="7328867076235380839">Combinação inválida.</translation> <translation id="7329154610228416156">O início de sessão falhou porque foi configurado para utilizar um URL não seguro (<ph name="BLOCKED_URL" />). Contacte o gestor.</translation> +<translation id="7329932885428707942">Isto pode provocar uma breve interrupção da ligação à rede móvel.</translation> <translation id="7332053360324989309">Trabalhador dedicado: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Ativar lupa ancorada</translation> <translation id="7335974957018254119">Utilizar o corretor ortográfico para</translation> @@ -5551,6 +5566,7 @@ <translation id="7374376573160927383">Gerir dispositivos USB</translation> <translation id="7375235221357833624">{0,plural, =1{Atualize o dispositivo dentro de uma hora}other{Atualize o dispositivo dentro de # horas}}</translation> <translation id="7376553024552204454">Realçar o cursor do rato ao ser movido</translation> +<translation id="737728204345822099">Poderá ser mantido um registo da sua visita a este site na sua chave de segurança.</translation> <translation id="7377451353532943397">Continuar a impedir o acesso aos sensores</translation> <translation id="7378611153938412599">As palavras-passe fracas são fáceis de adivinhar. Certifique-se de que cria palavras-passe fortes. <ph name="BEGIN_LINK" />Veja mais sugestões de segurança.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Abrir a Web Store do Chrome</translation> @@ -6178,6 +6194,7 @@ <translation id="8059417245945632445">&Inspecionar dispositivos</translation> <translation id="8059456211585183827">Não existem impressoras disponíveis para guardar.</translation> <translation id="8061091456562007989">Repor</translation> +<translation id="8061991877177392872">Já configurou o Voice Match com o Assistente noutro dispositivo. Estas gravações anteriores foram utilizadas para criar um modelo de voz neste dispositivo.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 folha de papel}other{{COUNT} folhas de papel}}</translation> <translation id="8062879968880283306">Leia o código QR com a câmara do dispositivo ou introduza o código de ativação fornecido pelo seu operador.</translation> <translation id="8063235345342641131">Avatar verde predefinido</translation> @@ -6448,6 +6465,7 @@ <translation id="8379991678458444070">Volte aqui rapidamente ao adicionar este separador aos marcadores</translation> <translation id="8382913212082956454">Copiar &endereço de email</translation> <translation id="8386091599636877289">A política não foi encontrada.</translation> +<translation id="8386819192691131213">Permita que o Assistente utilize informações no ecrã para fornecer respostas rápidas, como tradução, definição, conversão de unidades e muito mais.</translation> <translation id="8386903983509584791">Análise concluída</translation> <translation id="8387361103813440603">Sem autorização para ver a sua localização</translation> <translation id="8389264703141926739">Bloquear notificações</translation> @@ -6930,6 +6948,7 @@ <translation id="8915370057835397490">A carregar sugestão</translation> <translation id="8916476537757519021">Subestrutura da navegação anónima: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Mover o ecrã quando o rato tocar nos limites do ecrã</translation> <translation id="8923880975836399332">Azul esverdeado escuro</translation> <translation id="8925458182817574960">&Definições</translation> <translation id="8926389886865778422">Não voltar a perguntar</translation> @@ -7008,6 +7027,7 @@ <translation id="9009708085379296446">Pretendia alterar esta página?</translation> <translation id="9011163749350026987">Mostrar o ícone sempre</translation> <translation id="9011393886518328654">Notas de lançamento</translation> +<translation id="9012122671773859802">Mover o ecrã continuamente à medida que o rato se move</translation> <translation id="9013037634206938463">É necessário <ph name="INSTALL_SIZE" /> de espaço livre para instalar o Linux. Para aumentar o espaço livre, elimine ficheiros do dispositivo.</translation> <translation id="9013707997379828817">O administrador reverteu este dispositivo. Guarde os ficheiros importantes e reinicie. Todos os dados no dispositivo serão eliminados.</translation> <translation id="901668144954885282">Faça uma cópia de segurança para o Google Drive</translation> @@ -7052,6 +7072,7 @@ <translation id="9052404922357793350">Continuar a bloquear</translation> <translation id="9053563360605707198">Imprimir de ambos os lados</translation> <translation id="9053893665344928494">Memorizar a minha escolha</translation> +<translation id="9055278955535611574">Aceda ao Assistente com "Ok Google"</translation> <translation id="9055636786322918818">Aplicar a encriptação RC4. A utilização desta opção aumenta o seu risco, uma vez que as cifras RC4 são inseguras.</translation> <translation id="9056810968620647706">Não foram encontradas correspondências.</translation> <translation id="9057354806206861646">Atualizar programação</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 690520e..e7d4440 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -2969,7 +2969,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> trimite conținutul unei ferestre.</translation> <translation id="4364830672918311045">Afișează notificările</translation> <translation id="4366138410738374926">A început printarea</translation> -<translation id="437004882363131692">Primește sfaturi, oferte și actualizări referitoare la <ph name="DEVICE_TYPE" /> și trimite feedback. Te poți dezabona în orice moment.</translation> <translation id="4370425812909262207">Coșurile de cumpărături au fost ascunse. Acestea vor fi afișate din nou dacă modifici opțiunea.</translation> <translation id="4370975561335139969">Adresa de e-mail și parola pe care le-ai introdus nu se potrivesc</translation> <translation id="4374831787438678295">Programul de instalare Linux</translation> @@ -5528,6 +5527,7 @@ <translation id="7374376573160927383">Gestionează dispozitivele USB</translation> <translation id="7375235221357833624">{0,plural, =1{Actualizează dispozitivul într-o oră}few{Actualizează dispozitivul în # ore}other{Actualizează dispozitivul în # de ore}}</translation> <translation id="7376553024552204454">Evidențiază cursorul mouse-ului când se mișcă</translation> +<translation id="737728204345822099">O înregistrare a vizitei pe site poate fi păstrată pe cheia ta de securitate.</translation> <translation id="7377451353532943397">Blochează în continuare accesul la senzori</translation> <translation id="7378611153938412599">Parolele slabe sunt ușor de ghicit. Creează parole puternice. <ph name="BEGIN_LINK" />Vezi mai multe sfaturi de securitate.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Deschide Magazinul web Chrome</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index cea54c2..0757947 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Доступ к Bluetooth- и последовательным устройствам</translation> <translation id="114036956334641753">Звук и субтитры</translation> <translation id="1140746652461896221">Блокировать контент на всех страницах</translation> +<translation id="1141953877381847186">Разрешите Ассистенту использовать информацию на экране, чтобы предоставлять быстрые ответы, например показывать перевод и определения слов, конвертировать единицы измерения и не только. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Примечание.<ph name="END_BOLD" /> Изменить выбор можно в любое время в настройках Google Ассистента, используя параметр "Информация по теме".</translation> <translation id="1143142264369994168">Подписчик сертификата</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Браузер Chrome не обнаружил на компьютере вредоносное ПО • Последняя проверка: 1 минуту назад}one{Браузер Chrome не обнаружил на компьютере вредоносное ПО • Последняя проверка: {NUM_MINS} минуту назад}few{Браузер Chrome не обнаружил на компьютере вредоносное ПО • Последняя проверка: {NUM_MINS} минуты назад}many{Браузер Chrome не обнаружил на компьютере вредоносное ПО • Последняя проверка: {NUM_MINS} минут назад}other{Браузер Chrome не обнаружил на компьютере вредоносное ПО • Последняя проверка: {NUM_MINS} минуты назад}}</translation> <translation id="1145593918056169051">Сбой в работе принтера</translation> @@ -1433,7 +1436,9 @@ <translation id="2594999711683503743">Введите запрос для поиска в Google или укажите URL</translation> <translation id="2602501489742255173">Чтобы начать, проведите по экрану вверх.</translation> <translation id="2603115962224169880">Удалить вредоносное ПО с компьютера</translation> +<translation id="2603355571917519942">Функция Voice Match настроена</translation> <translation id="2603463522847370204">Открыть в режиме &инкогнито</translation> +<translation id="2604138917550693049">Выполнить поиск по изображению, используя Google Объектив</translation> <translation id="2604255671529671813">Ошибка подключения к сети</translation> <translation id="2606246518223360146">Связать данные</translation> <translation id="2606454609872547359">Нет, продолжить без ChromeVox</translation> @@ -1775,6 +1780,7 @@ <translation id="2963151496262057773">Плагин "<ph name="PLUGIN_NAME" />" перестал отвечать на запросы. Остановить его?</translation> <translation id="2964193600955408481">Отключить Wi-Fi</translation> <translation id="2964245677645334031">Обмен с окружением: доступ</translation> +<translation id="2966216232069818096">Разрешите Ассистенту использовать информацию на экране</translation> <translation id="2966937470348689686">Управление настройками Android</translation> <translation id="2972581237482394796">&Повторить</translation> <translation id="2973324205039581528">Отключить звук на сайте</translation> @@ -1870,6 +1876,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Эта вкладка использует вашу камеру или микрофон</translation> <translation id="3083193146044397360">Временно заблокировано в целях безопасности</translation> +<translation id="3083899879156272923">Перемещать экран, оставляя курсор в центре</translation> <translation id="3084548735795614657">Чтобы установить расширение, перетащите его</translation> <translation id="3084771660770137092">Выполнение процесса этой веб-страницы было прекращено. Это может быть вызвано тем, что Chrome не хватает памяти, или иными причинами. Чтобы продолжить, обновите страницу или перейдите на другой URL.</translation> <translation id="3084958266922136097">Отключить заставку</translation> @@ -2363,6 +2370,9 @@ <translation id="3654045516529121250">Чтение настроек специальных возможностей</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{С постоянным доступом к 1 файлу.}one{С постоянным доступом к # файлу.}few{С постоянным доступом к # файлам.}many{С постоянным доступом к # файлам.}other{С постоянным доступом к # файла.}}</translation> <translation id="3658871634334445293">Ускорение TrackPoint</translation> +<translation id="3659830472545192450">Функция Voice Match поможет Google Ассистенту отличать ваш голос от других на устройстве Chromebook. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Важно!<ph name="END_BOLD" /> Человек с похожим голосом или записью вашего может получить доступ к персональным результатам. Отключить функцию Voice Match можно в любое время в настройках Ассистента.</translation> <translation id="3660234220361471169">Недоверенный</translation> <translation id="3664511988987167893">Значок расширения</translation> <translation id="3665589677786828986">Некоторые настройки Chrome недавно были изменены посторонней программой. Браузер восстановил их значения по умолчанию.</translation> @@ -2969,7 +2979,6 @@ <translation id="4364567974334641491">Приложение "<ph name="APP_NAME" />" предоставило доступ к окну.</translation> <translation id="4364830672918311045">Показывать уведомления</translation> <translation id="4366138410738374926">Запущена печать</translation> -<translation id="437004882363131692">Вы можете подписаться на нашу рассылку и получать советы по работе с устройствами <ph name="DEVICE_TYPE" />, специальные предложения и новости, а также оставлять отзывы. Отказаться от рассылки можно в любой момент.</translation> <translation id="4370425812909262207">Корзины скрыты. Они будут показаны снова, если вы внесете изменения.</translation> <translation id="4370975561335139969">Указан неправильный адрес или пароль</translation> <translation id="4374831787438678295">Установщик Linux</translation> @@ -3546,6 +3555,7 @@ <translation id="5050330054928994520">Синтез речи</translation> <translation id="5051836348807686060">Проверка правописания не поддерживается для выбранных языков.</translation> <translation id="5052499409147950210">Изменение сайта</translation> +<translation id="5053962746715621840">Выполнить поиск по изображению, используя Google Объектив</translation> <translation id="5057110919553308744">При нажатии на расширение</translation> <translation id="5057403786441168405">Управляйте аккаунтами, в которые вы вошли. При наличии разрешений сайты, приложения и расширения в Chrome и Google Play могут использовать данные этих аккаунтов для персонализации сервисов. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Ограниченный вход</translation> @@ -4028,6 +4038,9 @@ <translation id="5610038042047936818">Включить режим фото</translation> <translation id="561030196642865721">На этом сайте разрешено использование сторонних файлов cookie.</translation> <translation id="5612734644261457353">Неверный пароль. Обратите внимание: если вы недавно изменили пароль, но не выходили из системы, значит новый пароль ещё не вступил в силу и необходимо указать старый.</translation> +<translation id="561308544008485315">Функция Voice Match поможет Google Ассистенту отличать ваш голос от других на устройстве Chromebook. Для экономии заряда батареи функция "Окей, Google" работает, только когда устройство подключено к источнику питания. Чтобы изменить этот параметр, перейдите в настройки. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Важно!<ph name="END_BOLD" /> Человек с похожим голосом или записью вашего может получить доступ к персональным результатам. Отключить функцию Voice Match можно в любое время в настройках Ассистента.</translation> <translation id="5614190747811328134">Уведомление пользователя</translation> <translation id="5614553682702429503">Сохранение пароля</translation> <translation id="5616726534702877126">Зарезервировать место</translation> @@ -5051,6 +5064,7 @@ <translation id="6824584962142919697">&Проверить элементы</translation> <translation id="6825184156888454064">Упорядочить по названию</translation> <translation id="6826872289184051766">Подтвердить через USB</translation> +<translation id="6827604573767207488">Похоже, вы уже настроили Google Ассистента и включили персонализацию на другом устройстве. Включите эту настройку, чтобы использовать дополнительные возможности.</translation> <translation id="6828153365543658583">Разрешить вход только следующим пользователям:</translation> <translation id="6828182567531805778">Чтобы синхронизировать данные, введите кодовую фразу</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5485,6 +5499,7 @@ <translation id="7327989755579928735">Отладка с помощью ADB отключена администратором (<ph name="MANAGER" />). После перезагрузки устройства <ph name="DEVICE_TYPE" /> вы не сможете устанавливать приложения из неизвестных источников.</translation> <translation id="7328867076235380839">Недопустимое сочетание</translation> <translation id="7329154610228416156">Не удалось выполнить вход из-за перенаправления на небезопасный URL (<ph name="BLOCKED_URL" />). Обратитесь к администратору.</translation> +<translation id="7329932885428707942">Подключение по мобильной сети может быть ненадолго прервано.</translation> <translation id="7332053360324989309">Dedicated Worker: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Включить закрепленную лупу</translation> <translation id="7335974957018254119">Для каких языков применяется проверка правописания</translation> @@ -5528,6 +5543,7 @@ <translation id="7374376573160927383">Настроить USB-устройства</translation> <translation id="7375235221357833624">{0,plural, =1{Перезагрузите устройство в течение 1 часа}one{Перезагрузите устройство в течение # часа}few{Перезагрузите устройство в течение # часов}many{Перезагрузите устройство в течение # часов}other{Перезагрузите устройство в течение # часа}}</translation> <translation id="7376553024552204454">Выделять курсор, когда он движется</translation> +<translation id="737728204345822099">На вашем электронном ключе может остаться запись о том, что вы посетили этот сайт.</translation> <translation id="7377451353532943397">Всегда запрещать использовать датчики</translation> <translation id="7378611153938412599">Простые пароли легко подобрать. Устанавливайте надежные пароли. Больше советов по безопасности можно найти <ph name="BEGIN_LINK" />здесь<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Открыть Интернет-магазин Chrome</translation> @@ -6154,6 +6170,7 @@ <translation id="8059417245945632445">&Проверка устройств</translation> <translation id="8059456211585183827">Нет принтеров, доступных для сохранения.</translation> <translation id="8061091456562007989">Вернуть прежние настройки</translation> +<translation id="8061991877177392872">Похоже, вы уже настроили Voice Match на другом устройстве. Образец вашего голоса создан на основе предыдущих записей.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 лист бумаги}one{{COUNT} лист бумаги}few{{COUNT} листа бумаги}many{{COUNT} листов бумаги}other{{COUNT} листа бумаги}}</translation> <translation id="8062879968880283306">Отсканируйте QR-код с помощью камеры устройства или введите код активации, предоставленный вашим оператором связи.</translation> <translation id="8063235345342641131">Аватар по умолчанию (зеленый)</translation> @@ -6422,6 +6439,7 @@ <translation id="8379991678458444070">Чтобы вам было проще вернуться на эту вкладку, добавьте ее в закладки.</translation> <translation id="8382913212082956454">Копировать &адрес электронной почты</translation> <translation id="8386091599636877289">Политика не найдена.</translation> +<translation id="8386819192691131213">Разрешите Ассистенту использовать информацию на экране, чтобы предоставлять быстрые ответы, например показывать перевод и определения слов, конвертировать единицы измерения и не только.</translation> <translation id="8386903983509584791">Поиск завершен</translation> <translation id="8387361103813440603">Запретить сайтам определять ваше местоположение</translation> <translation id="8389264703141926739">Блокировать уведомления</translation> @@ -6902,6 +6920,7 @@ <translation id="8915370057835397490">Загрузка подсказки</translation> <translation id="8916476537757519021">Субфрейм в режиме инкогнито: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> пользователя <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Перемещать экран, когда курсор касается его краев</translation> <translation id="8923880975836399332">Темно-бирюзовый</translation> <translation id="8925458182817574960">&Настройки</translation> <translation id="8926389886865778422">Больше не спрашивать</translation> @@ -6979,6 +6998,7 @@ <translation id="9009708085379296446">Вы хотели изменить эту страницу?</translation> <translation id="9011163749350026987">Всегда показывать значок</translation> <translation id="9011393886518328654">Примечания к выпуску</translation> +<translation id="9012122671773859802">Непрерывно перемещать экран при движении курсора</translation> <translation id="9013037634206938463">Для установки Linux требуется <ph name="INSTALL_SIZE" /> свободного пространства. Удалите с устройства файлы, которые больше не нужны.</translation> <translation id="9013707997379828817">Администратор вернул устройство к прежней версии системы. Сохраните все важные файлы и перезапустите устройство. При этом все данные будут удалены.</translation> <translation id="901668144954885282">Резервное копирование на Google Диск</translation> @@ -7023,6 +7043,7 @@ <translation id="9052404922357793350">Продолжать блокировать</translation> <translation id="9053563360605707198">Печать на обеих сторонах</translation> <translation id="9053893665344928494">Запомнить</translation> +<translation id="9055278955535611574">Вызывайте Ассистента командой "Окей, Google"</translation> <translation id="9055636786322918818">Использовать шифрование по алгоритму RC4. Этот вариант небезопасен, так как потоковый шифр RC4 ненадежен.</translation> <translation id="9056810968620647706">Ничего не найдено.</translation> <translation id="9057354806206861646">График обновлений</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 63d22e9..610a691 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">ඔබගේ බ්ලූටූත් සහ අනුක්රමික උපාංග වෙත ප්රවේශ වන්න</translation> <translation id="114036956334641753">ශ්රව්ය සහ සිරස්තල</translation> <translation id="1140746652461896221">ඔබ පිවිසෙන ඕනෑම පිටුවක් මත අන්තර්ගතය අවහිර කරන්න</translation> +<translation id="1141953877381847186">පරිවර්තනය, අර්ථ දැක්වීම, ඒකක පරිවර්තනය සහ තවත් දේ වැනි ඉක්මන් පිළිතුරු සැපයීම සඳහා තිරය මත තොරතුරු භාවිත කිරීමට සහායකට ඉඩ දෙන්න. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />සිතෙහි තබා ගන්න:<ph name="END_BOLD" /> ඔබට සැම විට මෙය පසුව Google සහායක සැකසීම් > අදාළ තතු තුළ වෙනස් කළ හැකිය.</translation> <translation id="1143142264369994168">සහතික අත්සන් කරන්නා</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome හට ඔබගේ පරිගණකයේ හානිකර මෘදුකාංග හමු නොවීය • මිනිත්තු 1කට පෙර පරීක්ෂා කරන ලදි}one{Chrome හට ඔබගේ පරිගණකයේ හානිකර මෘදුකාංග හමු නොවීය • මිනිත්තු {NUM_MINS}කට පෙර පරීක්ෂා කරන ලදි}other{Chrome හට ඔබගේ පරිගණකයේ හානිකර මෘදුකාංග හමු නොවීය • මිනිත්තු {NUM_MINS}කට පෙර පරීක්ෂා කරන ලදි}}</translation> <translation id="1145593918056169051">මුද්රකය නැවතී ඇත</translation> @@ -1434,7 +1437,9 @@ <translation id="2594999711683503743">Google සොයන්න නැතහොත් URL ටයිප් කරන්න</translation> <translation id="2602501489742255173">පටන් ගැනීමට උඩට ස්වයිප් කරන්න</translation> <translation id="2603115962224169880">පරිගණකය පිරිසිදු කරන්න</translation> +<translation id="2603355571917519942">Voice Match සූදානම්</translation> <translation id="2603463522847370204">&අප්රකට කවුළුවක විවෘත කරන්න</translation> +<translation id="2604138917550693049">Google Lens සමගින් රූපය සොයන්න</translation> <translation id="2604255671529671813">ජාල සබැඳුම් දෝෂය</translation> <translation id="2606246518223360146">සබැඳි දත්ත</translation> <translation id="2606454609872547359">එපා, ChromeVox රහිතව දිගටම කර ගෙන යන්න</translation> @@ -1777,6 +1782,7 @@ <translation id="2963151496262057773">පහත ප්ලගිනය ප්රතිචාර නොදක්වයි:<ph name="PLUGIN_NAME" /> ඔබට එය නවතා දැමීමට අවශ්යද?</translation> <translation id="2964193600955408481">Wi-Fi අබල කරන්න</translation> <translation id="2964245677645334031">ළඟ බෙදා ගැනීම් දෘශ්යතාව</translation> +<translation id="2966216232069818096">උදව් කිරීමට ඔබගේ තිරයේ ඇති තොරතුරු භාවිත කිරීමට ඔබගේ සහායකට ඉඩ දෙන්න</translation> <translation id="2966937470348689686">Android මනාප කළමනාකරණය කරන්න</translation> <translation id="2972581237482394796">&නැවත කරන්න</translation> <translation id="2973324205039581528">අඩවිය නිහඬ කරන්න</translation> @@ -1873,6 +1879,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">ඔබේ කැමරාව හෝ මයික් එක මෙම ටැබය භාවිතා කරයි.</translation> <translation id="3083193146044397360">ඔබේ ආරක්ෂාව සුරැකීමට තාවකාලිකව අවහිර කර ඇත</translation> +<translation id="3083899879156272923">තිරය මධ්යයේ මූසිකය තබාගෙන තිරය ගෙන යන්න</translation> <translation id="3084548735795614657">ස්ථාපනය කිරීමට ඇද දමන්න</translation> <translation id="3084771660770137092">Chrome හට ක්රියාත්මක වීමට මතකය ප්රමාණවත් නොමැත හෝ වෙනත් හේතුවක් නිසා ජාල අඩවිය සඳහා වන ක්රියාවලිය නවතා දැමිනි. ඉදිරියට යෑමට, නැවුම් කරන්න හෝ වෙනත් පිටුවකට යන්න.</translation> <translation id="3084958266922136097">තිර සුරැකුම අබල කරන්න</translation> @@ -2368,6 +2375,9 @@ <translation id="3654045516529121250">ඔබේ ප්රවේශ්යතා පසුතල කියවන්න</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ එයට එක් ගොනුවක් වෙත ස්ථිර ප්රවේශය ඇත.}one{ එයට ගොනු # ට ස්ථිර ප්රවේශය ඇත.}other{ එයට ගොනු # ට ස්ථිර ප්රවේශය ඇත.}}</translation> <translation id="3658871634334445293">TrackPoint ත්වරණය</translation> +<translation id="3659830472545192450">Voice Match ඔබගේ Google සහායකට Chromebook හි ඔබගේ කටහඬ හඳුනා ගැනීමට සහ අන් අයගෙන් වෙන් කොට ඔබට පැවසීමට උදව් කරයි. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />සිතෙහි තබා ගන්න:<ph name="END_BOLD" /> ඒ හා සමාන කටහඬ හෝ පටිගත කිරීමකට ඔබගේ පුද්ගලික ප්රතිඵල වෙතද ප්රවේශ විය හැකිය. පසුව සහායක සැකසීම් තුළ එය ක්රියාවිරහිත කිරීමෙන් ඔබට Voice Match අවසරය ඉවත් කළ හැකිය.</translation> <translation id="3660234220361471169">විශ්වාස කළ නොහැකි</translation> <translation id="3664511988987167893">දිගු නිරූපකය</translation> <translation id="3665589677786828986">ඔබගේ ඇතැම් සැකසීම් වෙනත් ක්රමලේඛයක් මගින් දූෂිතව ඇති බව Chrome අනාවරණය කර ගත් අතර, ඒවා එහි මුල් පෙරනිමිවලට යළි සකසන ලදී.</translation> @@ -2977,7 +2987,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> කවුළුවක් බෙදා ගනිමින් සිටී.</translation> <translation id="4364830672918311045">සංදර්ශක දැනුම්දීම්</translation> <translation id="4366138410738374926">මුද්රණය කිරීම ආරම්භ වී ඇත</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> ඉඟි, දීමනා සහ යාවත්කාලීන ලබා ගන්න, සහ ප්රතිපෝෂණ බෙදා ගන්න. ඕනෑම වේලාවකදී ග්රාහක නොවන්න.</translation> <translation id="4370425812909262207">කරත්ත සඟවා ඇත. ඔබ වෙනස් කිරීම් සිදු කරන විට ඒවා යළි දිස් වනු ඇත.</translation> <translation id="4370975561335139969">ඔබ ඇතුළු කළ ඊ-තැපැෑල සහ මුරපදය නොගැළපේ.</translation> <translation id="4374831787438678295">Linux ස්ථාපකය</translation> @@ -3557,6 +3566,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">අක්ෂර වින්යාස පරීක්ෂාව ඔබේ තෝරාගත් භාෂා සඳහා සහය නොදක්වයි</translation> <translation id="5052499409147950210">අඩවිය සංස්කරණය කරන්න</translation> +<translation id="5053962746715621840">Google Lens සමගින් රූපය සොයන්න</translation> <translation id="5057110919553308744">ඔබ දිගුව ක්ලික් කළ විට</translation> <translation id="5057403786441168405">ඔබේ පුරන ලද ගිණුම් කළමනා කරන්න අවසරවලට අනුව ඔබේ අත්දැකීම අභිරුචි කිරීමට Chrome සහ Google Play තුළ ඇති වෙබ් අඩවි, යෙදුම්, සහ දිගු මෙම ගිණුම් භාවිත කළ හැක. <ph name="LINK_BEGIN" />තවත් දැන ගන්න<ph name="LINK_END" /></translation> <translation id="5059241099014281248">පුරනය සීමා කරන්න</translation> @@ -4040,6 +4050,9 @@ <translation id="5610038042047936818">කැමරා ප්රකාරයට මාරු වෙන්න</translation> <translation id="561030196642865721">මෙම වෙබ් අඩවිය මත තෙවන පාර්ශ්ව කුකීවලට අවසර ඇත</translation> <translation id="5612734644261457353">කනගාටුයි, ඔබගේ මුරපදය තවමත් සත්යාපනය කළ නොහැකියියි විය. සටහන: ඔබ ඔබගේ මුරපදය මෑතකදී වෙනස් කළේ නම්, ඔබ වරක් වැරූ විට ඔබගේ නව මුරපදය යෙදවෙනු ඇත, කරුණාකර පැරණි මුරපදය මෙහි භාවිතා කරන්න.</translation> +<translation id="561308544008485315">Voice Match ඔබගේ Google සහායකට Chromebook හි ඔබගේ කටහඬ හඳුනා ගැනීමට සහ අන් අයගෙන් වෙන් කොට ඔබට පැවසීමට උදව් කරයි. බැටරිය සුරැකීමට, "Hey Google" ඔබගේ උපාංගය බල මූලාශ්රයකට සම්බන්ධ කළ විට පමණක් ක්රියාත්මකයි. වෙනස්කම් සිදු කිරීමට, සැකසීම් වෙත යන්න. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />සිතෙහි තබා ගන්න:<ph name="END_BOLD" /> ඒ හා සමාන කටහඬ හෝ පටිගත කිරීමකට ඔබගේ පුද්ගලික ප්රතිඵල වෙතද ප්රවේශ විය හැකිය. පසුව සහායක සැකසීම් තුළ එය ක්රියාවිරහිත කිරීමෙන් ඔබට Voice Match අවසරය ඉවත් කළ හැකිය.</translation> <translation id="5614190747811328134">පරිශීලක දැන්වීම</translation> <translation id="5614553682702429503">මුරපදය සුරකින්න ද?</translation> <translation id="5616726534702877126">තරම වෙන් කරන්න</translation> @@ -5069,6 +5082,7 @@ <translation id="6824584962142919697">&මූලද්රව්ය පරීක්ෂා කරන්න</translation> <translation id="6825184156888454064">නමින් අනුපිළිවෙලට සකසන්න</translation> <translation id="6826872289184051766">USB හරහා තහවුරු කරන්න</translation> +<translation id="6827604573767207488">ඔබ දැනටමත් වෙනත් උපාංගයක පුද්ගලිකකරණය කළ සහායක පිහිටුවා ඇති බව පෙනේ. පහත සැකසීම ක්රියාත්මක කිරීමෙන් ඔබගේ සහායකගෙන් තවත් බොහෝ දේ ලබා ගන්න.</translation> <translation id="6828153365543658583">පිවිසීම පහත පරිශීලකයන්ට සීමා කරන්න:</translation> <translation id="6828182567531805778">ඔබේ දත්ත සමමුහූර්ත කිරීමට ඔබේ මුර වැකිකඩ ඇතුළත් කරන්න</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5504,6 +5518,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> ADB නිදොස් කිරීම අබල කර ඇත. ඔබ ඔබගේ <ph name="DEVICE_TYPE" /> යළි ආරම්භ කළ පසු, ඔබට යෙදුම් පැති පූරණය කිරීමට නොහැකි වනු ඇත.</translation> <translation id="7328867076235380839">අවලංගු සංයෝජනයක්</translation> <translation id="7329154610228416156">එය ආරක්ෂිත නොවන URL (<ph name="BLOCKED_URL" />) එකක් භාවිත කිරීමට වින්යාස කර ඇති බැවින් පිරීම අසාර්ථක විය. කරුණාකර ඔබේ පරිපාලක අමතන්න.</translation> +<translation id="7329932885428707942">මෙය කෙටි සෙලියුලර් ජාල විසන්ධි වීමකට හේතු විය හැකිය.</translation> <translation id="7332053360324989309">කැප වූ සේවකයා: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">ඈඳන ලද විශාලකය සබල කරන්න</translation> <translation id="7335974957018254119">මෙය සඳහා අක්ෂර වින්යාස පරීක්ෂාව භාවිත කරන්න</translation> @@ -5547,6 +5562,7 @@ <translation id="7374376573160927383">USB උපාංග කළමනාකරණය කරන්න</translation> <translation id="7375235221357833624">{0,plural, =1{උපාංගය පැයක් තුළ යාවත්කාලීන කරන්න}one{උපාංගය පැය # ක් තුළ යාවත්කාලීන කරන්න}other{උපාංගය පැය # ක් තුළ යාවත්කාලීන කරන්න}}</translation> <translation id="7376553024552204454">චලනය වන විට මූසිකයේ කර්සරය උද්දීපනය කරන්න</translation> +<translation id="737728204345822099">ඔබගේ ආරක්ෂක යතුරේ මෙම අඩවිය වෙත ඔබගේ පැමිණීමේ සටහනක් තැබිය හැකිය.</translation> <translation id="7377451353532943397">සංවේදක ප්රවේශය දිගටම අවහිර කරන්න</translation> <translation id="7378611153938412599">දුර්වල මුරපද අනුමානය කිරීමට පහසුයි. ඔබ ප්රබල මුරපද තනන බව සහතික කර ගන්න. <ph name="BEGIN_LINK" />තවත් ආරක්ෂක ඉඟි බලන්න.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome Web Store විවෘත කරන්න</translation> @@ -6172,6 +6188,7 @@ <translation id="8059417245945632445">&උපාංග පරීක්ෂා කරන්න</translation> <translation id="8059456211585183827">සුරැකීමට ලද හැකි මුද්රක කිසිවක් නැත.</translation> <translation id="8061091456562007989">එය නැවත වෙනස් කරන්න</translation> +<translation id="8061991877177392872">ඔබ දැනටමත් ඔබගේ Google සහායක සමඟ තවත් උපාංගයක Voice Match පිහිටුවා ඇති බව පෙනේ. මෙම උපාංගයේ කටහඬ ආකෘතියක් සෑදීමට මෙම පෙර පටිගත කිරීම් භාවිත කරන ලදී.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 කඩදාසි කොළයක්}one{කඩදාසි කොළ {COUNT} ක්}other{කඩදාසි කොළ {COUNT} ක්}}</translation> <translation id="8062879968880283306">උපාංග කැමරාව භාවිතයෙන් QR කේතය ස්කෑන් කරන්න හෝ ඔබේ වාහකය විසින් සපයන ලද සක්රිය කිරීමේ කේතය ඇතුළත් කරන්න.</translation> <translation id="8063235345342641131">පෙරනිමි කොළ නියුරුව</translation> @@ -6443,6 +6460,7 @@ <translation id="8379991678458444070">මෙම පටිත්ත පිටුසන් කිරීමෙන් ඉක්මනින් මෙහි ආපසු පිවිසෙන්න</translation> <translation id="8382913212082956454">ඊමේල් ලිපිනය පිටපත් කරන්න (&E)</translation> <translation id="8386091599636877289">ප්රතිපත්තිය හමු නොවිය.</translation> +<translation id="8386819192691131213">පරිවර්තනය, අර්ථ දැක්වීම, ඒකක පරිවර්තනය සහ තවත් දේ වැනි ඉක්මන් පිළිතුරු සැපයීම සඳහා තිරය මත තොරතුරු භාවිත කිරීමට සහායකට ඉඩ දෙන්න</translation> <translation id="8386903983509584791">ස්කෑන් කිරීම සම්පූර්ණයි</translation> <translation id="8387361103813440603">ඔබගේ ස්ථානය බැලීමට ඉඩ නොදේ</translation> <translation id="8389264703141926739">දැනුම්දීම් අවහිර කරන්න</translation> @@ -6926,6 +6944,7 @@ <translation id="8915370057835397490">යෝජනාව පූර්ණය වෙමින්</translation> <translation id="8916476537757519021">අප්රකට උපරාමුව: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />ගේ <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">මූසිකය තිරයේ දාර ස්පර්ශ කරන විට තිරය ගෙන යන්න</translation> <translation id="8923880975836399332">තද සේරා</translation> <translation id="8925458182817574960">පසුතල</translation> <translation id="8926389886865778422">නැවත නොඅසන්න</translation> @@ -7004,6 +7023,7 @@ <translation id="9009708085379296446">ඔබ අදහස් කළේ මෙම පිටුව වෙනස් කිරීමටද?</translation> <translation id="9011163749350026987">සෑම විටම නිරූපකය පෙන්වන්න</translation> <translation id="9011393886518328654">නිකුත් කිරීමේ සටහන්</translation> +<translation id="9012122671773859802">මූසිකය ගෙන යන විට අඛණ්ඩව තිරය ගෙන යන්න</translation> <translation id="9013037634206938463">ලිනක්ස් ස්ථාපන කිරීමට <ph name="INSTALL_SIZE" /> ක නිදහස් ඉඩ අවශ්යයි. නිදහස් ඉඩ වැඩි කිරීමට, ඔබේ උපාංගයෙන් ගොනු මකන්න.</translation> <translation id="9013707997379828817">ඔබගේ පරිපාලකයා මෙම උපාංගය ආපසු පෙරළා ඇත. කරුණාකර වැදගත් ගොනු සුරකින්න, ඉන්පසු යළි ආරම්භ කරන්න. උපාංගයේ සියලු දත්ත මැකෙනු ඇත.</translation> <translation id="901668144954885282">Google Drive වෙත උපස්ථ කරන්න</translation> @@ -7048,6 +7068,7 @@ <translation id="9052404922357793350">දිගටම අවහිර කරන්න</translation> <translation id="9053563360605707198">දෙපැත්තේම මුද්රණ කරන්න</translation> <translation id="9053893665344928494">මගේ තේරීම මතක තබා ගන්න</translation> +<translation id="9055278955535611574">"Hey Google" සමගින් ඔබගේ සහායක වෙත ප්රවේශ වන්න</translation> <translation id="9055636786322918818">RC4 සංකේතනය බලාත්මක කරන්න. RC4 කේතාංක ආරක්ෂිත නොවන නිසා, මෙම විකල්පය භාවිතය ඔබගේ අවදානම වැඩි කරයි.</translation> <translation id="9056810968620647706">ගැලපීම් හමු නොවීය.</translation> <translation id="9057354806206861646">කාල සටහන යාවත්කාලීන කරන්න</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 20463c8..928cf68 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -2979,7 +2979,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> zdieľa okno.</translation> <translation id="4364830672918311045">Zobrazovať upozornenia</translation> <translation id="4366138410738374926">Tlač sa začala</translation> -<translation id="437004882363131692">Dostávajte tipy, ponuky a aktuality týkajúce sa zariadenia <ph name="DEVICE_TYPE" /> a zdieľajte spätnú väzbu. Odber môžete kedykoľvek zrušiť.</translation> <translation id="4370425812909262207">Košíky boli skryté. Znova sa objavia, keď vykonáte zmeny.</translation> <translation id="4370975561335139969">Zadaný e-mail a heslo nesúhlasia.</translation> <translation id="4374831787438678295">Inštalátor systému Linux</translation> @@ -5551,6 +5550,7 @@ <translation id="7374376573160927383">Správa zariadení USB</translation> <translation id="7375235221357833624">{0,plural, =1{Aktualizujte zariadenie do hodiny}few{Aktualizujte zariadenie do # hodín}many{Aktualizujte zariadenie do # hodiny}other{Aktualizujte zariadenie do # hodín}}</translation> <translation id="7376553024552204454">Zvýrazňovať kurzor myši, keď sa hýbe</translation> +<translation id="737728204345822099">V bezpečnostnom kľúči sa môže uchovať záznam vašej návštevy tohto webu.</translation> <translation id="7377451353532943397">Naďalej blokovať prístup k senzorom</translation> <translation id="7378611153938412599">Slabé heslá sa dajú ľahko uhádnuť. Vždy sa snažte vytvárať silné heslá. <ph name="BEGIN_LINK" />Ďalšie tipy na zabezpečenie<ph name="END_LINK" /></translation> <translation id="73786666777299047">Otvoriť Internetový obchod Chrome</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 05f6ec4..ce264b2 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -2981,7 +2981,6 @@ <translation id="4364567974334641491">Aplikacija <ph name="APP_NAME" /> je v skupno rabo dala okno.</translation> <translation id="4364830672918311045">Prikaz obvestil</translation> <translation id="4366138410738374926">Tiskanje se je začelo</translation> -<translation id="437004882363131692">Prejmite nasvete, ponudbe in obvestila za napravo <ph name="DEVICE_TYPE" /> ter pošiljajte povratne informacije. Odjavite se lahko kadar koli.</translation> <translation id="4370425812909262207">Vozički so skriti. Znova bodo prikazani, ko naredite spremembe.</translation> <translation id="4370975561335139969">E-poštni naslov in geslo, ki ste ju vnesli, se ne ujemata.</translation> <translation id="4374831787438678295">Namestitveni program za Linux</translation> @@ -5555,6 +5554,7 @@ <translation id="7374376573160927383">Upravljanje naprav USB</translation> <translation id="7375235221357833624">{0,plural, =1{Posodobite napravo v eni uri}one{Posodobite napravo v # uri}two{Posodobite napravo v # urah}few{Posodobite napravo v # urah}other{Posodobite napravo v # urah}}</translation> <translation id="7376553024552204454">Označitev miškinega kazalca med premikanjem</translation> +<translation id="737728204345822099">Na varnostnem ključu se bo morda zabeležil obisk tega spletnega mesta.</translation> <translation id="7377451353532943397">Še naprej preprečuj dostop do tipal</translation> <translation id="7378611153938412599">Šibka gesla je preprosto ugotoviti. Ustvarite zapletena gesla. <ph name="BEGIN_LINK" />Oglejte si več varnostnih nasvetov.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Odpiranje Spletne trgovine Chrome</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 80641a2..d79e545 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Qasu në pajisjet e tua me Bluetooth dhe Serial</translation> <translation id="114036956334641753">Audioja dhe titrat</translation> <translation id="1140746652461896221">Blloko përmbajtjen në çdo faqe që viziton</translation> +<translation id="1141953877381847186">Lejoje "Asistentin" të përdorë informacionet në ekran për të dhënë përgjigje të shpejta, si përkthim, përkufizim, konvertim njësish etj. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Ki parasysh:<ph name="END_BOLD" /> Këtë mund ta ndryshosh gjithmonë më vonë te Cilësimet e "Asistentit të Google" > Informacionet e lidhura.</translation> <translation id="1143142264369994168">Nënshkruesi i certifikatës</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome nuk gjeti softuerë të dëmshëm në kompjuterin tënd • Kontrolluar 1 minutë më parë}other{Chrome nuk gjeti softuerë të dëmshëm në kompjuterin tënd • Kontrolluar {NUM_MINS} minuta më parë}}</translation> <translation id="1145593918056169051">Printeri ka ndaluar</translation> @@ -1433,7 +1436,9 @@ <translation id="2594999711683503743">Kërko në Google ose shkruaj URL-në</translation> <translation id="2602501489742255173">Rrëshqit shpejt lart për të filluar</translation> <translation id="2603115962224169880">Pastro kompjuterin</translation> +<translation id="2603355571917519942">Voice Match është gati</translation> <translation id="2603463522847370204">Hape në &dritare "të fshehtë"</translation> +<translation id="2604138917550693049">Kërko imazhin me "Lenten e Google"</translation> <translation id="2604255671529671813">Gabim në lidhjen e rrjetit</translation> <translation id="2606246518223360146">Lidh të dhënat</translation> <translation id="2606454609872547359">Jo, vazhdo me ChromeVox</translation> @@ -1776,6 +1781,7 @@ <translation id="2963151496262057773">Përbërësi shtesë i mëposhtëm nuk përgjigjet: <ph name="PLUGIN_NAME" />Dëshiron ta ndalosh?</translation> <translation id="2964193600955408481">Çaktivizo Wi-Fi</translation> <translation id="2964245677645334031">Dukshmëria e "Ndarjes në afërsi"</translation> +<translation id="2966216232069818096">Lejoje "Asistentin" të përdorë informacionet në ekran për të të ndihmuar</translation> <translation id="2966937470348689686">Menaxho preferencat e Android</translation> <translation id="2972581237482394796">&Ribëje</translation> <translation id="2973324205039581528">Hiq zërin e sajtit</translation> @@ -1872,6 +1878,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Kjo skedë po përdor kamerën dhe mikrofonin tënd.</translation> <translation id="3083193146044397360">U bllokua përkohësisht për të mbrojtur sigurinë tënde</translation> +<translation id="3083899879156272923">Lëvize ekranin duke e mbajtur miun në qendër të ekranit</translation> <translation id="3084548735795614657">Lëshoje për ta instaluar</translation> <translation id="3084771660770137092">Chrome nuk ka më memorie ose procesi për faqen e uebit u ndërpre për disa arsye. Për të vazhduar, ngarkoje përsëri ose shko te një faqe tjetër.</translation> <translation id="3084958266922136097">Çaktivizo mbrojtësin e ekranit</translation> @@ -2367,6 +2374,9 @@ <translation id="3654045516529121250">Lexo cilësimet e qasjes</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ka qasje të përhershme te një skedar.}other{Ka qasje të përhershme te # skedarë.}}</translation> <translation id="3658871634334445293">Përshpejtimi i TrackPoint</translation> +<translation id="3659830472545192450">Voice Match e ndihmon "Asistentin e Google" të identifikojë zërin tënd në pajisjen tënde Chromebook dhe të të dallojë nga të tjerët. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Ki parasysh:<ph name="END_BOLD" /> Edhe një zë i ngjashëm ose një regjistrim mund të jetë në gjendje të ketë qasje në rezultatet e tua personale. Mund të heqësh më vonë autorizimin e Voice Match duke e çaktivizuar te "Cilësimet" e "Asistentit".</translation> <translation id="3660234220361471169">Jo e besuar</translation> <translation id="3664511988987167893">Ikona e shtesës</translation> <translation id="3665589677786828986">Chrome zbuloi se disa prej cilësimeve të tua ishin të dëmtuara nga një program tjetër dhe i rivendosi ato në vlerat fillestare.</translation> @@ -2975,7 +2985,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> po ndan një dritare.</translation> <translation id="4364830672918311045">Shfaq njoftimet</translation> <translation id="4366138410738374926">Filloi printimi</translation> -<translation id="437004882363131692">Merr këshilla, oferta dhe përditësime për <ph name="DEVICE_TYPE" /> dhe ndaj komentet e tua. Çregjistrohu në çdo kohë.</translation> <translation id="4370425812909262207">Karrocat janë të fshehura. Ato do të rishfaqen kur të bësh ndryshimet.</translation> <translation id="4370975561335139969">Mail-i dhe fjalëkalimi që ke futur nuk përputhen</translation> <translation id="4374831787438678295">Instaluesi për Linux</translation> @@ -3555,6 +3564,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Kontrolli drejtshkrimor nuk mbështetet për gjuhët që zgjodhe</translation> <translation id="5052499409147950210">Modifiko sajtin</translation> +<translation id="5053962746715621840">Kërko imazhin me "Lenten e Google"</translation> <translation id="5057110919553308744">Kur klikon te shtesa</translation> <translation id="5057403786441168405">Menaxho llogaritë ku je identifikuar. Sajtet e uebit, aplikacionet dhe shtesat në Chrome dhe Google Play mund t'i përdorin këto llogari për të personalizuar përvojën tënde, në varësi të lejeve. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Kufizo identifikimin</translation> @@ -4038,6 +4048,9 @@ <translation id="5610038042047936818">Kalo te modaliteti i kamerës</translation> <translation id="561030196642865721">Kukit e palëve të treta lejohen në këtë sajt</translation> <translation id="5612734644261457353">Na vjen keq, por fjalëkalimi sërish nuk mund të verifikohet. Shënim. Nëse ke ndryshuar fjalëkalimin së fundi, fjalëkalimi i ri do të zbatohet pasi të dalësh nga llogaria, prandaj përdor këtu fjalëkalimin e vjetër.</translation> +<translation id="561308544008485315">Voice Match e ndihmon "Asistentin e Google" të identifikojë zërin tënd në pajisjen tënde Chromebook dhe të të dallojë nga të tjerët. Për të kursyer bateri, “Ok Google” është aktiv vetëm kur pajisja jote është lidhur me një burim energjie. Për të bërë ndryshime, shko te "Cilësimet". + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Ki parasysh:<ph name="END_BOLD" /> Edhe një zë i ngjashëm ose një regjistrim mund të jetë në gjendje të ketë qasje në rezultatet e tua personale. Mund të heqësh më vonë autorizimin e Voice Match duke e çaktivizuar te "Cilësimet" e "Asistentit".</translation> <translation id="5614190747811328134">Njoftimi i përdoruesit</translation> <translation id="5614553682702429503">Të ruhet fjalëkalimi?</translation> <translation id="5616726534702877126">Rezervo madhësinë</translation> @@ -5068,6 +5081,7 @@ <translation id="6824584962142919697">&Inspekto elementet</translation> <translation id="6825184156888454064">Rendit sipas emrit</translation> <translation id="6826872289184051766">Verifikohu nëpërmjet USB-së</translation> +<translation id="6827604573767207488">Me sa duket e ke konfiguruar tashmë "Asistentin" e personalizuar në një pajisje tjetër. Përfito edhe më shumë nga "Asistenti" yt duke e aktivizuar këtë cilësim.</translation> <translation id="6828153365543658583">Kufizo identifikimin e përdoruesve të mëposhtëm:</translation> <translation id="6828182567531805778">Fut frazën e kalimit për të sinkronizuar të dhënat</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5503,6 +5517,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> ka çaktivizuar korrigjimin e ADB-së. Pasi ta rinisësh <ph name="DEVICE_TYPE" />, nuk do të mund të ngarkosh paralelisht aplikacione.</translation> <translation id="7328867076235380839">Kombinim i pavlefshëm</translation> <translation id="7329154610228416156">Identifikimi dështoi, sepse ishte i konfiguruar të përdorte një URL jo të sigurt <ph name="BLOCKED_URL" />. Kontakto me administratorin.</translation> +<translation id="7329932885428707942">Kjo mund të shkaktojë një shkëputje të shkurtër të rrjetit celular.</translation> <translation id="7332053360324989309">Procesi i posaçëm i punës: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Aktivizo zmadhuesin e stacionuar</translation> <translation id="7335974957018254119">Përdor kontrollin drejtshkrimor për</translation> @@ -5546,6 +5561,7 @@ <translation id="7374376573160927383">Menaxho pajisjet USB</translation> <translation id="7375235221357833624">{0,plural, =1{Përditëso pajisjen brenda një ore}other{Përditëso pajisjen brenda # orësh}}</translation> <translation id="7376553024552204454">Thekso kursorin e miut kur është në lëvizje</translation> +<translation id="737728204345822099">Një regjistrim i vizitës sate në këtë sajt mund të ruhet në çelësin tënd të sigurisë.</translation> <translation id="7377451353532943397">Vazhdo të bllokosh qasjen te sensorët</translation> <translation id="7378611153938412599">Fjalëkalimet e dobëta mund të gjenden me lehtësi. Sigurohu që po krijon fjalëkalime të forta. <ph name="BEGIN_LINK" />Shiko më shumë këshilla sigurie.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Hap "Dyqanin e uebit të Chrome"</translation> @@ -6171,6 +6187,7 @@ <translation id="8059417245945632445">&Inspekto pajisjet</translation> <translation id="8059456211585183827">Nuk disponohen printerë për ruajtje.</translation> <translation id="8061091456562007989">Ndryshoje përsëri</translation> +<translation id="8061991877177392872">Me sa duket e ke konfiguruar tashmë Voice Match me "Asistentin" tënd në një pajisje tjetër. Këto regjistrime të mëparshme janë përdorur për të krijuar një model zanor në këtë pajisje.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 fletë letre}other{{COUNT} fletë letre}}</translation> <translation id="8062879968880283306">Skano kodin QR duke përdorur kamerën e pajisjes ose fut kodin e aktivizimit të dhënë nga operatori yt.</translation> <translation id="8063235345342641131">Avatari i parazgjedhur i gjelbër</translation> @@ -6442,6 +6459,7 @@ <translation id="8379991678458444070">Kthehu këtu shpejt duke e shtuar këtë skedë te faqeshënuesit</translation> <translation id="8382913212082956454">Kopjo &adresën e mail-it</translation> <translation id="8386091599636877289">Politika nuk u gjet.</translation> +<translation id="8386819192691131213">Lejoje "Asistentin" të përdorë informacionet në ekran për të dhënë përgjigje të shpejta, si përkthim, përkufizim, konvertim njësish etj.</translation> <translation id="8386903983509584791">Skanimi përfundoi</translation> <translation id="8387361103813440603">Nuk lejohen të shikojnë vendndodhjen tënde</translation> <translation id="8389264703141926739">Blloko njoftimet</translation> @@ -6924,6 +6942,7 @@ <translation id="8915370057835397490">Po ngarkon sugjerimin</translation> <translation id="8916476537757519021">Nënkorniza "e fshehtë": <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> që ka <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Lëvize ekranin kur miu prek këndet e ekranit</translation> <translation id="8923880975836399332">Gurkali e errët</translation> <translation id="8925458182817574960">Cilësimet</translation> <translation id="8926389886865778422">Mos pyet përsëri</translation> @@ -7002,6 +7021,7 @@ <translation id="9009708085379296446">Dëshiroje ta ndryshoje këtë faqe?</translation> <translation id="9011163749350026987">Shfaq gjithmonë ikonën</translation> <translation id="9011393886518328654">Shënimet e versionit</translation> +<translation id="9012122671773859802">Lëvize ekranin vazhdimisht ndërsa lëviz miu</translation> <translation id="9013037634206938463">Për instalimin e Linux kërkohet <ph name="INSTALL_SIZE" /> hapësirë e lirë. Për të rritur nivelin e hapësirës së lirë, fshi skedarë nga pajisja jote.</translation> <translation id="9013707997379828817">Administratori e ktheu prapa këtë pajisje. Ruaj skedarët e rëndësishëm, pastaj rinise. Do të fshihen të gjitha të dhënat në pajisje.</translation> <translation id="901668144954885282">Rezervo në "Diskun e Google"</translation> @@ -7046,6 +7066,7 @@ <translation id="9052404922357793350">Vazhdo bllokimin</translation> <translation id="9053563360605707198">Printo në të dyja anët</translation> <translation id="9053893665344928494">Kujtoje zgjedhjen time</translation> +<translation id="9055278955535611574">Qasu tek "Asistenti" me "Ok Google"</translation> <translation id="9055636786322918818">Zbato enkriptimin RC4. Përdorimi i këtij opsioni rrit rrezikun për ty, pasi shifrat RC4 nuk janë të sigurta.</translation> <translation id="9056810968620647706">Nuk u gjet asnjë përputhje.</translation> <translation id="9057354806206861646">Përditëso orarin</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 9efe7e8..f08f265 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Pristup Bluetooth i serijskim uređajima</translation> <translation id="114036956334641753">Zvuk i titl</translation> <translation id="1140746652461896221">Blokirajte sadržaj na stranicama koje posetite</translation> +<translation id="1141953877381847186">Dozvolite Pomoćniku da koristi informacije sa ekrana da bi pružao brze odgovore poput prevoda, definicija, konverzije jedinica i drugo. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Imajte na umu:<ph name="END_BOLD" /> Ovo uvek možete kasnije da promenite u podešavanjima Google pomoćnika > Srodne informacije.</translation> <translation id="1143142264369994168">Potpisnik sertifikata</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome nije pronašao štetan softver na računaru • Provereno pre 1 minut}one{Chrome nije pronašao štetan softver na računaru • Provereno pre {NUM_MINS} minut}few{Chrome nije pronašao štetan softver na računaru • Provereno pre {NUM_MINS} minuta}other{Chrome nije pronašao štetan softver na računaru • Provereno pre {NUM_MINS} minuta}}</translation> <translation id="1145593918056169051">Štampač je prestao da radi</translation> @@ -1435,7 +1438,9 @@ <translation id="2594999711683503743">Pretražite Google ili unesite URL</translation> <translation id="2602501489742255173">Prevucite nagore da biste započeli</translation> <translation id="2603115962224169880">Očistite računar</translation> +<translation id="2603355571917519942">Voice Match je spreman</translation> <translation id="2603463522847370204">Otvori u &prozoru bez arhiviranja</translation> +<translation id="2604138917550693049">Potražite sliku pomoću Google objektiva</translation> <translation id="2604255671529671813">Greška mrežne veze</translation> <translation id="2606246518223360146">Poveži podatke</translation> <translation id="2606454609872547359">Ne, nastavi bez ChromeVox-a</translation> @@ -1778,6 +1783,7 @@ <translation id="2963151496262057773">Sledeća dodatna komponenta se ne odaziva: <ph name="PLUGIN_NAME" /> Želite li da je zaustavite?</translation> <translation id="2964193600955408481">Onemogući WiFi</translation> <translation id="2964245677645334031">Vidljivost za Deljenje u blizini</translation> +<translation id="2966216232069818096">Dozvolite Pomoćniku da koristi informacije na ekranu da bi vam pomogao</translation> <translation id="2966937470348689686">Upravljajte Android podešavanjima</translation> <translation id="2972581237482394796">&Ponovi radnju</translation> <translation id="2973324205039581528">Isključi zvuk sajta</translation> @@ -1874,6 +1880,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Ova kartica koristi kameru ili mikrofon.</translation> <translation id="3083193146044397360">Privremeno blokirano radi zaštite privatnosti</translation> +<translation id="3083899879156272923">Pomeraj ekran držeći miš u centru ekrana</translation> <translation id="3084548735795614657">Otpustite za instalaciju</translation> <translation id="3084771660770137092">Chrome pregledaču je ponestalo memorije ili je proces za veb-stranicu prekinut iz nekog drugog razloga. Da biste nastavili, ponovo učitajte stranicu ili idite na neku drugu stranicu.</translation> <translation id="3084958266922136097">Onemogućite čuvar ekrana</translation> @@ -2369,6 +2376,9 @@ <translation id="3654045516529121250">Čitanje podešavanja pristupačnosti</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ima stalan pristup jednoj datoteci.}one{Ima stalan pristup # datoteci.}few{Ima stalan pristup za # datoteke.}other{Ima stalan pristup za # datoteka.}}</translation> <translation id="3658871634334445293">Ubrzanje TrackPoint-a</translation> +<translation id="3659830472545192450">Voice Match pomaže Google pomoćniku da identifikuje vaš glas na Chromebook-u i da vas razlikuje od drugih osoba. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Imajte na umu:<ph name="END_BOLD" /> Neko sa sličnim glasom ili snimkom možda može da pristupa vašim ličnim rezultatima. Možete kasnije da uklonite dozvolu za Voice Match ako je isključite u podešavanjima Pomoćnika.</translation> <translation id="3660234220361471169">Nepouzdani</translation> <translation id="3664511988987167893">Ikona dodatka</translation> <translation id="3665589677786828986">Chrome je otkrio da je drugi program oštetio neka od podešavanja i resetovao ih je na prvobitne podrazumevane vrednosti.</translation> @@ -2977,7 +2987,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> deli prozor.</translation> <translation id="4364830672918311045">Prikazuj obaveštenja</translation> <translation id="4366138410738374926">Štampanje je započeto</translation> -<translation id="437004882363131692">Preuzmite savete, ponude i ažuriranja za <ph name="DEVICE_TYPE" /> i delite povratne informacije. Opozovite prijavu bilo kada.</translation> <translation id="4370425812909262207">Korpe su sakrivene. Pojaviće se ponovo kada unesete promene.</translation> <translation id="4370975561335139969">Imejl i lozinka koje ste uneli se ne podudaraju</translation> <translation id="4374831787438678295">Linux program za instalaciju</translation> @@ -3557,6 +3566,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Provera pravopisa nije podržana za jezike koje ste izabrali</translation> <translation id="5052499409147950210">Izmenite sajt</translation> +<translation id="5053962746715621840">Potražite sliku pomoću Google objektiva</translation> <translation id="5057110919553308744">Kada kliknete na dodatak</translation> <translation id="5057403786441168405">Upravljajte nalozima na koje ste prijavljeni. Veb-sajtovi, aplikacije i dodaci u Chrome-u i na Google Play-u mogu da koriste te naloge za prilagođavanje doživljaja, u zavisnosti od dozvola. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Ograničite prijavljivanje</translation> @@ -4041,6 +4051,9 @@ <translation id="5610038042047936818">Prebaci na režim kamere</translation> <translation id="561030196642865721">Kolačići treće strane su omogućeni na ovom sajtu</translation> <translation id="5612734644261457353">Žao nam je, još uvek nije moguće verifikovati lozinku. Napomena: Ako ste nedavno promenili lozinku, nova lozinka biće primenjena kada se odjavite. Ovde koristite staru lozinku.</translation> +<translation id="561308544008485315">Voice Match pomaže Google pomoćniku da identifikuje vaš glas na Chromebook-u i da vas razlikuje od drugih osoba. Da biste uštedeli bateriju, funkcija „Ok Google“ je uključena samo kada je uređaj povezan sa izvorom napajanja. Da biste uneli promene, idite u Podešavanja. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Imajte na umu:<ph name="END_BOLD" /> Neko sa sličnim glasom ili snimkom možda može da pristupa vašim ličnim rezultatima. Možete kasnije da uklonite dozvolu za Voice Match ako je isključite u podešavanjima Pomoćnika.</translation> <translation id="5614190747811328134">Obaveštenje o korisniku</translation> <translation id="5614553682702429503">Želite li da sačuvate lozinku?</translation> <translation id="5616726534702877126">Rezerviši veličinu</translation> @@ -5072,6 +5085,7 @@ <translation id="6824584962142919697">&Proveri elemente</translation> <translation id="6825184156888454064">Sortiraj prema nazivu</translation> <translation id="6826872289184051766">Potvrdi pomoću USB-a</translation> +<translation id="6827604573767207488">Izgleda da ste već podesili personalizovani Pomoćnik na drugom uređaju. Uključite sledeće podešavanje i koristite Pomoćnik na još bolji način.</translation> <translation id="6828153365543658583">Ograniči prijavljivanje na sledeće korisnike:</translation> <translation id="6828182567531805778">Unesite pristupnu frazu da biste sinhronizovali podatke</translation> <translation id="682871081149631693">Brzo rešavanje problema</translation> @@ -5507,6 +5521,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> je onemogućio ADB otklanjanje grešaka. Kada restartujete <ph name="DEVICE_TYPE" />, nećete moći da učitavate aplikacije sa izvora treće strane.</translation> <translation id="7328867076235380839">Nevažeća kombinacija</translation> <translation id="7329154610228416156">Prijavljivanje nije uspelo jer je konfigurisano za korišćenje nebezbednog URL-a (<ph name="BLOCKED_URL" />). Kontaktirajte administratora.</translation> +<translation id="7329932885428707942">Ovo može da izazove kratak prekid veze sa mobilnom mrežom.</translation> <translation id="7332053360324989309">Namenski obrađivač: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Omogući montiranu lupu ekrana</translation> <translation id="7335974957018254119">Koristite proveru pravopisa za:</translation> @@ -5550,6 +5565,7 @@ <translation id="7374376573160927383">Upravljajte USB uređajima</translation> <translation id="7375235221357833624">{0,plural, =1{Ažurirajte uređaj u roku od jednog sata}one{Ažurirajte uređaj u roku od # sata}few{Ažurirajte uređaj u roku od # sata}other{Ažurirajte uređaj u roku od # sati}}</translation> <translation id="7376553024552204454">Ističi kursor miša dok se kreće</translation> +<translation id="737728204345822099">Poseta ovom sajtu može da bude zabeležena na bezbednosnom ključu.</translation> <translation id="7377451353532943397">Nastavi da blokiraš pristup senzorima</translation> <translation id="7378611153938412599">Slabe lozinke lako mogu da se pogode. Obavezno napravite jake lozinke. <ph name="BEGIN_LINK" />Pogledajte još saveta za bezbednost.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Otvorite Chrome veb-prodavnicu</translation> @@ -6177,6 +6193,7 @@ <translation id="8059417245945632445">&Ispitaj uređaje</translation> <translation id="8059456211585183827">Nema dostupnih štampača za čuvanje.</translation> <translation id="8061091456562007989">Poništi izmene</translation> +<translation id="8061991877177392872">Izgleda da ste već podesili Voice Match sa Pomoćnikom na drugom uređaju. Ovi prethodni snimci su korišćeni za pravljenje glasovnog modela na ovom uređaju.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 list papira}one{{COUNT} list papira}few{{COUNT} lista papira}other{{COUNT} listova papira}}</translation> <translation id="8062879968880283306">Skenirajte QR kôd pomoću kamere uređaja ili unesite aktivacioni kôd koji ste dobili od mobilnog operatera.</translation> <translation id="8063235345342641131">Podrazumevani zeleni avatar</translation> @@ -6448,6 +6465,7 @@ <translation id="8379991678458444070">Možete brzo da se vratite ovde ako obeležite ovu karticu</translation> <translation id="8382913212082956454">Kopiraj &e-adresu</translation> <translation id="8386091599636877289">Smernice nisu pronađene.</translation> +<translation id="8386819192691131213">Dozvolite Pomoćniku da koristi informacije sa ekrana da bi pružao brze odgovore poput prevoda, definicija, konverzije jedinica i drugo</translation> <translation id="8386903983509584791">Skeniranje je završeno</translation> <translation id="8387361103813440603">Nije im dozvoljeno da vide vašu lokaciju</translation> <translation id="8389264703141926739">Blokiraj obaveštenja</translation> @@ -6932,6 +6950,7 @@ <translation id="8915370057835397490">Učitavanje predloga</translation> <translation id="8916476537757519021">Podokvir Bez arhiviranja: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> korisnika <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Pomeraj ekran kada miš dodiruje ivice ekrana</translation> <translation id="8923880975836399332">Tamnotirkizna</translation> <translation id="8925458182817574960">&Podešavanja</translation> <translation id="8926389886865778422">Ne pitaj me ponovo</translation> @@ -7010,6 +7029,7 @@ <translation id="9009708085379296446">Da li ste želeli da promenite ovu stranicu?</translation> <translation id="9011163749350026987">Uvek prikazuj ikonu</translation> <translation id="9011393886518328654">Napomene o verziji</translation> +<translation id="9012122671773859802">Pomeraj ekran stalno uporedo sa mišem</translation> <translation id="9013037634206938463">Treba vam <ph name="INSTALL_SIZE" /> slobodnog prostora da biste instalirali Linux. Da biste oslobodili prostor, izbrišite datoteke sa uređaja.</translation> <translation id="9013707997379828817">Administrator je vratio ovaj uređaj na raniju verziju. Sačuvajte važne datoteke, pa restartujte. Svi podaci na uređaju će biti izbrisani.</translation> <translation id="901668144954885282">Pravite rezervne kopije na Google disku</translation> @@ -7054,6 +7074,7 @@ <translation id="9052404922357793350">Nastavi sa blokiranjem</translation> <translation id="9053563360605707198">Štampaj dvostrano</translation> <translation id="9053893665344928494">Zapamti izbor</translation> +<translation id="9055278955535611574">Pristupajte Pomoćniku pomoću fraze „Ok Google“</translation> <translation id="9055636786322918818">Primenjuje RC4 šifrovanje. Korišćenje ove opcije vas izlaže većem riziku jer su RC4 šifre nebezbedne.</translation> <translation id="9056810968620647706">Nije pronađeno nijedno podudaranje.</translation> <translation id="9057354806206861646">Ažurirajte raspored</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index ce06d61..164a8f0 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Приступ Bluetooth и серијским уређајима</translation> <translation id="114036956334641753">Звук и титл</translation> <translation id="1140746652461896221">Блокирајте садржај на страницама које посетите</translation> +<translation id="1141953877381847186">Дозволите Помоћнику да користи информације са екрана да би пружао брзе одговоре попут превода, дефиниција, конверзије јединица и друго. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Имајте на уму:<ph name="END_BOLD" /> Ово увек можете касније да промените у подешавањима Google помоћника > Сродне информације.</translation> <translation id="1143142264369994168">Потписник сертификата</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome није пронашао штетан софтвер на рачунару • Проверено пре 1 минут}one{Chrome није пронашао штетан софтвер на рачунару • Проверено пре {NUM_MINS} минут}few{Chrome није пронашао штетан софтвер на рачунару • Проверено пре {NUM_MINS} минута}other{Chrome није пронашао штетан софтвер на рачунару • Проверено пре {NUM_MINS} минута}}</translation> <translation id="1145593918056169051">Штампач је престао да ради</translation> @@ -1435,7 +1438,9 @@ <translation id="2594999711683503743">Претражите Google или унесите URL</translation> <translation id="2602501489742255173">Превуците нагоре да бисте започели</translation> <translation id="2603115962224169880">Очистите рачунар</translation> +<translation id="2603355571917519942">Voice Match је спреман</translation> <translation id="2603463522847370204">Отвори у &прозору без архивирања</translation> +<translation id="2604138917550693049">Потражите слику помоћу Google објектива</translation> <translation id="2604255671529671813">Грешка мрежне везе</translation> <translation id="2606246518223360146">Повежи податке</translation> <translation id="2606454609872547359">Не, настави без ChromeVox-а</translation> @@ -1778,6 +1783,7 @@ <translation id="2963151496262057773">Следећа додатна компонента се не одазива: <ph name="PLUGIN_NAME" /> Желите ли да је зауставите?</translation> <translation id="2964193600955408481">Онемогући WiFi</translation> <translation id="2964245677645334031">Видљивост за Дељење у близини</translation> +<translation id="2966216232069818096">Дозволите Помоћнику да користи информације на екрану да би вам помогао</translation> <translation id="2966937470348689686">Управљајте Android подешавањима</translation> <translation id="2972581237482394796">&Понови радњу</translation> <translation id="2973324205039581528">Искључи звук сајта</translation> @@ -1874,6 +1880,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Ова картица користи камеру или микрофон.</translation> <translation id="3083193146044397360">Привремено блокирано ради заштите приватности</translation> +<translation id="3083899879156272923">Померај екран држећи миш у центру екрана</translation> <translation id="3084548735795614657">Отпустите за инсталацију</translation> <translation id="3084771660770137092">Chrome прегледачу је понестало меморије или је процес за веб-страницу прекинут из неког другог разлога. Да бисте наставили, поново учитајте страницу или идите на неку другу страницу.</translation> <translation id="3084958266922136097">Онемогућите чувар екрана</translation> @@ -2369,6 +2376,9 @@ <translation id="3654045516529121250">Читање подешавања приступачности</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Има сталан приступ једној датотеци.}one{Има сталан приступ # датотеци.}few{Има сталан приступ за # датотеке.}other{Има сталан приступ за # датотека.}}</translation> <translation id="3658871634334445293">Убрзање TrackPoint-а</translation> +<translation id="3659830472545192450">Voice Match помаже Google помоћнику да идентификује ваш глас на Chromebook-у и да вас разликује од других особа. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Имајте на уму:<ph name="END_BOLD" /> Неко са сличним гласом или снимком можда може да приступа вашим личним резултатима. Можете касније да уклоните дозволу за Voice Match ако је искључите у подешавањима Помоћника.</translation> <translation id="3660234220361471169">Непоуздани</translation> <translation id="3664511988987167893">Икона додатка</translation> <translation id="3665589677786828986">Chrome је открио да је други програм оштетио нека од подешавања и ресетовао их је на првобитне подразумеване вредности.</translation> @@ -2977,7 +2987,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> дели прозор.</translation> <translation id="4364830672918311045">Приказуј обавештења</translation> <translation id="4366138410738374926">Штампање је започето</translation> -<translation id="437004882363131692">Преузмите савете, понуде и ажурирања за <ph name="DEVICE_TYPE" /> и делите повратне информације. Опозовите пријаву било када.</translation> <translation id="4370425812909262207">Корпе су сакривене. Појавиће се поново када унесете промене.</translation> <translation id="4370975561335139969">Имејл и лозинка које сте унели се не подударају</translation> <translation id="4374831787438678295">Linux програм за инсталацију</translation> @@ -3557,6 +3566,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Провера правописа није подржана за језике које сте изабрали</translation> <translation id="5052499409147950210">Измените сајт</translation> +<translation id="5053962746715621840">Потражите слику помоћу Google објектива</translation> <translation id="5057110919553308744">Када кликнете на додатак</translation> <translation id="5057403786441168405">Управљајте налозима на које сте пријављени. Веб-сајтови, апликације и додаци у Chrome-у и на Google Play-у могу да користе те налоге за прилагођавање доживљаја, у зависности од дозвола. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Ограничите пријављивање</translation> @@ -4041,6 +4051,9 @@ <translation id="5610038042047936818">Пребаци на режим камере</translation> <translation id="561030196642865721">Колачићи треће стране су омогућени на овом сајту</translation> <translation id="5612734644261457353">Жао нам је, још увек није могуће верификовати лозинку. Напомена: Ако сте недавно променили лозинку, нова лозинка биће примењена када се одјавите. Овде користите стару лозинку.</translation> +<translation id="561308544008485315">Voice Match помаже Google помоћнику да идентификује ваш глас на Chromebook-у и да вас разликује од других особа. Да бисте уштедели батерију, функција „Ок Google“ је укључена само када је уређај повезан са извором напајања. Да бисте унели промене, идите у Подешавања. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Имајте на уму:<ph name="END_BOLD" /> Неко са сличним гласом или снимком можда може да приступа вашим личним резултатима. Можете касније да уклоните дозволу за Voice Match ако је искључите у подешавањима Помоћника.</translation> <translation id="5614190747811328134">Обавештење о кориснику</translation> <translation id="5614553682702429503">Желите ли да сачувате лозинку?</translation> <translation id="5616726534702877126">Резервиши величину</translation> @@ -5072,6 +5085,7 @@ <translation id="6824584962142919697">&Провери елементе</translation> <translation id="6825184156888454064">Сортирај према називу</translation> <translation id="6826872289184051766">Потврди помоћу USB-а</translation> +<translation id="6827604573767207488">Изгледа да сте већ подесили персонализовани Помоћник на другом уређају. Укључите следеће подешавање и користите Помоћник на још бољи начин.</translation> <translation id="6828153365543658583">Ограничи пријављивање на следеће кориснике:</translation> <translation id="6828182567531805778">Унесите приступну фразу да бисте синхронизовали податке</translation> <translation id="682871081149631693">Брзо решавање проблема</translation> @@ -5507,6 +5521,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> је онемогућио ADB отклањање грешака. Када рестартујете <ph name="DEVICE_TYPE" />, нећете моћи да учитавате апликације са извора треће стране.</translation> <translation id="7328867076235380839">Неважећа комбинација</translation> <translation id="7329154610228416156">Пријављивање није успело јер је конфигурисано за коришћење небезбедног URL-а (<ph name="BLOCKED_URL" />). Контактирајте администратора.</translation> +<translation id="7329932885428707942">Ово може да изазове кратак прекид везе са мобилном мрежом.</translation> <translation id="7332053360324989309">Наменски обрађивач: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Омогући монтирану лупу екрана</translation> <translation id="7335974957018254119">Користите проверу правописа за:</translation> @@ -5550,6 +5565,7 @@ <translation id="7374376573160927383">Управљајте USB уређајима</translation> <translation id="7375235221357833624">{0,plural, =1{Ажурирајте уређај у року од једног сата}one{Ажурирајте уређај у року од # сата}few{Ажурирајте уређај у року од # сата}other{Ажурирајте уређај у року од # сати}}</translation> <translation id="7376553024552204454">Истичи курсор миша док се креће</translation> +<translation id="737728204345822099">Посета овом сајту може да буде забележена на безбедносном кључу.</translation> <translation id="7377451353532943397">Настави да блокираш приступ сензорима</translation> <translation id="7378611153938412599">Слабе лозинке лако могу да се погоде. Обавезно направите јаке лозинке. <ph name="BEGIN_LINK" />Погледајте још савета за безбедност.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Отворите Chrome веб-продавницу</translation> @@ -6177,6 +6193,7 @@ <translation id="8059417245945632445">&Испитај уређаје</translation> <translation id="8059456211585183827">Нема доступних штампача за чување.</translation> <translation id="8061091456562007989">Поништи измене</translation> +<translation id="8061991877177392872">Изгледа да сте већ подесили Voice Match са Помоћником на другом уређају. Ови претходни снимци су коришћени за прављење гласовног модела на овом уређају.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 лист папира}one{{COUNT} лист папира}few{{COUNT} листа папира}other{{COUNT} листова папира}}</translation> <translation id="8062879968880283306">Скенирајте QR кôд помоћу камере уређаја или унесите активациони кôд који сте добили од мобилног оператера.</translation> <translation id="8063235345342641131">Подразумевани зелени аватар</translation> @@ -6448,6 +6465,7 @@ <translation id="8379991678458444070">Можете брзо да се вратите овде ако обележите ову картицу</translation> <translation id="8382913212082956454">Копирај &е-адресу</translation> <translation id="8386091599636877289">Смернице нису пронађене.</translation> +<translation id="8386819192691131213">Дозволите Помоћнику да користи информације са екрана да би пружао брзе одговоре попут превода, дефиниција, конверзије јединица и друго</translation> <translation id="8386903983509584791">Скенирање је завршено</translation> <translation id="8387361103813440603">Није им дозвољено да виде вашу локацију</translation> <translation id="8389264703141926739">Блокирај обавештења</translation> @@ -6932,6 +6950,7 @@ <translation id="8915370057835397490">Учитавање предлога</translation> <translation id="8916476537757519021">Подоквир Без архивирања: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> корисника <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">Померај екран када миш додирује ивице екрана</translation> <translation id="8923880975836399332">Тамнотиркизна</translation> <translation id="8925458182817574960">&Подешавања</translation> <translation id="8926389886865778422">Не питај ме поново</translation> @@ -7010,6 +7029,7 @@ <translation id="9009708085379296446">Да ли сте желели да промените ову страницу?</translation> <translation id="9011163749350026987">Увек приказуј икону</translation> <translation id="9011393886518328654">Напомене о верзији</translation> +<translation id="9012122671773859802">Померај екран стално упоредо са мишем</translation> <translation id="9013037634206938463">Треба вам <ph name="INSTALL_SIZE" /> слободног простора да бисте инсталирали Linux. Да бисте ослободили простор, избришите датотеке са уређаја.</translation> <translation id="9013707997379828817">Администратор је вратио овај уређај на ранију верзију. Сачувајте важне датотеке, па рестартујте. Сви подаци на уређају ће бити избрисани.</translation> <translation id="901668144954885282">Правите резервне копије на Google диску</translation> @@ -7054,6 +7074,7 @@ <translation id="9052404922357793350">Настави са блокирањем</translation> <translation id="9053563360605707198">Штампај двострано</translation> <translation id="9053893665344928494">Запамти избор</translation> +<translation id="9055278955535611574">Приступајте Помоћнику помоћу фразе „Ок Google“</translation> <translation id="9055636786322918818">Примењује RC4 шифровање. Коришћење ове опције вас излаже већем ризику јер су RC4 шифре небезбедне.</translation> <translation id="9056810968620647706">Није пронађено ниједно подударање.</translation> <translation id="9057354806206861646">Ажурирајте распоред</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 62d775f..28213d3d 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -2978,7 +2978,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> delar ett fönster.</translation> <translation id="4364830672918311045">Visa aviseringar</translation> <translation id="4366138410738374926">Utskrift har påbörjats</translation> -<translation id="437004882363131692">Få tips, erbjudanden och uppdateringar för <ph name="DEVICE_TYPE" /> och dela din feedback. Du kan avsluta prenumerationen när du vill.</translation> <translation id="4370425812909262207">Kundvagnarna har dolts. De visas igen när du ändrar något.</translation> <translation id="4370975561335139969">E-postadressen och lösenordet matchar inte</translation> <translation id="4374831787438678295">Linux-installationsprogram</translation> @@ -5550,6 +5549,7 @@ <translation id="7374376573160927383">Hantera USB-enheter</translation> <translation id="7375235221357833624">{0,plural, =1{Uppdatera enheten inom en timme}other{Uppdatera enheten inom # timmar}}</translation> <translation id="7376553024552204454">Markera muspekaren när den är i rörelse</translation> +<translation id="737728204345822099">Ditt besök på webbplatsen kan sparas i säkerhetsnyckeln.</translation> <translation id="7377451353532943397">Fortsätt att blockera sensoråtkomst</translation> <translation id="7378611153938412599">Svaga lösenord är lätta att lista ut. Använd alltid starka lösenord. <ph name="BEGIN_LINK" />Här hittar du fler säkerhetstips.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Öppna Chrome Web Store</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 1047194..bb8462e 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -2963,7 +2963,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> inashiriki dirisha.</translation> <translation id="4364830672918311045">Onyesha arifa</translation> <translation id="4366138410738374926">Imeanza kuchapisha</translation> -<translation id="437004882363131692">Pata taarifa, ofa na vidokezo kuhusu <ph name="DEVICE_TYPE" /> na ushiriki maoni. Jiondoe wakati wowote.</translation> <translation id="4370425812909262207">Vikapu vimefichwa. Vitaonekana tena ukifanya mabadiliko.</translation> <translation id="4370975561335139969">Anwani ya barua pepe na nenosiri uliloweka havilingani</translation> <translation id="4374831787438678295">Kisakinishaji cha Linux</translation> @@ -5522,6 +5521,7 @@ <translation id="7374376573160927383">Dhibiti vifaa vya USB</translation> <translation id="7375235221357833624">{0,plural, =1{Sasisha kifaa ndani ya saa moja}other{Sasisha kifaa ndani ya saa #}}</translation> <translation id="7376553024552204454">Angazia kiteuzi cha kipanya kinaposonga</translation> +<translation id="737728204345822099">Huenda rekodi ya jinsi ulivyotembelea tovuti hii ikahifadhiwa kwenye ufunguo wako wa usalama.</translation> <translation id="7377451353532943397">Endelea kuzuia idhini ya kufikia kitambuzi</translation> <translation id="7378611153938412599">Ni rahisi kukisia manenosiri dhaifu. Hakikisha kuwa unatunga manenosiri thabiti. <ph name="BEGIN_LINK" />Angalia vidokezo zaidi vya usalama.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Fungua Duka la Chrome kwenye Wavuti</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 0523a65..b3a7ee01 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">உங்கள் புளூடூத் மற்றும் தொடர் சாதனங்களை அணுகலாம்</translation> <translation id="114036956334641753">ஆடியோவும் வசனங்களும்</translation> <translation id="1140746652461896221">நான் பார்வையிடும் அனைத்துப் பக்கங்களிலும் உள்ளடக்கத்தை தடு</translation> +<translation id="1141953877381847186">மொழிபெயர்ப்பு, விளக்கம், அலகு மாற்றம் மற்றும் பல விரைவான பதில்களை வழங்க திரையில் உள்ள தகவல்களைப் பயன்படுத்துவதற்கு Assistantடை அனுமதிக்கவும். + <ph name="BR" /> + <ph name="BEGIN_BOLD" />நினைவில் கொள்ளுங்கள்:<ph name="END_BOLD" /> Google Assistant அமைப்புகள் > தொடர்புடைய தகவல் என்பதற்குச் சென்று பிறகு எப்போது வேண்டுமானாலும் இதை மாற்றிக்கொள்ளலாம்.</translation> <translation id="1143142264369994168">சான்றிதழ் கையொப்பமிடுநர்</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{தீங்கிழைக்கும் மென்பொருளை உங்கள் கம்ப்யூட்டரில் Chrome கண்டறியவில்லை • சரிபார்க்கப்பட்டது: 1 நிமிடத்திற்கு முன்பு}other{தீங்கிழைக்கும் மென்பொருளை உங்கள் கம்ப்யூட்டரில் Chrome கண்டறியவில்லை • சரிபார்க்கப்பட்டது: {NUM_MINS} நிமிடங்களுக்கு முன்பு}}</translation> <translation id="1145593918056169051">பிரிண்டர் நின்றுவிட்டது</translation> @@ -1432,7 +1435,9 @@ <translation id="2594999711683503743">Googleளில் தேடவும் அல்லது URLலை உள்ளிடவும்</translation> <translation id="2602501489742255173">தொடங்குவதற்கு, மேல்நோக்கி ஸ்வைப் செய்யவும்</translation> <translation id="2603115962224169880">கம்ப்யூட்டரை மீட்டமைக்கவும்</translation> +<translation id="2603355571917519942">Voice Match தயாராக உள்ளது</translation> <translation id="2603463522847370204">&மறைநிலை சாளரத்தில் திற</translation> +<translation id="2604138917550693049">Google Lens மூலம் படத்தைத் தேடு</translation> <translation id="2604255671529671813">நெட்வொர்க் இணைப்புப் பிழை</translation> <translation id="2606246518223360146">தரவை இணை</translation> <translation id="2606454609872547359">வேண்டாம். ChromeVox இல்லாமல் தொடர்க</translation> @@ -1774,6 +1779,7 @@ <translation id="2963151496262057773">பின்வரும் செருகுநிரல் பதிலளிக்கவில்லை: <ph name="PLUGIN_NAME" />நிறுத்தவா?</translation> <translation id="2964193600955408481">வைஃபையை முடக்கு</translation> <translation id="2964245677645334031">’அருகிலுள்ளவற்றுடன் பகிர்தல்’ அம்சத்தின் தெரிவுநிலை</translation> +<translation id="2966216232069818096">திரையிலுள்ள தகவல்களைப் பயன்படுத்தி உங்களுக்கு உதவ Assistantடை அனுமதியுங்கள்</translation> <translation id="2966937470348689686">Android விருப்பத்தேர்வுகளை நிர்வகி</translation> <translation id="2972581237482394796">&மீண்டும் செய்</translation> <translation id="2973324205039581528">தளத்தில் ஒலி இயக்கு</translation> @@ -1869,6 +1875,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">இந்தத் தாவல், உங்கள் கேமரா அல்லது மைக்ரோஃபோனைப் பயன்படுத்துகிறது.</translation> <translation id="3083193146044397360">உங்கள் பாதுகாப்பை உறுதிசெய்ய, தற்காலிகமாகத் தடுக்கப்பட்டது</translation> +<translation id="3083899879156272923">திரையின் மையத்தில் கர்சர் இருக்கும்போது திரையை நகர்த்து</translation> <translation id="3084548735795614657">நிறுவ விடு</translation> <translation id="3084771660770137092">Chrome க்கு நினைவகம் போதாமல் இருக்கலாம் அல்லது வேறு ஏதேனும் காரணத்தினால் வலைப்பக்கத்திற்கான செயலாக்கம் நிறுத்தப்பட்டிருக்கலாம். தொடர்வதற்கு, மீண்டும் ஏற்றுக அல்லது மற்றொரு பக்கத்திற்கு செல்க.</translation> <translation id="3084958266922136097">ஸ்கிரீன் சேவரை முடக்குதல்</translation> @@ -2362,6 +2369,9 @@ <translation id="3654045516529121250">உங்கள் அணுகல்தன்மை அமைப்புகளைப் படித்தல்</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ஒரு கோப்பிற்கு நிரந்தர அணுகலைக் கொண்டுள்ளது.}other{# கோப்புகளுக்கு நிரந்தர அணுகலைக் கொண்டுள்ளது.}}</translation> <translation id="3658871634334445293">TrackPoint ஆக்ஸிலரேஷன்</translation> +<translation id="3659830472545192450">Chromebookகில் உங்கள் குரலை அடையாளம் காணவும் பிறர் குரலுக்கும் உங்கள் குரலுக்கும் உள்ள வேறுபாட்டை அறியவும் Google Assistantடிற்கு Voice Match உதவுகிறது. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />நினைவில் கொள்ளுங்கள்:<ph name="END_BOLD" /> ஒரே மாதிரியான குரலையோ ரெக்கார்டிங்கையோ கொண்ட எவராலும் உங்கள் தனிப்பட்ட முடிவுகளை அணுக முடியும். பின்னர் Assistant அமைப்புகளுக்குச் சென்று Voice Matchசை முடக்குவதன் மூலம் அதன் அனுமதியை அகற்றலாம்.</translation> <translation id="3660234220361471169">நம்பகமில்லாதது</translation> <translation id="3664511988987167893">நீட்டிப்பு ஐகான்</translation> <translation id="3665589677786828986">மற்றொரு நிரலால் உங்கள் அமைப்புகளில் சில சிதைந்துள்ளதை Chrome கண்டறிந்ததுடன், அவற்றை அசல் இயல்புநிலைகளுக்கு மீட்டமைக்கிறது.</translation> @@ -2968,7 +2978,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> சாளரத்தைப் பகிர்கிறது.</translation> <translation id="4364830672918311045">அறிவிப்புகளைக் காட்டலாம்</translation> <translation id="4366138410738374926">அச்சிடுதல் தொடங்கப்பட்டது</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> குறித்த உதவிக்குறிப்புகள், சலுகைகள், அறிவிப்புகள் ஆகியவற்றைப் பெறலாம், கருத்தைப் பகிரலாம். எப்போது வேண்டுமானாலும் குழுவிலகலாம்.</translation> <translation id="4370425812909262207">கார்ட்டுகள் மறைக்கப்பட்டுள்ளன. நீங்கள் மாற்றங்களைச் செய்யும்போது அவை மீண்டும் காட்டப்படும்.</translation> <translation id="4370975561335139969">உள்ளிட்ட மின்னஞ்சலும், கடவுச்சொல்லும் பொருந்தவில்லை.</translation> <translation id="4374831787438678295">Linux நிறுவி</translation> @@ -3121,6 +3130,7 @@ <translation id="4538417792467843292">சொல்லை நீக்கு</translation> <translation id="4538684596480161368">எப்போதும் <ph name="HOST" /> இல் சாண்ட்பாக்ஸ் செய்யப்படாத செருகுநிரல்களைத் தடு</translation> <translation id="4538792345715658285">நிறுவன கொள்கையால் நிறுவப்பட்டது.</translation> +<translation id="4541123282641193691">கணக்கைச் சரிபார்க்க முடியவில்லை. மீண்டும் முயலவும் அல்லது Chromebookகை மீண்டும் தொடங்கவும்.</translation> <translation id="4541662893742891060">இந்தச் சுயவிவரத்துடன் இணைக்க முடியவில்லை. தொழில்நுட்ப உதவியைப் பெற, உங்கள் மொபைல் நெட்வொர்க் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</translation> <translation id="4542520061254486227">உங்கள் தரவை <ph name="WEBSITE_1" /> மற்றும் <ph name="WEBSITE_2" /> இல் படிக்கவும்</translation> <translation id="4543778593405494224">சான்றிதழ் நிர்வாகி</translation> @@ -3545,6 +3555,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">நீங்கள் தேர்ந்தெடுத்த மொழிகளில் 'எழுத்துப் பிழை சரிபார்த்தல்' அம்சம் இல்லை</translation> <translation id="5052499409147950210">தளத்தைத் திருத்து</translation> +<translation id="5053962746715621840">Google Lens மூலம் படத்தைத் தேடு</translation> <translation id="5057110919553308744">நீங்கள் நீட்டிப்பைக் கிளிக் செய்யும்போது</translation> <translation id="5057403786441168405">நீங்கள் உள்நுழைந்துள்ள கணக்குகளை நிர்வகியுங்கள். அனுமதிகளின் அடிப்படையில் உங்கள் அனுபவத்தைப் பிரத்தியேகமானதாக்க Chrome மற்றும் Google Playயில் இருக்கும் தளங்களும் ஆப்ஸும் நீட்டிப்புகளும் இந்தக் கணக்குகளைப் பயன்படுத்தலாம். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="5059241099014281248">உள்நுழைவைக் கட்டுப்படுத்துதல்</translation> @@ -4027,6 +4038,9 @@ <translation id="5610038042047936818">கேமரா பயன்முறைக்கு மாறு</translation> <translation id="561030196642865721">மூன்றாம் தரப்பின் குக்கீகள் இந்த இணையதளத்தில் அனுமதிக்கப்படுகின்றன</translation> <translation id="5612734644261457353">மன்னிக்கவும், உங்கள் கடவுச்சொல் இன்னும் சரிபார்க்கப்படவில்லை. குறிப்பு: உங்கள் கடவுச்சொல்லை சமீபத்தில் மாற்றியிருந்தால், நீங்கள் வெளியேறியவுடன் புதிய கடவுச்சொல் செயல்படுத்தப்படும், இங்கு பழைய கடவுச்சொல்லைப் பயன்படுத்தவும்.</translation> +<translation id="561308544008485315">Chromebookகில் உங்கள் குரலை அடையாளம் காணவும் பிறர் குரலுக்கும் உங்கள் குரலுக்கும் உள்ள வேறுபாட்டை அறியவும் Google Assistantடிற்கு Voice Match உதவுகிறது. பேட்டரியைச் சேமிக்கும் வகையில், சாதனம் சார்ஜ் செய்யப்படும்போது மட்டுமே "Ok Google" இயக்கப்படும். மாற்றங்களைச் செய்ய அமைப்புகளுக்குச் செல்லவும். + <ph name="BR" /> + <ph name="BEGIN_BOLD" />நினைவில் கொள்ளுங்கள்:<ph name="END_BOLD" /> ஒரே மாதிரியான குரலையோ ரெக்கார்டிங்கையோ கொண்ட எவராலும் உங்கள் தனிப்பட்ட முடிவுகளை அணுக முடியும். பின்னர் Assistant அமைப்புகளுக்குச் சென்று Voice Matchசை முடக்குவதன் மூலம் அதன் அனுமதியை அகற்றலாம்.</translation> <translation id="5614190747811328134">பயனர் அறிவிப்பு</translation> <translation id="5614553682702429503">கடவுச்சொல்லைச் சேமிக்கவா?</translation> <translation id="5616726534702877126">அளவை ரிசர்வ் செய்</translation> @@ -4140,6 +4154,7 @@ <translation id="574209121243317957">குரல் அழுத்தம்</translation> <translation id="5742505912938664543">இரண்டாம் நிலைக் கணக்கை இங்கே சேர்த்தால் அதைப் பயன்படுத்தி இணையத்தில் உலாவலாம் ஆப்ஸைப் பதிவிறக்கலாம் Gmail மற்றும் பிற Google சேவைகளைப் பார்க்கலாம்.</translation> <translation id="5746169159649715125">PDFஆக சேமி</translation> +<translation id="5746261205461426123">அமைவு வழிகாட்டியைத் திற</translation> <translation id="5747552184818312860">காலாவதியாகும் தேதி</translation> <translation id="5747785204778348146">டெவெலப்பர் - நிலையற்றது</translation> <translation id="5747809636523347288"><ph name="URL" /> எனும் இணைப்பை ஒட்டி அங்கு செல்</translation> @@ -5051,6 +5066,7 @@ <translation id="6824584962142919697">&கூறுகளை ஆய்வு செய்</translation> <translation id="6825184156888454064">பெயரின்படி வரிசைப்படுத்து</translation> <translation id="6826872289184051766">USB வழியாகச் சரிபார்</translation> +<translation id="6827604573767207488">நீங்கள் ஏற்கெனவே வேறொரு சாதனத்தில் உங்களுக்கான Assistantடை அமைத்துள்ளதாகத் தெரிகிறது. பின்வரும் அமைப்பை இயக்கி Assistantடிலிருந்து அதிகப் பலன்களைப் பெறுங்கள்.</translation> <translation id="6828153365543658583">பின்வரும் பயனர்களுக்கு மட்டும் உள்நுழைவு என வரம்பிடு:</translation> <translation id="6828182567531805778">உங்கள் தரவை ஒத்திசைக்க கடவுச்சொற்றொடரை உள்ளிடவும்</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5291,6 +5307,7 @@ <translation id="708278670402572152">ஸ்கேன் செய்வதை இயக்க, இணைப்பைத் துண்டிக்கவும்</translation> <translation id="7084321615353200053">கேமராவைப் பயன்படுத்த தளங்கள் முயலும்போது அனுமதி கேள் (பரிந்துரைக்கப்படுவது)</translation> <translation id="7085389578340536476">ஆடியோவை ரெக்கார்டு செய்ய, Chromeஐ அனுமதிக்கவா?</translation> +<translation id="7085805695634549980">Google சேவைகளுடன் இணைக்க முடியவில்லை. பிழைக் குறியீடு: <ph name="ERROR_CODE" />.</translation> <translation id="7086672505018440886">காப்பகத்தில் Chrome லாக் ஃபைல்களைச் சேர்க்கும்.</translation> <translation id="7088434364990739311">புதுப்பிப்பு சரிபார்த்தலை துவங்குவதில் தோல்வி. (பிழை குறியீடு <ph name="ERROR" />).</translation> <translation id="7088561041432335295">Zip Archiver - கோப்புகள் பயன்பாட்டில் ஜிப் ஃபைல்களைத் திறக்கலாம், தொகுக்கலாம்.</translation> @@ -5485,6 +5502,7 @@ <translation id="7327989755579928735">ADB பிழைதிருத்தத்தை <ph name="MANAGER" /> முடக்கியுள்ளது. <ph name="DEVICE_TYPE" /> சாதனத்தை மீண்டும் தொடங்கியதும் உங்களால் ஆப்ஸை சைடுலோடு செய்ய முடியாது.</translation> <translation id="7328867076235380839">தவறான சேர்க்கை</translation> <translation id="7329154610228416156">பாதுகாப்பற்ற URLஐப் (<ph name="BLOCKED_URL" />) பயன்படுத்தும்படி உள்ளமைக்கப்பட்டதால் உள்நுழைவு தோல்வியானது. உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation> +<translation id="7329932885428707942">இதைச் செய்தால் மொபைல் நெட்வொர்க் இணைப்பு தற்காலிகமாகத் துண்டிக்கப்படக்கூடும்.</translation> <translation id="7332053360324989309">பிரத்தியேக வொர்க்கர்: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">டாக் செய்யப்பட்ட பெரிதாக்கியை இயக்கு</translation> <translation id="7335974957018254119">எழுத்துப்பிழைச் சரிபார்ப்பை இதற்குப் பயன்படுத்தவும்</translation> @@ -6154,6 +6172,7 @@ <translation id="8059417245945632445">&சாதனங்களை ஆய்வுசெய்</translation> <translation id="8059456211585183827">சேமிப்பதற்குப் பிரிண்டர்கள் எதுவுமில்லை.</translation> <translation id="8061091456562007989">முந்தைய அமைப்புகளுக்கு மாற்று</translation> +<translation id="8061991877177392872">நீங்கள் ஏற்கெனவே வேறொரு சாதனத்தில் உங்கள் Assistantடில் Voice Matchசை அமைத்துள்ளதாகத் தெரிகிறது. இந்தச் சாதனத்தில் குரல் மாதிரியை உருவாக்குவதற்காக அந்த முந்தைய பதிவுகள் பயன்படுத்தப்பட்டன.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{தாளின் ஒரு பக்கம்}other{தாளின் {COUNT} பக்கங்கள்}}</translation> <translation id="8062879968880283306">சாதனத்தின் கேமராவைப் பயன்படுத்தி QR குறியீட்டை ஸ்கேன் செய்யவும் அல்லது உங்கள் மொபைல் நெட்வொர்க் வழங்குநர் வழங்கிய செயல்படுத்தல் குறியீட்டை உள்ளிடவும்.</translation> <translation id="8063235345342641131">இயல்பு பச்சைநிற அவதார்</translation> @@ -6423,6 +6442,7 @@ <translation id="8379991678458444070">இந்தத் தாவலை புக்மார்க் செய்வதன் மூலம் இதை விரைவாக அணுகலாம்</translation> <translation id="8382913212082956454">&மின்னஞ்சல் முகவரியை நகலெடு</translation> <translation id="8386091599636877289">கொள்கை இல்லை.</translation> +<translation id="8386819192691131213">மொழிபெயர்ப்பு, விளக்கம், அலகு மாற்றம் மற்றும் பல விரைவான பதில்களை வழங்க திரையில் உள்ள தகவல்களைப் பயன்படுத்துவதற்கு Assistantடை அனுமதிக்கவும்</translation> <translation id="8386903983509584791">ஸ்கேன் செய்வது முடிந்தது</translation> <translation id="8387361103813440603">உங்கள் இருப்பிடத்தைப் பார்க்க அனுமதி இல்லாத தளங்கள்</translation> <translation id="8389264703141926739">அறிவிப்புகளைத் தடு</translation> @@ -6900,6 +6920,7 @@ <translation id="8915370057835397490">பரிந்துரைகளை ஏற்றுகிறது</translation> <translation id="8916476537757519021">மறைநிலை துணைச்சட்டகம்: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> இன் <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">திரையின் மூலைகளுக்குக் கர்சரைக் கொண்டுசெல்லும்போது திரையை நகர்த்து</translation> <translation id="8923880975836399332">அடர் பசும் நீலம்</translation> <translation id="8925458182817574960">&அமைப்புகள்</translation> <translation id="8926389886865778422">மீண்டும் கேட்கவேண்டாம்</translation> @@ -6977,6 +6998,7 @@ <translation id="9009708085379296446">இந்தப் பக்கத்தை மாற்ற விரும்புகிறீர்களா?</translation> <translation id="9011163749350026987">எப்போதும் ஐகானைக் காட்டு</translation> <translation id="9011393886518328654">வெளியீட்டுக் குறிப்புகள்</translation> +<translation id="9012122671773859802">கர்சரை நகர்த்துவதற்கு ஏற்ப திரையையும் தொடர்ந்து நகர்த்து</translation> <translation id="9013037634206938463">Linuxஸை நிறுவ <ph name="INSTALL_SIZE" /> சேமிப்பகம் தேவை. சேமிப்பகத்தை அதிகரிக்க சாதனத்திலிருந்து கோப்புகளை நீக்கவும்.</translation> <translation id="9013707997379828817">உங்கள் நிர்வாகி இந்தச் சாதனத்தை மீட்டமைத்துள்ளார். முக்கியமான கோப்புகளைச் சேமித்த பின்னர், சாதனத்தை மீண்டும் தொடங்கவும். மீட்டமைக்கும்போது, சாதனத்திலுள்ள அனைத்துத் தரவும் நீக்கப்படும்.</translation> <translation id="901668144954885282">Google Driveவில் காப்புப் பிரதி எடுத்தல்</translation> @@ -7021,6 +7043,7 @@ <translation id="9052404922357793350">தடுப்பதைத் தொடர்</translation> <translation id="9053563360605707198">இரண்டு பக்கங்களிலும் அச்சிடு</translation> <translation id="9053893665344928494">எனது தேர்வை நினைவில்கொள்</translation> +<translation id="9055278955535611574">"Ok Google" எனக் கூறி Assistantடை அணுகுங்கள்</translation> <translation id="9055636786322918818">RC4 என்க்ரிப்ஷனைச் செயல்படுத்தும். RC4 சைஃபர்கள் பாதுகாப்பற்றவை என்பதால், இந்த விருப்பத்தைப் பயன்படுத்துவது, உங்கள் அபாயத்தை அதிகரிக்கும்.</translation> <translation id="9056810968620647706">பொருத்தங்கள் கண்டறியப்படவில்லை.</translation> <translation id="9057354806206861646">புதுப்பிப்புக்கான திட்ட அட்டவணை</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 348ce34..5ba228d 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -2968,7 +2968,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> ఒక విండోను షేర్ చేస్తోంది.</translation> <translation id="4364830672918311045">నోటిఫికేషన్లను ప్రదర్శించడం</translation> <translation id="4366138410738374926">ప్రింట్ చేయడం ప్రారంభమైంది</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> చిట్కాలు, ఆఫర్లతో పాటు అప్డేట్లను పొందండి, ఫీడ్బ్యాక్ను షేర్ చేయండి. ఏ సమయంలో అయినా సభ్యత్వాన్ని తీసివేయండి.</translation> <translation id="4370425812909262207">కార్ట్లు దాచబడ్డాయి. మీరు మార్పులు చేసినప్పుడు అవి తిరిగి కనిపిస్తాయి.</translation> <translation id="4370975561335139969">మీరు నమోదు చేసిన ఇమెయిల్, పాస్వర్డ్ సరిపోలలేదు</translation> <translation id="4374831787438678295">Linux ఇన్స్టాలర్</translation> @@ -3121,6 +3120,7 @@ <translation id="4538417792467843292">పదాన్ని తొలగించు</translation> <translation id="4538684596480161368"><ph name="HOST" />లో ఎల్లప్పుడూ శాండ్బాక్స్ చేయని ప్లగిన్లను బ్లాక్ చేయి</translation> <translation id="4538792345715658285">వ్యాపార విధానం ద్వారా ఇన్స్టాల్ చేయబడింది.</translation> +<translation id="4541123282641193691">మీ ఖాతాను వెరిఫై చేయడం సాధ్యపడలేదు. దయచేసి మళ్లీ ట్రై చేయండి లేదా మీ Chromebookను రీస్టార్ట్ చేయండి.</translation> <translation id="4541662893742891060">ఈ ప్రొఫైల్కు కనెక్ట్ చేయడం సాధ్యం కాలేదు. టెక్నికల్ సపోర్ట్ కోసం, దయచేసి మీ క్యారియర్ను సంప్రదించండి.</translation> <translation id="4542520061254486227"><ph name="WEBSITE_1" /> మరియు <ph name="WEBSITE_2" />లోని మీ డేటాను చదవండి</translation> <translation id="4543778593405494224">ప్రమాణపత్ర నిర్వాహికి</translation> @@ -4139,6 +4139,7 @@ <translation id="574209121243317957">పిచ్</translation> <translation id="5742505912938664543">మీకు ఇక్కడ ప్రత్యామ్నాయ ఖాతాను జోడించినప్పుడు, ఆ ఖాతాను ఉపయోగించి మీరు వెబ్ను బ్రౌజ్ చేయవచ్చు, యాప్లను డౌన్లోడ్ చేయవచ్చు, మీ Gmail ఇంకా ఇతర Google సర్వీస్లను చెక్ చేయవచ్చు.</translation> <translation id="5746169159649715125">PDF లాగా సేవ్ చేయి</translation> +<translation id="5746261205461426123">సెటప్ గైడ్ను తెరువు</translation> <translation id="5747552184818312860">గడువు ముగింపు</translation> <translation id="5747785204778348146">డెవలపర్ - అస్థిరం</translation> <translation id="5747809636523347288">అతికించి <ph name="URL" />కు వెళ్ళండి</translation> @@ -5290,6 +5291,7 @@ <translation id="708278670402572152">స్కానింగ్ను ప్రారంభించడం కోసం డిస్కనెక్ట్ చేయండి</translation> <translation id="7084321615353200053">మీ కెమెరాను ఉపయోగించడం కోసం సైట్లు అడగగలవు (సిఫార్సు చేయబడింది)</translation> <translation id="7085389578340536476">ఆడియోను రికార్డ్ చేయడానికి Chromeను అనుమతించాలా?</translation> +<translation id="7085805695634549980">Google సర్వీస్లతో కనెక్ట్ చేయడం సాధ్యం కాలేదు. ఎర్రర్ కోడ్: <ph name="ERROR_CODE" />.</translation> <translation id="7086672505018440886">ఆర్కైవ్లో Chrome లాగ్ ఫైల్లను చేర్చండి.</translation> <translation id="7088434364990739311">అప్డేట్ తనిఖీ ప్రారంభం విఫలమైంది (ఎర్రర్ కోడ్ <ph name="ERROR" />).</translation> <translation id="7088561041432335295">జిప్ ఆర్కైవర్ - ఫైల్ల యాప్లో జిప్ ఫైల్లను తెరవండి మరియు ప్యాక్ చేయండి.</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 93ae4b5..1800c1c 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">เข้าถึงอุปกรณ์บลูทูธและอุปกรณ์ซีเรียล</translation> <translation id="114036956334641753">เสียงและคำบรรยายวิดีโอ</translation> <translation id="1140746652461896221">บล็อกเนื้อหาในหน้าเว็บที่คุณเข้าชม</translation> +<translation id="1141953877381847186">อนุญาตให้ Assistant ใช้ข้อมูลบนหน้าจอเพื่อให้คำตอบด่วน เช่น คำแปล ความหมาย การแปลงหน่วย และอื่นๆ + <ph name="BR" /> + <ph name="BEGIN_BOLD" />โปรดทราบว่า<ph name="END_BOLD" /> คุณจะเปลี่ยนแปลงในภายหลังได้เสมอในการตั้งค่า Google Assistant > ข้อมูลที่เกี่ยวข้อง</translation> <translation id="1143142264369994168">ผู้เซ็นชื่อในใบรับรอง</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome ไม่พบซอฟต์แวร์ที่เป็นอันตรายในคอมพิวเตอร์ของคุณ • ตรวจสอบเมื่อ 1 นาทีที่ผ่านมา}other{Chrome ไม่พบซอฟต์แวร์ที่เป็นอันตรายในคอมพิวเตอร์ของคุณ • ตรวจสอบเมื่อ {NUM_MINS} นาทีที่ผ่านมา}}</translation> <translation id="1145593918056169051">เครื่องพิมพ์หยุดทำงาน</translation> @@ -1432,7 +1435,9 @@ <translation id="2594999711683503743">ค้นหาด้วย Google หรือพิมพ์ URL</translation> <translation id="2602501489742255173">เลื่อนขึ้นเพื่อเริ่มต้นใช้งาน</translation> <translation id="2603115962224169880">ล้างข้อมูลในคอมพิวเตอร์</translation> +<translation id="2603355571917519942">Voice Match พร้อมใช้งานแล้ว</translation> <translation id="2603463522847370204">เปิดใน&หน้าต่างที่ไม่ระบุตัวตน</translation> +<translation id="2604138917550693049">ค้นหารูปภาพด้วย Google Lens</translation> <translation id="2604255671529671813">ข้อผิดพลาดในการเชื่อมต่อเครือข่าย</translation> <translation id="2606246518223360146">ลิงก์ข้อมูล</translation> <translation id="2606454609872547359">ไม่ ดำเนินการต่อโดยไม่ใช้ ChromeVox</translation> @@ -1774,6 +1779,7 @@ <translation id="2963151496262057773">ปลั๊กอินต่อไปนี้ไม่ตอบสนอง: <ph name="PLUGIN_NAME" />คุณต้องการหยุดปลั๊กอินดังกล่าวไหม</translation> <translation id="2964193600955408481">ปิดใช้งาน WiFi</translation> <translation id="2964245677645334031">ระดับการเข้าถึงของการแชร์ใกล้เคียง</translation> +<translation id="2966216232069818096">อนุญาตให้ Assistant ใช้ข้อมูลบนหน้าจอเพื่อช่วยเหลือ</translation> <translation id="2966937470348689686">จัดการค่ากำหนด Android</translation> <translation id="2972581237482394796">&ทำซ้ำ</translation> <translation id="2973324205039581528">ปิดเสียงเว็บไซต์</translation> @@ -1869,6 +1875,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">แท็บนี้กำลังใช้กล้องถ่ายรูปหรือไมโครโฟนของคุณ</translation> <translation id="3083193146044397360">ถูกบล็อกชั่วคราวเพื่อรักษาความปลอดภัยให้คุณ</translation> +<translation id="3083899879156272923">เลื่อนหน้าจอโดยให้เมาส์อยู่ตรงกลางหน้าจอเสมอ</translation> <translation id="3084548735795614657">วางเพื่อติดตั้ง</translation> <translation id="3084771660770137092">ไม่ว่า Chrome จะมีหน่วยความจำไม่เพียงพอหรือกระบวนการของหน้าเว็บถูกยกเลิกด้วยเหตุใดก็ตาม หากต้องการดำเนินการต่อ ให้โหลดซ้ำหรือไปที่หน้าเว็บอื่น</translation> <translation id="3084958266922136097">ปิดใช้โปรแกรมรักษาหน้าจอ</translation> @@ -2362,6 +2369,9 @@ <translation id="3654045516529121250">อ่านการตั้งค่าการเข้าถึง</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{แอปมีการเข้าถึงอย่างถาวรไปยัง 1 ไฟล์}other{แอปมีการเข้าถึงอย่างถาวรไปยัง # ไฟล์}}</translation> <translation id="3658871634334445293">การเร่งความเร็วของ TrackPoint</translation> +<translation id="3659830472545192450">Voice Match ช่วยให้ Google Assistant ระบุเสียงของคุณใน Chromebook และแยกความแตกต่างจากเสียงของคนอื่นๆ ได้ + <ph name="BR" /> + <ph name="BEGIN_BOLD" />โปรดทราบว่า<ph name="END_BOLD" /> บุคคลหรือเสียงบันทึกที่มีเสียงคล้ายกับคุณอาจเข้าถึงผลการค้นหาเฉพาะบุคคลของคุณได้เช่นกัน คุณจะนำสิทธิ์ Voice Match ออกได้ในภายหลังโดยปิดใช้ในการตั้งค่า Assistant</translation> <translation id="3660234220361471169">ไม่น่าเชื่อถือ</translation> <translation id="3664511988987167893">ไอคอนส่วนขยาย</translation> <translation id="3665589677786828986">Chrome ตรวจพบว่าการตั้งค่าของคุณบางส่วนได้รับความเสียหายจากโปรแกรมอื่น และรีเซ็ตการตั้งค่าเป็นค่าเริ่มต้นเดิม</translation> @@ -2968,7 +2978,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> กำลังแชร์หน้าต่าง</translation> <translation id="4364830672918311045">แสดงการแจ้งเตือน</translation> <translation id="4366138410738374926">เริ่มการพิมพ์แล้ว</translation> -<translation id="437004882363131692">รับเคล็ดลับการใช้งาน ข้อเสนอ และข้อมูลอัปเดต รวมถึงแชร์ความคิดเห็นสำหรับ <ph name="DEVICE_TYPE" /> ยกเลิกการรับข่าวสารได้ทุกเมื่อ</translation> <translation id="4370425812909262207">ซ่อนรถเข็นแล้ว รถเข็นจะปรากฏอีกครั้งเมื่อคุณทำการเปลี่ยนแปลง</translation> <translation id="4370975561335139969">อีเมลและรหัสผ่านที่คุณป้อนไม่ตรงกัน</translation> <translation id="4374831787438678295">โปรแกรมติดตั้ง Linux</translation> @@ -3545,6 +3554,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">การตรวจตัวสะกดไม่รองรับภาษาที่คุณเลือก</translation> <translation id="5052499409147950210">แก้ไขเว็บไซต์</translation> +<translation id="5053962746715621840">ค้นหารูปภาพด้วย Google Lens</translation> <translation id="5057110919553308744">เมื่อคุณคลิกส่วนขยาย</translation> <translation id="5057403786441168405">จัดการบัญชีที่ลงชื่อเข้าใช้ เว็บไซต์ แอป และส่วนขยายใน Chrome และ Google Play อาจใช้บัญชีเหล่านี้เพื่อปรับแต่งประสบการณ์การใช้งานของคุณ ทั้งนี้ขึ้นอยู่กับสิทธิ์ต่างๆ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="5059241099014281248">จำกัดการลงชื่อเข้าใช้</translation> @@ -4027,6 +4037,9 @@ <translation id="5610038042047936818">เปลี่ยนเป็นโหมดกล้อง</translation> <translation id="561030196642865721">เว็บไซต์นี้อนุญาตคุกกี้ของบุคคลที่สาม</translation> <translation id="5612734644261457353">ขออภัย ยังคงไม่สามารถยืนยันรหัสผ่านของคุณได้ หมายเหตุ: หากเมื่อเร็วๆ นี้คุณเปลี่ยนแปลงรหัสผ่าน รหัสผ่านใหม่ของคุณจะมีผลเมื่อคุณออกจากระบบ โปรดใช้รหัสผ่านเดิมที่นี่</translation> +<translation id="561308544008485315">Voice Match ช่วยให้ Google Assistant ระบุเสียงของคุณใน Chromebook และแยกความแตกต่างจากเสียงของคนอื่นๆ ได้ “Ok Google” จะใช้งานได้เฉพาะเมื่ออุปกรณ์เชื่อมต่อกับแหล่งจ่ายไฟเท่านั้นเพื่อประหยัดแบตเตอรี่ หากต้องการเปลี่ยนแปลง ให้ไปที่การตั้งค่า + <ph name="BR" /> + <ph name="BEGIN_BOLD" />โปรดทราบว่า<ph name="END_BOLD" /> บุคคลหรือเสียงบันทึกที่มีเสียงคล้ายกับคุณอาจเข้าถึงผลการค้นหาเฉพาะบุคคลของคุณได้เช่นกัน คุณจะนำสิทธิ์ Voice Match ออกได้ในภายหลังโดยปิดใช้ในการตั้งค่า Assistant</translation> <translation id="5614190747811328134">ประกาศสำหรับผู้ใช้</translation> <translation id="5614553682702429503">บันทึกรหัสผ่านไหม</translation> <translation id="5616726534702877126">สำรองพื้นที่</translation> @@ -5050,6 +5063,7 @@ <translation id="6824584962142919697">&ตรวจสอบองค์ประกอบ</translation> <translation id="6825184156888454064">จัดเรียงตามชื่อ</translation> <translation id="6826872289184051766">ยืนยันผ่าน USB</translation> +<translation id="6827604573767207488">ดูเหมือนว่าคุณตั้งค่า Assistant ที่ปรับเปลี่ยนในแบบของคุณไว้แล้วในอุปกรณ์อื่น ใช้ประโยชน์จาก Assistant ให้มากยิ่งขึ้นด้วยการเปิดการตั้งค่าต่อไปนี้</translation> <translation id="6828153365543658583">จำกัดการลงชื่อเข้าใช้ของผู้ใช้ต่อไปนี้:</translation> <translation id="6828182567531805778">ป้อนรหัสผ่านเพื่อซิงค์ข้อมูล</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5484,6 +5498,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> ปิดใช้การแก้ไขข้อบกพร่อง ADB เมื่อรีสตาร์ท <ph name="DEVICE_TYPE" /> คุณจะโหลดแอปจากแหล่งที่ไม่รู้จักไม่ได้</translation> <translation id="7328867076235380839">ชุดค่าผสมไม่ถูกต้อง</translation> <translation id="7329154610228416156">การลงชื่อเข้าใช้ล้มเหลวเนื่องจากมีการกำหนดค่าให้ใช้ URL ที่ไม่ปลอดภัย (<ph name="BLOCKED_URL" />) โปรดติดต่อผู้ดูแลระบบของคุณ</translation> +<translation id="7329932885428707942">การดำเนินการนี้อาจทำให้เครือข่ายมือถือขาดการเชื่อมต่อเป็นเวลาสั้นๆ</translation> <translation id="7332053360324989309">ผู้ปฏิบัติงานเฉพาะอย่าง: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">เปิดใช้แว่นขยายหน้าจอบางส่วน</translation> <translation id="7335974957018254119">ใช้การตรวจตัวสะกดสำหรับ</translation> @@ -6153,6 +6168,7 @@ <translation id="8059417245945632445">&ตรวจสอบอุปกรณ์</translation> <translation id="8059456211585183827">ไม่มีเครื่องพิมพ์ให้บันทึก</translation> <translation id="8061091456562007989">เปลี่ยนกลับ</translation> +<translation id="8061991877177392872">ดูเหมือนว่าคุณได้ตั้งค่า Voice Match กับ Assistant ในอุปกรณ์อื่นไว้แล้ว ระบบใช้เสียงบันทึกที่มีอยู่ก่อนแล้วดังกล่าวในการสร้างรูปแบบเสียงในอุปกรณ์นี้</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 แผ่น}other{{COUNT} แผ่น}}</translation> <translation id="8062879968880283306">สแกนคิวอาร์โค้ดโดยใช้กล้องของอุปกรณ์หรือป้อนรหัสเปิดใช้งานที่ผู้ให้บริการให้มา</translation> <translation id="8063235345342641131">รูปโปรไฟล์เริ่มต้นสีเขียว</translation> @@ -6422,6 +6438,7 @@ <translation id="8379991678458444070">บุ๊กมาร์กแท็บนี้ไว้เพื่อให้กลับมาได้อย่างรวดเร็ว</translation> <translation id="8382913212082956454">คัดลอก&ที่อยู่อีเมล</translation> <translation id="8386091599636877289">ไม่พบนโยบาย</translation> +<translation id="8386819192691131213">อนุญาตให้ Assistant ใช้ข้อมูลบนหน้าจอเพื่อให้คำตอบด่วน เช่น คำแปล ความหมาย การแปลงหน่วย และอื่นๆ</translation> <translation id="8386903983509584791">สแกนเสร็จแล้ว</translation> <translation id="8387361103813440603">ไม่ได้รับอนุญาตให้ดูตำแหน่งของคุณ</translation> <translation id="8389264703141926739">บล็อกการแจ้งเตือน</translation> @@ -6899,6 +6916,7 @@ <translation id="8915370057835397490">กำลังโหลดคำแนะนำ</translation> <translation id="8916476537757519021">เฟรมย่อยแบบไม่ระบุตัวตน: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> ของ <ph name="GIVEN_NAME" /></translation> +<translation id="8922624386829239660">เลื่อนหน้าจอเมื่อเมาส์แตะขอบหน้าจอ</translation> <translation id="8923880975836399332">สีน้ำเงินอมเขียวเข้ม</translation> <translation id="8925458182817574960">&การตั้งค่า</translation> <translation id="8926389886865778422">ไม่ต้องถามอีก</translation> @@ -6976,6 +6994,7 @@ <translation id="9009708085379296446">คุณต้องการเปลี่ยนแปลงหน้านี้ใช่ไหม</translation> <translation id="9011163749350026987">แสดงไอคอนเสมอ</translation> <translation id="9011393886518328654">บันทึกประจำรุ่น</translation> +<translation id="9012122671773859802">เลื่อนหน้าจออย่างต่อเนื่องขณะเลื่อนเมาส์</translation> <translation id="9013037634206938463">การติดตั้ง Linux ต้องใช้พื้นที่ว่าง <ph name="INSTALL_SIZE" /> หากต้องการเพิ่มพื้นที่ว่าง ให้ลบไฟล์ออกจากอุปกรณ์</translation> <translation id="9013707997379828817">ผู้ดูแลระบบได้คืนค่าสถานะของอุปกรณ์เครื่องนี้แล้ว โปรดบันทึกไฟล์สำคัญแล้วรีสตาร์ทเครื่อง ข้อมูลทั้งหมดในอุปกรณ์จะถูกลบออกไป</translation> <translation id="901668144954885282">สำรองข้อมูลไปยัง Google ไดรฟ์</translation> @@ -7020,6 +7039,7 @@ <translation id="9052404922357793350">บล็อกต่อไป</translation> <translation id="9053563360605707198">พิมพ์ทั้ง 2 ด้าน</translation> <translation id="9053893665344928494">จดจำตัวเลือกของฉัน</translation> +<translation id="9055278955535611574">เข้าถึง Assistant โดยพูดว่า "Ok Google"</translation> <translation id="9055636786322918818">บังคับใช้การเข้ารหัส RC4 การใช้ตัวเลือกนี้เป็นการเพิ่มความเสี่ยงเนื่องจากการเข้ารหัส RC4 นั้นไม่ปลอดภัย</translation> <translation id="9056810968620647706">ไม่พบรายการที่ตรงกัน</translation> <translation id="9057354806206861646">อัปเดตกำหนดการ</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 5e5b505..39a4c05 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Bluetooth ve Seri cihazlarınıza erişme</translation> <translation id="114036956334641753">Ses ve altyazı</translation> <translation id="1140746652461896221">Ziyaret ettiğiniz tüm sayfalardaki içerik engellensin</translation> +<translation id="1141953877381847186">Asistan'ın çeviri, tanım, birim dönüştürme ve diğer konularda hızlı yanıt sağlaması için ekrandaki bilgileri kullanmasına izin verin. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Unutmayın:<ph name="END_BOLD" /> Bunu daha sonra istediğiniz zaman Google Asistan Ayarları > İlgili bilgiler'de değiştirebilirsiniz.</translation> <translation id="1143142264369994168">Sertifika İmza Sahibi</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome, bilgisayarınızda zararlı yazılım bulamadı • 1 dakika önce kontrol edildi}other{Chrome, bilgisayarınızda zararlı yazılım bulamadı • {NUM_MINS} dakika önce kontrol edildi}}</translation> <translation id="1145593918056169051">Yazıcı durdu</translation> @@ -1432,7 +1435,9 @@ <translation id="2594999711683503743">Google'da arayın veya URL'yi yazın</translation> <translation id="2602501489742255173">Başlamak için yukarı doğru kaydırın</translation> <translation id="2603115962224169880">Bilgisayarı temizleme</translation> +<translation id="2603355571917519942">Voice Match hazır</translation> <translation id="2603463522847370204">&Gizli pencerede aç</translation> +<translation id="2604138917550693049">Google Lens ile resim ara</translation> <translation id="2604255671529671813">Ağ bağlantısı hatası</translation> <translation id="2606246518223360146">Verileri Bağla</translation> <translation id="2606454609872547359">Hayır, ChromeVox olmadan devam et</translation> @@ -1774,6 +1779,7 @@ <translation id="2963151496262057773">Aşağıdaki eklenti yanıt vermiyor: <ph name="PLUGIN_NAME" />Durdurmak ister misiniz?</translation> <translation id="2964193600955408481">Kablosuz bağlantıyı devre dışı bırak</translation> <translation id="2964245677645334031">Yakındakilerle Paylaş görünürlüğü</translation> +<translation id="2966216232069818096">Yardımcı olması için Asistanınızın ekranınızdaki bilgileri kullanmasına izin verin</translation> <translation id="2966937470348689686">Android tercihlerini yönet</translation> <translation id="2972581237482394796">&Yinele</translation> <translation id="2973324205039581528">Sitenin Sesini Kapat</translation> @@ -1869,6 +1875,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Bu sekme kameranızı ve/veya mikrofonunuzu kullanıyor.</translation> <translation id="3083193146044397360">Güvenliğinizi korumak için geçici olarak engellendi</translation> +<translation id="3083899879156272923">Fareyi ekranın ortasında tutarak ekranı taşı</translation> <translation id="3084548735795614657">Yükleme hedefi</translation> <translation id="3084771660770137092">Ya Chrome'da bellek kalmadı ya da web sayfasına ait işlem başka bir nedenden dolayı sonlandırıldı. Devam etmek için yeniden yükleyin veya başka bir sayfaya gidin.</translation> <translation id="3084958266922136097">Ekran koruyucuyu devre dışı bırak</translation> @@ -2362,6 +2369,9 @@ <translation id="3654045516529121250">Erişilebilirlik ayarlarınızı okuma</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Bir dosyaya kalıcı erişimi vardır.}other{# dosyaya kalıcı erişimi vardır.}}</translation> <translation id="3658871634334445293">TrackPoint hızlandırması</translation> +<translation id="3659830472545192450">Voice Match, Google Asistanınızın hem Chromebook'unuzda sesinizi tanımasına hem de sizi başkalarından ayırt etmesine yardımcı olur. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Unutmayın:<ph name="END_BOLD" /> Sesi size benzeyen ya da sesinizin kaydına sahip kişiler de kişisel sonuçlarınıza erişebilir. Voice Match iznini daha sonra Asistan Ayarları'ndan devre dışı bırakarak kaldırabilirsiniz.</translation> <translation id="3660234220361471169">Güvenilmeyen</translation> <translation id="3664511988987167893">Uzantı Simgesi</translation> <translation id="3665589677786828986">Chrome, bazı ayarlarınızın başka bir program tarafından bozulduğunu algıladı ve onları orijinal varsayılan değerlerine sıfırladı.</translation> @@ -2968,7 +2978,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" />, bir pencereyi paylaşıyor.</translation> <translation id="4364830672918311045">Bildirimleri görüntüleme</translation> <translation id="4366138410738374926">Yazdırma başladı</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> ile ilgili ipuçları, fırsatlar ve güncellemeler alın, geri bildirimlerinizi paylaşın. İstediğiniz zaman aboneliğinizi iptal edebilirsiniz.</translation> <translation id="4370425812909262207">Alışveriş sepetleri gizlendi. Değişiklik yaptığınızda yeniden görünürler.</translation> <translation id="4370975561335139969">Girdiğiniz e-posta ve şifre eşleşmiyor</translation> <translation id="4374831787438678295">Linux yükleyici</translation> @@ -3545,6 +3554,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Yazım denetimi, seçtiğiniz diller için desteklenmiyor</translation> <translation id="5052499409147950210">Siteyi düzenle</translation> +<translation id="5053962746715621840">Google Lens ile Resim Ara</translation> <translation id="5057110919553308744">Uzantıyı tıkladığınızda</translation> <translation id="5057403786441168405">Oturum açtığınız hesaplarınızı yönetin. Chrome ve Google Play'deki web siteleri, uygulamalar ve uzantılar, izinlere bağlı olarak deneyiminizi özelleştirmek için bu hesapları kullanabilirler. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Oturum açma özelliğini kısıtla</translation> @@ -4027,6 +4037,9 @@ <translation id="5610038042047936818">Kamera moduna geç</translation> <translation id="561030196642865721">Bu sitede üçüncü taraf çerezlere izin veriliyor</translation> <translation id="5612734644261457353">Maalesef şifreniz hâlâ doğrulanamadı. Not: Şifrenizi yakın zamanda değiştirdiyseniz, yeni şifreniz çıkış yapmanızdan sonra geçerli olacaktır. Lütfen burada eski şifrenizi kullanın.</translation> +<translation id="561308544008485315">Voice Match, Google Asistanınızın hem Chromebook'unuzda sesinizi tanımasına hem de sizi başkalarından ayırt etmesine yardımcı olur. Pilden tasarruf etmek için "Ok Google" özelliği, yalnızca cihazınız güç kaynağına bağlıyken etkin olur. Değişiklik yapmak için Ayarlar'a gidin. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Unutmayın:<ph name="END_BOLD" /> Sesi size benzeyen ya da sesinizin kaydına sahip kişiler de kişisel sonuçlarınıza erişebilir. Voice Match iznini daha sonra Asistan Ayarları'ndan devre dışı bırakarak kaldırabilirsiniz.</translation> <translation id="5614190747811328134">Kullanıcı Bildirimi</translation> <translation id="5614553682702429503">Şifre kaydedilsin mi?</translation> <translation id="5616726534702877126">Disk alanı ayır</translation> @@ -5051,6 +5064,7 @@ <translation id="6824584962142919697">Öğeleri &incele</translation> <translation id="6825184156888454064">Ada göre sırala</translation> <translation id="6826872289184051766">USB kullanarak doğrula</translation> +<translation id="6827604573767207488">Kişiselleştirilmiş Google Asistan'ı başka bir cihazda zaten kurmuş olduğunuz anlaşılıyor. Aşağıdaki ayarları etkinleştirerek Asistanınızdan daha da fazla yararlanın.</translation> <translation id="6828153365543658583">Yalnızca aşağıdaki kullanıcıların oturum açmasına izin ver:</translation> <translation id="6828182567531805778">Verilerinizi senkronize etmek için parolanızı girin</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5485,6 +5499,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" />, ADB hata ayıklama işlevini devre dışı bıraktı. <ph name="DEVICE_TYPE" /> cihazınızı yeniden başlattıktan sonra başka cihazdan uygulama yükleyemezsiniz.</translation> <translation id="7328867076235380839">Geçersiz kombinasyon</translation> <translation id="7329154610228416156">Güvenli olmayan bir URL (<ph name="BLOCKED_URL" />) kullanmak üzere yapılandırıldığından oturum açılamadı. Lütfen yöneticinizle iletişime geçin.</translation> +<translation id="7329932885428707942">Bu işlem, hücresel ağ bağlantısının kısa süreliğine kesilmesine neden olabilir.</translation> <translation id="7332053360324989309">Özel Çalışan: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Yerleşik büyüteci etkinleştir</translation> <translation id="7335974957018254119">Şu diller için yazım denetimi kullan:</translation> @@ -5528,6 +5543,7 @@ <translation id="7374376573160927383">USB cihazları yönet</translation> <translation id="7375235221357833624">{0,plural, =1{Cihazı bir saat içinde güncelleyin}other{Cihazı # saat içinde güncelleyin}}</translation> <translation id="7376553024552204454">Hareket ederken fare imlecini vurgula</translation> +<translation id="737728204345822099">Bu siteye ziyaretinizin bir kaydı güvenlik anahtarınızda saklanabilir.</translation> <translation id="7377451353532943397">Sensör erişimini engellemeye devam et</translation> <translation id="7378611153938412599">Zayıf şifrelerin tahmin edilmesi kolaydır. Güçlü şifreler oluşturduğunuzdan emin olun. <ph name="BEGIN_LINK" />Güvenlikle ilgili daha fazla ipucu görün.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome Web Mağazası'nı açın</translation> @@ -6153,6 +6169,7 @@ <translation id="8059417245945632445">&Cihazları denetle</translation> <translation id="8059456211585183827">Kaydedilebilecek yazıcı yok.</translation> <translation id="8061091456562007989">Geri değiştir</translation> +<translation id="8061991877177392872">Asistanınızla Voice Match'i başka bir cihazda zaten kurmuş olduğunuz anlaşılıyor. Önceki bu kayıtlar, bu cihazda bir ses modeli oluşturmak için kullanıldı.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 kağıt}other{{COUNT} kağıt}}</translation> <translation id="8062879968880283306">Cihaz kamerasını kullanarak QR kodunu tarayın veya operatörünüz tarafından sağlanan etkinleştirme kodunu girin.</translation> <translation id="8063235345342641131">Varsayılan yeşil avatar</translation> @@ -6422,6 +6439,7 @@ <translation id="8379991678458444070">Bu sekmeye yer işareti koyarak buraya hızlıca geri dönün</translation> <translation id="8382913212082956454">E-posta &adresini kopyala</translation> <translation id="8386091599636877289">Politika bulunamadı.</translation> +<translation id="8386819192691131213">Asistan'ın çeviri, tanım, birim dönüştürme ve diğer konularda hızlı yanıt sağlaması için ekrandaki bilgileri kullanmasına izin verin</translation> <translation id="8386903983509584791">Tarama tamamlandı</translation> <translation id="8387361103813440603">Konumunuzu görmesine izin verilmeyen siteler</translation> <translation id="8389264703141926739">Bildirimleri engelle</translation> @@ -6899,6 +6917,7 @@ <translation id="8915370057835397490">Öneriler yükleniyor</translation> <translation id="8916476537757519021">Gizli Alt Çerçeve: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> adlı kişinin <ph name="DEVICE_TYPE" /> cihazı</translation> +<translation id="8922624386829239660">Fare ekranın kenarlarına dokunduğunda ekranı taşı</translation> <translation id="8923880975836399332">Koyu turkuaz</translation> <translation id="8925458182817574960">&Ayarlar</translation> <translation id="8926389886865778422">Bir daha sorma</translation> @@ -6976,6 +6995,7 @@ <translation id="9009708085379296446">Bu sayfayı değiştirmek mi istediniz?</translation> <translation id="9011163749350026987">Her zaman simgeyi göster</translation> <translation id="9011393886518328654">Sürüm notları</translation> +<translation id="9012122671773859802">Fare hareket ederken ekranı sürekli olarak taşı</translation> <translation id="9013037634206938463">Linux'u yüklemek için <ph name="INSTALL_SIZE" /> boş alan olması gerekir. Boş alanı artırmak için cihazdan bazı dosyaları silin.</translation> <translation id="9013707997379828817">Yöneticiniz bu cihazı ilk haline döndürdü. Lütfen önemli dosyaları kaydedin ve sonra yeniden başlatın. Cihazdaki tüm veriler silinecektir.</translation> <translation id="901668144954885282">Google Drive'a yedekle</translation> @@ -7020,6 +7040,7 @@ <translation id="9052404922357793350">Engellemeye devam et</translation> <translation id="9053563360605707198">Her iki yüze yazdır</translation> <translation id="9053893665344928494">Seçimimi hatırla</translation> +<translation id="9055278955535611574">Asistanınıza "Ok Google" diyerek erişin</translation> <translation id="9055636786322918818">RC4 şifrelemesini uygula. RC4 şifreleri güvenli olmadığından bu seçeneğin kullanılması, riskinizi artırır.</translation> <translation id="9056810968620647706">Eşleştirme bulunamadı.</translation> <translation id="9057354806206861646">Programı güncelle</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index d29bbb1d..40d07d3 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -2971,7 +2971,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> транслює вікно.</translation> <translation id="4364830672918311045">Показувати сповіщення</translation> <translation id="4366138410738374926">Початок друку</translation> -<translation id="437004882363131692">Отримуйте поради, пропозиції й оновлення для пристрою <ph name="DEVICE_TYPE" />, а також надсилайте відгуки. Ви можете будь-коли скасувати підписку на ці сповіщення.</translation> <translation id="4370425812909262207">Кошики сховано. Вони з'являться знову, коли ви внесете зміни.</translation> <translation id="4370975561335139969">Введені електронна адреса та пароль не збігаються</translation> <translation id="4374831787438678295">Файл встановлення Linux</translation> @@ -5530,6 +5529,7 @@ <translation id="7374376573160927383">Керувати пристроями USB</translation> <translation id="7375235221357833624">{0,plural, =1{Оновіть пристрій протягом години}one{Оновіть пристрій протягом # години}few{Оновіть пристрій протягом # годин}many{Оновіть пристрій протягом # годин}other{Оновіть пристрій протягом # години}}</translation> <translation id="7376553024552204454">Підсвічувати курсор миші під час руху</translation> +<translation id="737728204345822099">На ключі безпеки може зберегтися запис про те, що ви відвідували цей сайт.</translation> <translation id="7377451353532943397">Продовжити блокувати доступ до датчиків</translation> <translation id="7378611153938412599">Ненадійні паролі можна легко вгадати, тому переконайтеся, що ваші є безпечними. <ph name="BEGIN_LINK" />Перегляньте інші поради щодо безпеки<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Відкрити Веб-магазин Chrome</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 5d31682f..dabd742 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -2969,7 +2969,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> ایک ونڈو کا اشتراک کر رہی ہے۔</translation> <translation id="4364830672918311045">اطلاعات ڈسپلے کریں</translation> <translation id="4366138410738374926">پرنٹنگ شروع ہو گئی ہے</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> کی تجاویز، پیشکشیں اور اپ ڈیٹس حاصل کریں اور تاثرات کا اشتراک کریں۔ کسی بھی وقت اَن سبسکرائب کریں۔</translation> <translation id="4370425812909262207">کارٹس چھپا دئے گئے۔ آپ کے تبدیلیاں کرنے پر وہ دوبارہ دکھائی دیں گے۔</translation> <translation id="4370975561335139969">آپ کی جانب سے درج کردہ ای میل اور پاس ورڈ مماثل نہیں ہیں</translation> <translation id="4374831787438678295">Linux انسٹالر</translation> @@ -3122,6 +3121,7 @@ <translation id="4538417792467843292">لفظ حذف کریں</translation> <translation id="4538684596480161368"><ph name="HOST" /> پر سینڈ باکس سے نکالے ہوئے پلگ انز ہمیشہ مسدود کریں</translation> <translation id="4538792345715658285">انٹرپرائز پالیسی کے ذریعے انسٹال کیا گیا۔</translation> +<translation id="4541123282641193691">آپ کے اکاؤنٹ کی تصدیق نہیں ہو سکی۔ براہ کرم دوبارہ کوشش کریں یا اپنا Chromebook ری سٹارٹ کریں۔</translation> <translation id="4541662893742891060">اس پروفائل سے منسلک ہونے سے قاصر۔ تکنیکی سپورٹ کیلئے، براہ کرم اپنے کیریئر سے رابطہ کریں۔</translation> <translation id="4542520061254486227"><ph name="WEBSITE_1" /> اور <ph name="WEBSITE_2" /> پر اپنا ڈیٹا پڑھیں</translation> <translation id="4543778593405494224">سرٹیفیکیٹ مینیجر</translation> @@ -4139,6 +4139,7 @@ <translation id="574209121243317957">پچ</translation> <translation id="5742505912938664543">آپ کے یہاں ثانوی اکاؤنٹ شامل کرنے پر، آپ اس اکاؤنٹ کا استعمال کر کے ویب براؤز کر سکتے ہیں، ایپس ڈاؤن لوڈ کر سکتے ہیں اور اپنی Gmail اور دیگر Google سروسز چیک کر سکتے ہیں۔</translation> <translation id="5746169159649715125">PDF کے بطور محفوظ کریں</translation> +<translation id="5746261205461426123">سیٹ اپ گائیڈ کھولیں</translation> <translation id="5747552184818312860">میعاد کا اختتام</translation> <translation id="5747785204778348146">ڈویلپر - ناپائیدار</translation> <translation id="5747809636523347288">پیسٹ کریں اور <ph name="URL" /> پر جائیں</translation> @@ -5290,6 +5291,7 @@ <translation id="708278670402572152">اسکین کرنے کو فعال کرنے کے لئے غیر منسلک کریں</translation> <translation id="7084321615353200053">سائٹس آپ کا کیمرا استعمال کرنے کیلئے پوچھ سکتی ہیں (تجویز کردہ ہے)</translation> <translation id="7085389578340536476">Chrome کو آڈیو ریکارڈ کرنے کی اجازت دیں؟</translation> +<translation id="7085805695634549980">Google سروسز سے منسلک نہیں کیا جا سکا۔ خرابی کا کوڈ: <ph name="ERROR_CODE" />۔</translation> <translation id="7086672505018440886">آرکائیو میں Chrome کی لاگ فائلز کو شامل کریں۔</translation> <translation id="7088434364990739311">اپ ڈیٹ چیک شروع ہونے میں ناکام ہوگیا (خرابی کا کوڈ <ph name="ERROR" />)۔</translation> <translation id="7088561041432335295">Zip Archiver - فائلز ایپ میں ZIP فائلز کھولیں اور پیک کریں۔</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 71c923d4..6bb0adb 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Bluetooth va keyingi seriyali qurilmalaringizga ruxsat</translation> <translation id="114036956334641753">Audio va taglavhalar</translation> <translation id="1140746652461896221">Kirilgan sahifadagi kontentni bloklash</translation> +<translation id="1141953877381847186">Assistentga tarjima, tavsif, birliklar konvertori va boshqa narsalarni chiqarish maqsadida ekrandagi axborotdan foydalanishiga ruxsat berish. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Eslatma:<ph name="END_BOLD" /> Buni istalgan vaqtda Google Assistent sozlamalari > Aloqador axborot orqali oʻzgartirish mumkin.</translation> <translation id="1143142264369994168">Sertifikat imzolovchisi</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome kompyuteringizdan zararli dasturlarni topa olmadi. • 1 daqiqa oldin tekshirildi}other{Chrome kompyuteringizdan zararli dasturlarni topa olmadi. • {NUM_MINS} daqiqa oldin tekshirildi}}</translation> <translation id="1145593918056169051">Printer ishlamay qoldi</translation> @@ -1434,7 +1437,9 @@ <translation id="2594999711683503743">Qidiring yoki veb-sahifa manzilini kiriting</translation> <translation id="2602501489742255173">Boshlash uchun tepaga suring</translation> <translation id="2603115962224169880">Kompyuterni tozalash vositasi</translation> +<translation id="2603355571917519942">Voice Match tayyor</translation> <translation id="2603463522847370204">&Inkognito rejimida ochish</translation> +<translation id="2604138917550693049">Google Lens yordamida rasm qidirish</translation> <translation id="2604255671529671813">Tarmoqqa ulanishda xato</translation> <translation id="2606246518223360146">Hisoblarni ulash</translation> <translation id="2606454609872547359">Yoʻq, nofaol ChromeVox bilan davom ettirish</translation> @@ -1777,6 +1782,7 @@ <translation id="2963151496262057773">“<ph name="PLUGIN_NAME" />” plagin so‘rovlarga javob bermay qo‘ydi. U to‘xtatilsinmi?</translation> <translation id="2964193600955408481">Wi-Fi‘ni o‘chirib qo‘yish</translation> <translation id="2964245677645334031">Yaqin-atrofga ochiqlik</translation> +<translation id="2966216232069818096">Assistent yordam berish uchun ekrandagi axborotdan foydalanishiga ruxsat bering</translation> <translation id="2966937470348689686">Android sozlamalarini boshqarish</translation> <translation id="2972581237482394796">&Qaytarish</translation> <translation id="2973324205039581528">Sayt ovozini o‘chirish</translation> @@ -1873,6 +1879,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">Bu ichki oyna kamera yoki mikrofoningizdan foydalanmoqda.</translation> <translation id="3083193146044397360">Axborotingizni himoyalash uchun vaqtincha bloklandi</translation> +<translation id="3083899879156272923">Ekranni sichqoncha markazda joylangan holda surish</translation> <translation id="3084548735795614657">O‘rnatish uchun bu yerga tashlang</translation> <translation id="3084771660770137092">Ushbu veb-sahifani ko‘rsatish vaqtida Chrome xotirasida bo‘sh joy tugab qoldi yoki boshqa sabab tufayli sahifadagi amal to‘xtatildi. Davom etish uchun sahifani yangilang yoki yangi oynada oching.</translation> <translation id="3084958266922136097">Ekran lavhasini faolsizlantirish</translation> @@ -2368,6 +2375,9 @@ <translation id="3654045516529121250">Maxsus imkoniyatlar sozlamalarini o‘qish</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{1 ta faylga doimiy ruxsati bor.}other{# ta faylga doimiy ruxsati bor.}}</translation> <translation id="3658871634334445293">TrackPoint tezlatkichi</translation> +<translation id="3659830472545192450">Voice Match funksiyasi Google Assistent ovozingizni Chromebookda va boshqalardan ajratib olishiga yordam beradi. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Eslatma:<ph name="END_BOLD" /> Oʻxshash yoki yozib olingan ovozlar ham shaxsiy natijalaringizni olishi mumkin. Voice Match funksiyasini istalgan vaqtda Assistent sozlamalari orqali olib tashlash mumkin.</translation> <translation id="3660234220361471169">Ishonchsiz</translation> <translation id="3664511988987167893">Kengaytma ikonkasi</translation> <translation id="3665589677786828986">Chrome‘ning ba’zi sozlamalari tashqi dastur tomonidan o‘zgartirildi. Brauzer birlamchi sozlamalarini tiklab oldi.</translation> @@ -2976,7 +2986,6 @@ <translation id="4364567974334641491">“<ph name="APP_NAME" />” ilovasi oynaga kirish uchun ruxsat berdi.</translation> <translation id="4364830672918311045">Bildirishnomalarni ko‘rsatish</translation> <translation id="4366138410738374926">Chop etish boshlangan</translation> -<translation id="437004882363131692"><ph name="DEVICE_TYPE" /> bilan ishlashga oid takliflar, mashalatlar va yangiliklar oling va fikr-mulohaza yuboring. Istalgan vaqt obunani bekor qilish mumkin.</translation> <translation id="4370425812909262207">Savatlar yashirildi. Oʻzgarishlar kiritsangiz, ular yana chiqadi.</translation> <translation id="4370975561335139969">Siz kiritgan e-pochta va parol mos kelmadi</translation> <translation id="4374831787438678295">Linux uchun o‘rnatkich</translation> @@ -3556,6 +3565,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">Tanlangan tilda imlo tekshirilmaydi</translation> <translation id="5052499409147950210">Saytni tahrirlash</translation> +<translation id="5053962746715621840">Google Lens yordamida rasm qidirish</translation> <translation id="5057110919553308744">Kengaytma bosilganda</translation> <translation id="5057403786441168405">Kirilgan hisoblaringizni boshqaring. Chrome va Google Play marketdagi saytlar, ilovalar va kengaytmalar bu hisoblardan berilgan ruxsatlar asosida xizmatlarni sizga yanada mosroq va qulayroq qilishda foydalanishi mumkin. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Kirishni taqiqlash</translation> @@ -4039,6 +4049,9 @@ <translation id="5610038042047936818">Foto rejimini yoqish</translation> <translation id="561030196642865721">Bu saytda tashqi cookie fayllar bloklanmaydi</translation> <translation id="5612734644261457353">Parol noto‘g‘ri kiritildi. Unutmangki: bu parol yaqinda o‘zgartirilgan, lekin tizimdan chiqilmagan, yangi parol qo‘llanishi uchun eski parolingizni kiriting.</translation> +<translation id="561308544008485315">Voice Match funksiyasi Google Assistent ovozingizni Chromebookda va boshqalardan ajratib olishiga yordam beradi. Batareyani tejash uchun “Ok Google” iborasi faqatgina qurilma quvvat manbasiga ulanganda ishlaydi. Buni Sozlamalar orqali oʻzgartirishingiz mumkin. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Eslatma:<ph name="END_BOLD" /> Oʻxshash yoki yozib olingan ovozlar ham shaxsiy natijalaringizni olishi mumkin. Voice Match funksiyasini istalgan vaqtda Assistent sozlamalari orqali olib tashlash mumkin.</translation> <translation id="5614190747811328134">Foydalanuvchiga eslatma</translation> <translation id="5614553682702429503">Parol saqlansinmi?</translation> <translation id="5616726534702877126">Joy zaxiralash</translation> @@ -5069,6 +5082,7 @@ <translation id="6824584962142919697">&Elementlarni tekshirish</translation> <translation id="6825184156888454064">Nomi bo‘yicha saralash</translation> <translation id="6826872289184051766">USB orqali tasdiqlash</translation> +<translation id="6827604573767207488">Boshqa qurilmada moslashtirilgan Assistentni sozlagansiz. Quyidagi sozlamalarni yoqish orqali Assistent imkoniyatlaridan yanada koʻproq foydalaning.</translation> <translation id="6828153365543658583">Quyidagi foydalanuvchilarga kirishga ruxsat berish:</translation> <translation id="6828182567531805778">Sinxronlash uchun kodli iborani kiriting</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5504,6 +5518,7 @@ <translation id="7327989755579928735">ADB tuzatish vositasi <ph name="MANAGER" /> tomonidan faolsizlantirildi. <ph name="DEVICE_TYPE" /> qurilmasini qayta ishga tushirsangiz, tashqaridan yuklab olingan ilovalarga kira olmaysiz.</translation> <translation id="7328867076235380839">Xato kombinatsiya</translation> <translation id="7329154610228416156">Kirish amalga oshmadi, chunki u xavfli URL manzildan foydalanish uchun moslangan (<ph name="BLOCKED_URL" />). Administrator bilan bog‘laning.</translation> +<translation id="7329932885428707942">Bunda mobil tarmoq biroz uzilishi mumkin.</translation> <translation id="7332053360324989309">Dedicated Worker: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Lupani ekranga mahkamlash</translation> <translation id="7335974957018254119">Imlo tekshiruvi quyidagilar uchun ishlatilsin:</translation> @@ -5547,6 +5562,7 @@ <translation id="7374376573160927383">USB qurilmalarni boshqarish</translation> <translation id="7375235221357833624">{0,plural, =1{Qurilmani bir soat ichida oʻchirib yoqish kerak}other{Qurilmani # soat ichida oʻchirib yoqish kerak}}</translation> <translation id="7376553024552204454">Sichqoncha siljiganda ajratib ko‘rsatilsin</translation> +<translation id="737728204345822099">Joriy saytga tashrifingiz haqidagi axborot elektron kalitga saqlanishi mumkin.</translation> <translation id="7377451353532943397">Sensor doim bloklansin</translation> <translation id="7378611153938412599">Kuchsiz parollar oson topiladi. Kuchli parol yarating. <ph name="BEGIN_LINK" />Xavfsizlikka oid boshqa maslahatlar bilan tanishing.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome internet-do‘konida ochish</translation> @@ -6172,6 +6188,7 @@ <translation id="8059417245945632445">&Qurilmalar tekshiruvi</translation> <translation id="8059456211585183827">Saqlash uchun printerlar topilmadi.</translation> <translation id="8061091456562007989">Ortga qaytarish</translation> +<translation id="8061991877177392872">Voice Match funksiyasini Assistentli boshqa qurilmada allaqachon sozlagansiz. Ushbu avvalgi yozuvlardan bu qurilmada namuna yaratishda foydalanilgan.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 varaq qogʻoz}other{{COUNT} varaq qogʻoz}}</translation> <translation id="8062879968880283306">Qurilma kamerasi orqali QR kodni skanerlang yoki aloqa operatori taqdim qilgan aktivatsiya kodini kiriting.</translation> <translation id="8063235345342641131">Standart yashil avatar</translation> @@ -6443,6 +6460,7 @@ <translation id="8379991678458444070">Bu varaq bukmarkka olinsa, keyinchalik oson topiladi</translation> <translation id="8382913212082956454">&E-pochta manzilini nusxalash</translation> <translation id="8386091599636877289">Bu parametr topilmadi.</translation> +<translation id="8386819192691131213">Assistentga tarjima, tavsif, birliklar konvertori va boshqa narsalarni chiqarish maqsadida ekrandagi axborotdan foydalanishiga ruxsat berish</translation> <translation id="8386903983509584791">Tarmoq tekshirildi</translation> <translation id="8387361103813440603">Joylashuvingizni koʻrish taqiqlangan</translation> <translation id="8389264703141926739">Bildirishnomalarni bloklash</translation> @@ -6925,6 +6943,7 @@ <translation id="8915370057835397490">Taklif yuklanmoqda</translation> <translation id="8916476537757519021">Inkognito rejimidagi quyi freym: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> (<ph name="GIVEN_NAME" />)</translation> +<translation id="8922624386829239660">Ekranni sichqoncha chekkaga yaqinlashganda surish</translation> <translation id="8923880975836399332">Toʻq zangori</translation> <translation id="8925458182817574960">&Sozlamalar</translation> <translation id="8926389886865778422">Qayta so‘ralmasin</translation> @@ -7003,6 +7022,7 @@ <translation id="9009708085379296446">Bu sahifa oʻzgartirilsinmi?</translation> <translation id="9011163749350026987">Doim ikonka ko‘rsatilsin</translation> <translation id="9011393886518328654">Reliz izohlari</translation> +<translation id="9012122671773859802">Ekranni sichqoncha harakatlanganda surish</translation> <translation id="9013037634206938463">Linuxni oʻrnatish uchun <ph name="INSTALL_SIZE" /> boʻsh joy zarur. Boʻsh joyni koʻpaytirish uchun qurilma xotirasidan fayllarni oʻchiring.</translation> <translation id="9013707997379828817">Adminsitrator bu qurilmani rejadagi versiyaga qaytardi. Qurilma qayta ishga tushishidan oldin kerakli fayllarni saqlab qo‘ying. Bu qurilmadagi barcha ma’lumotlar tozalanadi.</translation> <translation id="901668144954885282">Google Drive omboriga zaxiralash</translation> @@ -7047,6 +7067,7 @@ <translation id="9052404922357793350">Bloklanaversin</translation> <translation id="9053563360605707198">Ikki tarafiga chop etish</translation> <translation id="9053893665344928494">Tanlovim eslab qolinsin</translation> +<translation id="9055278955535611574">Asistentdan “Ok Google” deb aytib foydalaning</translation> <translation id="9055636786322918818">RC4 shifrlash usulidan majburiy foydalanish. RC4 shifrlari himoyasizroq, shuning uchun bu usulni tanlash xavfliroq bo‘lishi mumkin.</translation> <translation id="9056810968620647706">Hech narsa topilmadi.</translation> <translation id="9057354806206861646">Jadvalni yangilash</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 5f980a3..067ba28 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -2968,7 +2968,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> đang chia sẻ một cửa sổ.</translation> <translation id="4364830672918311045">Hiển thị thông báo</translation> <translation id="4366138410738374926">Đã bắt đầu in</translation> -<translation id="437004882363131692">Nhận các mẹo, ưu đãi và thông tin cập nhật về <ph name="DEVICE_TYPE" />, cũng như chia sẻ ý kiến phản hồi. Bạn có thể hủy đăng ký bất kỳ lúc nào.</translation> <translation id="4370425812909262207">Đã ẩn các giỏ hàng. Các giỏ hàng sẽ xuất hiện trở lại khi bạn thay đổi.</translation> <translation id="4370975561335139969">Email và mật khẩu bạn nhập không khớp</translation> <translation id="4374831787438678295">Trình cài đặt Linux</translation> @@ -5527,6 +5526,7 @@ <translation id="7374376573160927383">Quản lý các thiết bị USB</translation> <translation id="7375235221357833624">{0,plural, =1{Cập nhật thiết bị trong vòng một giờ}other{Cập nhật thiết bị trong vòng # giờ}}</translation> <translation id="7376553024552204454">Đánh dấu con trỏ chuột khi đang di chuyển</translation> +<translation id="737728204345822099">Khóa bảo mật có thể lưu giữ bản ghi lượt truy cập của bạn vào trang web này.</translation> <translation id="7377451353532943397">Tiếp tục chặn quyền sử dụng cảm biến</translation> <translation id="7378611153938412599">Mật khẩu yếu thường dễ đoán. Hãy nhớ tạo mật khẩu mạnh. <ph name="BEGIN_LINK" />Xem các mẹo bảo mật khác.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Mở cửa hàng Chrome trực tuyến</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 546edae4..d6cbe8c 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -2963,7 +2963,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> 正在共享窗口。</translation> <translation id="4364830672918311045">显示通知</translation> <translation id="4366138410738374926">已开始打印</translation> -<translation id="437004882363131692">接收 <ph name="DEVICE_TYPE" /> 相关提示、优惠和动态,并分享反馈。可随时退订。</translation> <translation id="4370425812909262207">购物车已隐藏。当您做出更改时,它们会再次现身。</translation> <translation id="4370975561335139969">您输入的电子邮件地址和密码不匹配。</translation> <translation id="4374831787438678295">Linux 安装程序</translation> @@ -5522,6 +5521,7 @@ <translation id="7374376573160927383">管理 USB 设备</translation> <translation id="7375235221357833624">{0,plural, =1{请在 1 小时内更新此设备}other{请在 # 小时内更新此设备}}</translation> <translation id="7376553024552204454">在移动鼠标光标时突出显示光标</translation> +<translation id="737728204345822099">您对该网站的访问记录可能会保留在安全密钥上。</translation> <translation id="7377451353532943397">继续禁止使用传感器</translation> <translation id="7378611153938412599">安全系数低的密码容易被人猜到。请务必设置安全系数高的密码。<ph name="BEGIN_LINK" />查看更多安全提示<ph name="END_LINK" />。</translation> <translation id="73786666777299047">打开 Chrome 网上应用店</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 441dd93d..7e85d9a4 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">存取您的藍牙和序列裝置</translation> <translation id="114036956334641753">音訊和字幕</translation> <translation id="1140746652461896221">封鎖您瀏覽的任何網頁內容</translation> +<translation id="1141953877381847186">允許 Google 助理使用畫面上的資訊提供快速解答,例如翻譯、定義、單位轉換等等。 + <ph name="BR" /> + <ph name="BEGIN_BOLD" />注意事項:<ph name="END_BOLD" />之後可隨時在 Google 助理設定的「相關資訊」中變更設定。</translation> <translation id="1143142264369994168">憑證簽署者</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome 在您的電腦上找不到有害軟件 • 上次檢查時間:1 分鐘前}other{Chrome 在您的電腦上找不到有害軟件 • 上次檢查時間:{NUM_MINS} 分鐘前}}</translation> <translation id="1145593918056169051">打印機已停止運作</translation> @@ -1435,7 +1438,9 @@ <translation id="2594999711683503743">搜尋 Google 或輸入網址</translation> <translation id="2602501489742255173">向上滑動即可開始</translation> <translation id="2603115962224169880">清理電腦</translation> +<translation id="2603355571917519942">現在可以使用 Voice Match 了</translation> <translation id="2603463522847370204">在無痕式視窗中開啟(&I)</translation> +<translation id="2604138917550693049">使用 Google 智慧鏡頭搜尋圖片</translation> <translation id="2604255671529671813">網絡連線錯誤</translation> <translation id="2606246518223360146">連結資料</translation> <translation id="2606454609872547359">否,不啟動 ChromeVox 並繼續操作</translation> @@ -1778,6 +1783,7 @@ <translation id="2963151496262057773">下列外掛程式無回應:<ph name="PLUGIN_NAME" /> 您要中止嗎?</translation> <translation id="2964193600955408481">停用 WiFi</translation> <translation id="2964245677645334031">「咫尺共享」分享設定</translation> +<translation id="2966216232069818096">讓 Google 助理使用畫面上的資訊提供協助</translation> <translation id="2966937470348689686">管理 Android 偏好設定</translation> <translation id="2972581237482394796">重做(&R)</translation> <translation id="2973324205039581528">將單一網站靜音</translation> @@ -1874,6 +1880,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">這個分頁正在使用您的相機或麥克風。</translation> <translation id="3083193146044397360">已暫時封鎖相關權限以保障您的安全</translation> +<translation id="3083899879156272923">以滑鼠游標為中心移動畫面</translation> <translation id="3084548735795614657">拖曳即可安裝</translation> <translation id="3084771660770137092">Chrome 記憶體不足或其他某些原因導致網頁處理程序終止。如要繼續執行,請重新載入或前往其他網頁。</translation> <translation id="3084958266922136097">停用螢幕保護程式</translation> @@ -2369,6 +2376,9 @@ <translation id="3654045516529121250">讀取您的協助工具設定</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{應用程式可永久存取 1 個檔案。}other{應用程式可永久存取 # 個檔案。}}</translation> <translation id="3658871634334445293">TrackPoint 加速</translation> +<translation id="3659830472545192450">Voice Match 可協助 Google 助理在 Chromebook 上辨識你的聲音,區分你和其他人。 + <ph name="BR" /> + <ph name="BEGIN_BOLD" />注意事項:<ph name="END_BOLD" />如果有人聲音與你相似或擁有你的聲音錄音檔,或許也能存取你的個人化搜尋結果。之後如需移除 Voice Match 權限,只要前往 Google 助理設定頁面關閉 Voice Match 功能即可。</translation> <translation id="3660234220361471169">不受信任</translation> <translation id="3664511988987167893">擴充程式圖示</translation> <translation id="3665589677786828986">Chrome 偵測到另一個程式破壞了部分設定,並且將這些設定重設為原始預設值。</translation> @@ -2977,7 +2987,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> 正在共用視窗。</translation> <translation id="4364830672918311045">顯示通知</translation> <translation id="4366138410738374926">列印已開始</translation> -<translation id="437004882363131692">取得 <ph name="DEVICE_TYPE" /> 提示、優惠和最新資訊,並分享意見。您可隨時取消訂閱。</translation> <translation id="4370425812909262207">已隱藏購物車。當您作出變更時,購物車就會重新顯示。</translation> <translation id="4370975561335139969">您所輸入的電郵與密碼不符</translation> <translation id="4374831787438678295">Linux 安裝程式</translation> @@ -3557,6 +3566,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">您所選取的語言不支援拼字檢查功能</translation> <translation id="5052499409147950210">編輯網站</translation> +<translation id="5053962746715621840">使用 Google 智慧鏡頭搜尋圖片</translation> <translation id="5057110919553308744">當您點擊擴充程式時</translation> <translation id="5057403786441168405">管理已登入的帳戶。視乎權限而定,Chrome 和 Google Play 的網站、應用程式和擴充程式可能使用這些帳戶自訂您的體驗。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="5059241099014281248">限制登入</translation> @@ -4041,6 +4051,9 @@ <translation id="5610038042047936818">切換至相機模式</translation> <translation id="561030196642865721">此網站允許第三方 Cookie</translation> <translation id="5612734644261457353">很抱歉,系統仍然無法驗證您的密碼。注意:如果您最近修改了密碼,新密碼會在您登出後立即生效,目前請在這裡使用舊密碼。</translation> +<translation id="561308544008485315">Voice Match 可協助 Google 助理在 Chromebook 上辨識你的聲音,區分你和其他人。為了節省電力,系統只在裝置接上電源時才會啟動「Ok Google」。如要進行變更,請前往「設定」。 + <ph name="BR" /> + <ph name="BEGIN_BOLD" />注意事項:<ph name="END_BOLD" />如果有人聲音與你相似或擁有你的聲音錄音檔,或許也能存取你的個人化搜尋結果。之後如需移除 Voice Match 權限,只要前往 Google 助理設定頁面關閉 Voice Match 功能即可。</translation> <translation id="5614190747811328134">使用者通知</translation> <translation id="5614553682702429503">要儲存密碼嗎?</translation> <translation id="5616726534702877126">預留空間大小</translation> @@ -5071,6 +5084,7 @@ <translation id="6824584962142919697">檢查元素 (&I)</translation> <translation id="6825184156888454064">按名稱排序</translation> <translation id="6826872289184051766">透過 USB 驗證</translation> +<translation id="6827604573767207488">你似乎已在其他裝置上設定個人化的 Google 助理。開啟下列設定即可運用 Google 助理的更多功能。</translation> <translation id="6828153365543658583">只允許下列使用者登入:</translation> <translation id="6828182567531805778">如要同步處理資料,請輸入您的密碼短語</translation> <translation id="682871081149631693">快速修正</translation> @@ -5506,6 +5520,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> 已停用 ADB 偵錯。重新啟動 <ph name="DEVICE_TYPE" /> 後,您將無法載入應用程式。</translation> <translation id="7328867076235380839">無效的組合</translation> <translation id="7329154610228416156">由於設定使用的網址 (<ph name="BLOCKED_URL" />) 不安全,導致登入失敗。請與您的管理員聯絡。</translation> +<translation id="7329932885428707942">這可能會導致行動網路連線短暫中斷。</translation> <translation id="7332053360324989309">專用工作程式:<ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">啟用固定的放大鏡</translation> <translation id="7335974957018254119">使用拼字檢查的語言:</translation> @@ -5549,6 +5564,7 @@ <translation id="7374376573160927383">管理 USB 裝置</translation> <translation id="7375235221357833624">{0,plural, =1{請在 1 小時內更新裝置}other{請在 # 小時內更新裝置}}</translation> <translation id="7376553024552204454">移動滑鼠時突顯滑鼠游標</translation> +<translation id="737728204345822099">您的安全密鑰可能會保留您瀏覽此網站的記錄。</translation> <translation id="7377451353532943397">繼續封鎖感應器存取權</translation> <translation id="7378611153938412599">安全性弱的密碼很容易被猜到。請務必設定安全性強的密碼。<ph name="BEGIN_LINK" />查看更多安全提示。<ph name="END_LINK" /></translation> <translation id="73786666777299047">開啟 Chrome 網上應用程式商店</translation> @@ -6176,6 +6192,7 @@ <translation id="8059417245945632445">檢查裝置 (&I)</translation> <translation id="8059456211585183827">冇可以儲存嘅打印機。</translation> <translation id="8061091456562007989">還原設定</translation> +<translation id="8061991877177392872">你似乎已在其他裝置上設定 Google 助理的 Voice Match 功能。系統已使用先前的錄音檔在這部裝置上建立語音模型。</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 張紙}other{{COUNT} 張紙}}</translation> <translation id="8062879968880283306">請使用裝置相機掃瞄 QR 碼,或輸入流動網絡供應商提供的啟動碼。</translation> <translation id="8063235345342641131">預設綠色圖片</translation> @@ -6446,6 +6463,7 @@ <translation id="8379991678458444070">將此分頁加入書籤,方便您快速返回此處</translation> <translation id="8382913212082956454">複製電郵地址(&E)</translation> <translation id="8386091599636877289">找不到政策。</translation> +<translation id="8386819192691131213">允許 Google 助理使用畫面上的資訊提供快速解答,例如翻譯、定義、單位轉換等等</translation> <translation id="8386903983509584791">掃瞄完成</translation> <translation id="8387361103813440603">不允許查看您的位置</translation> <translation id="8389264703141926739">封鎖通知</translation> @@ -6927,6 +6945,7 @@ <translation id="8915370057835397490">正在載入建議</translation> <translation id="8916476537757519021">無痕模式子頁框:<ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />的 <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">在滑鼠輕觸畫面邊緣時移動畫面</translation> <translation id="8923880975836399332">深藍綠色</translation> <translation id="8925458182817574960">設定(&S)</translation> <translation id="8926389886865778422">不要再問我</translation> @@ -7005,6 +7024,7 @@ <translation id="9009708085379296446">您要變更此頁面嗎?</translation> <translation id="9011163749350026987">一律顯示圖示</translation> <translation id="9011393886518328654">版本說明</translation> +<translation id="9012122671773859802">跟著滑鼠游標持續移動畫面</translation> <translation id="9013037634206938463">安裝 Linux 需要 <ph name="INSTALL_SIZE" /> 的可用空間。如要增加可用空間,請刪除裝置內的檔案。</translation> <translation id="9013707997379828817">您的管理員已回復此裝置。請儲存重要檔案,然後重新啟動。系統將刪除裝置上的所有資料。</translation> <translation id="901668144954885282">備份至「Google 雲端硬碟」</translation> @@ -7049,6 +7069,7 @@ <translation id="9052404922357793350">繼續封鎖</translation> <translation id="9053563360605707198">雙面列印</translation> <translation id="9053893665344928494">記住我的選擇</translation> +<translation id="9055278955535611574">說出「Ok Google」即可存取 Google 助理</translation> <translation id="9055636786322918818">強制執行 RC4 加密。由於 RC4 加密不安全,因此使用此選項會提高風險。</translation> <translation id="9056810968620647706">找不到相符的項目。</translation> <translation id="9057354806206861646">更新時間表</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index a0be940..80bb09c6 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">存取你的藍牙和序列裝置</translation> <translation id="114036956334641753">音訊和字幕</translation> <translation id="1140746652461896221">封鎖你造訪的任何網頁所含內容</translation> +<translation id="1141953877381847186">允許 Google 助理使用畫面上的資訊提供快速解答,例如翻譯、定義、單位轉換等等。 + <ph name="BR" /> + <ph name="BEGIN_BOLD" />注意事項:<ph name="END_BOLD" />之後可隨時在 Google 助理設定的「相關資訊」中變更設定。</translation> <translation id="1143142264369994168">憑證簽署者</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{Chrome 並未在電腦上發現任何有害軟體 • 上次檢查時間:1 分鐘前}other{Chrome 並未在電腦上發現任何有害軟體 • 上次檢查時間:{NUM_MINS} 分鐘前}}</translation> <translation id="1145593918056169051">印表機已停止運作</translation> @@ -1431,7 +1434,9 @@ <translation id="2594999711683503743">搜尋 Google 或輸入網址</translation> <translation id="2602501489742255173">向上滑動即可開始使用</translation> <translation id="2603115962224169880">清理電腦</translation> +<translation id="2603355571917519942">現在可以使用 Voice Match 了</translation> <translation id="2603463522847370204">在無痕式視窗中開啟(&I)</translation> +<translation id="2604138917550693049">使用 Google 智慧鏡頭搜尋圖片</translation> <translation id="2604255671529671813">網路連線錯誤</translation> <translation id="2606246518223360146">連結資料</translation> <translation id="2606454609872547359">否,不啟動 ChromeVox 並繼續操作</translation> @@ -1773,6 +1778,7 @@ <translation id="2963151496262057773">下列外掛程式無回應:<ph name="PLUGIN_NAME" /> 您要停止執行嗎?</translation> <translation id="2964193600955408481">停用 WiFi</translation> <translation id="2964245677645334031">鄰近分享瀏覽權限</translation> +<translation id="2966216232069818096">讓 Google 助理使用畫面上的資訊提供協助</translation> <translation id="2966937470348689686">管理 Android 偏好設定</translation> <translation id="2972581237482394796">重做(&R)</translation> <translation id="2973324205039581528">關閉網站音訊</translation> @@ -1868,6 +1874,7 @@ <translation id="308268297242056490">URI</translation> <translation id="3082780749197361769">這個分頁正在使用你的相機和/或麥克風。</translation> <translation id="3083193146044397360">已暫時封鎖權限,保護你的安全</translation> +<translation id="3083899879156272923">以滑鼠游標為中心移動畫面</translation> <translation id="3084548735795614657">拖曳即可安裝</translation> <translation id="3084771660770137092">Chrome 記憶體不足或其他某些原因導致網頁處理程序終止。如要繼續執行,請重新載入或前往其他網頁。</translation> <translation id="3084958266922136097">停用螢幕保護程式</translation> @@ -2361,6 +2368,9 @@ <translation id="3654045516529121250">讀取你的無障礙設定</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{應用程式可永久存取 1 個檔案。}other{應用程式可永久存取 # 個檔案。}}</translation> <translation id="3658871634334445293">TrackPoint 加速</translation> +<translation id="3659830472545192450">Voice Match 可協助 Google 助理在 Chromebook 上辨識你的聲音,區分你和其他人。 + <ph name="BR" /> + <ph name="BEGIN_BOLD" />注意事項:<ph name="END_BOLD" />如果有人聲音與你相似或擁有你的聲音錄音檔,或許也能存取你的個人化搜尋結果。之後如需移除 Voice Match 權限,只要前往 Google 助理設定頁面關閉 Voice Match 功能即可。</translation> <translation id="3660234220361471169">不受信任</translation> <translation id="3664511988987167893">擴充功能圖示</translation> <translation id="3665589677786828986">Chrome 偵測到另一個程式竄改了部分瀏覽器設定,現已將這些設定重設為原始預設值。</translation> @@ -2966,7 +2976,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> 正在共用視窗。</translation> <translation id="4364830672918311045">顯示通知</translation> <translation id="4366138410738374926">已開始列印</translation> -<translation id="437004882363131692">你可以取得 <ph name="DEVICE_TYPE" />的實用提示、優惠資訊與最新消息,並提供意見回饋。你隨時可以取消訂閱。</translation> <translation id="4370425812909262207">已隱藏購物車。變更設定即可讓購物車再次出現。</translation> <translation id="4370975561335139969">您所輸入的電子郵件和密碼不相符</translation> <translation id="4374831787438678295">Linux 安裝程式</translation> @@ -3543,6 +3552,7 @@ <translation id="5050330054928994520">TTS</translation> <translation id="5051836348807686060">你選取的語言不支援拼字檢查功能</translation> <translation id="5052499409147950210">編輯網站</translation> +<translation id="5053962746715621840">使用 Google 智慧鏡頭搜尋圖片</translation> <translation id="5057110919553308744">當你點選擴充功能時</translation> <translation id="5057403786441168405">管理已登入的帳戶。Chrome 和 Google Play 的網站、應用程式和擴充功能可能會使用這些帳戶為你提供個人化的使用體驗 (依權限而定)。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="5059241099014281248">限制登入</translation> @@ -4025,6 +4035,9 @@ <translation id="5610038042047936818">切換至相機模式</translation> <translation id="561030196642865721">這個網站允許第三方 Cookie</translation> <translation id="5612734644261457353">很抱歉,系統仍然無法驗證你的密碼。注意:如果你的密碼最近有所異動,新密碼會在你登出後立即生效,目前請在這裡使用舊密碼。</translation> +<translation id="561308544008485315">Voice Match 可協助 Google 助理在 Chromebook 上辨識你的聲音,區分你和其他人。為了節省電力,系統只在裝置接上電源時才會啟動「Ok Google」。如要進行變更,請前往「設定」。 + <ph name="BR" /> + <ph name="BEGIN_BOLD" />注意事項:<ph name="END_BOLD" />如果有人聲音與你相似或擁有你的聲音錄音檔,或許也能存取你的個人化搜尋結果。之後如需移除 Voice Match 權限,只要前往 Google 助理設定頁面關閉 Voice Match 功能即可。</translation> <translation id="5614190747811328134">使用者通知</translation> <translation id="5614553682702429503">要儲存密碼嗎?</translation> <translation id="5616726534702877126">預留大小</translation> @@ -5048,6 +5061,7 @@ <translation id="6824584962142919697">檢查元素 (&I)</translation> <translation id="6825184156888454064">依名稱排序</translation> <translation id="6826872289184051766">透過 USB 進行驗證</translation> +<translation id="6827604573767207488">你似乎已在其他裝置上設定個人化的 Google 助理。開啟下列設定即可運用 Google 助理的更多功能。</translation> <translation id="6828153365543658583">只允許下列使用者登入:</translation> <translation id="6828182567531805778">如果要同步處理資料,請輸入你的通關密語</translation> <translation id="682871081149631693">QuickFix</translation> @@ -5482,6 +5496,7 @@ <translation id="7327989755579928735"><ph name="MANAGER" /> 已停用 ADB 偵錯。重新啟動 <ph name="DEVICE_TYPE" /> 後,你將無法側載應用程式。</translation> <translation id="7328867076235380839">按鍵組合無效</translation> <translation id="7329154610228416156">由於設定使用的網址 (<ph name="BLOCKED_URL" />) 不安全,導致登入失敗。請與您的管理員聯絡。</translation> +<translation id="7329932885428707942">這可能會導致行動網路連線短暫中斷。</translation> <translation id="7332053360324989309">專有 Worker:<ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">啟用停駐放大鏡</translation> <translation id="7335974957018254119">使用拼字檢查的語言:</translation> @@ -5525,6 +5540,7 @@ <translation id="7374376573160927383">管理 USB 裝置</translation> <translation id="7375235221357833624">{0,plural, =1{請在 1 小時內更新裝置}other{請在 # 小時內更新裝置}}</translation> <translation id="7376553024552204454">滑鼠游標移動時醒目顯示</translation> +<translation id="737728204345822099">安全金鑰可能保留你造訪這個網站的記錄。</translation> <translation id="7377451353532943397">繼續禁止存取感應器</translation> <translation id="7378611153938412599">低強度密碼很容易讓有心人士猜中,請務必建立高強度密碼。<ph name="BEGIN_LINK" />查看更多安全性提示。<ph name="END_LINK" /></translation> <translation id="73786666777299047">開啟 Chrome 線上應用程式商店</translation> @@ -6151,6 +6167,7 @@ <translation id="8059417245945632445">檢查裝置 (&I)</translation> <translation id="8059456211585183827">沒有可供儲存的印表機。</translation> <translation id="8061091456562007989">還原設定</translation> +<translation id="8061991877177392872">你似乎已在其他裝置上設定 Google 助理的 Voice Match 功能。系統已使用先前的錄音檔在這部裝置上建立語音模型。</translation> <translation id="8062844841289846053">{COUNT,plural, =1{1 張紙}other{{COUNT} 張紙}}</translation> <translation id="8062879968880283306">請使用裝置相機掃描 QR 圖碼,或輸入電信業者提供的啟用代碼。</translation> <translation id="8063235345342641131">預設的綠色顯示圖片</translation> @@ -6419,6 +6436,7 @@ <translation id="8379991678458444070">將此分頁加入書籤,日後便能快速開啟這個頁面</translation> <translation id="8382913212082956454">複製電子郵件地址(&E)</translation> <translation id="8386091599636877289">找不到政策。</translation> +<translation id="8386819192691131213">允許 Google 助理使用畫面上的資訊提供快速解答,例如翻譯、定義、單位轉換等等</translation> <translation id="8386903983509584791">掃描完成</translation> <translation id="8387361103813440603">不得查看你的位置資訊</translation> <translation id="8389264703141926739">封鎖通知</translation> @@ -6896,6 +6914,7 @@ <translation id="8915370057835397490">正在載入建議</translation> <translation id="8916476537757519021">無痕模式子頁框:<ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />的 <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">在滑鼠輕觸畫面邊緣時移動畫面</translation> <translation id="8923880975836399332">深藍綠色</translation> <translation id="8925458182817574960">設定(&S)</translation> <translation id="8926389886865778422">不再詢問這個問題</translation> @@ -6973,6 +6992,7 @@ <translation id="9009708085379296446">你要變更這個頁面嗎?</translation> <translation id="9011163749350026987">一律顯示圖示</translation> <translation id="9011393886518328654">版本資訊</translation> +<translation id="9012122671773859802">跟著滑鼠游標持續移動畫面</translation> <translation id="9013037634206938463">安裝 Linux 需要 <ph name="INSTALL_SIZE" /> 的可用空間。如要增加可用空間,請刪除裝置中的檔案。</translation> <translation id="9013707997379828817">你的管理員已復原這個裝置。請儲存重要檔案後再重新啟動。重新啟動後,裝置上的資料將全數刪除。</translation> <translation id="901668144954885282">備份到 Google 雲端硬碟</translation> @@ -7017,6 +7037,7 @@ <translation id="9052404922357793350">繼續封鎖</translation> <translation id="9053563360605707198">雙面列印</translation> <translation id="9053893665344928494">記住我的選擇</translation> +<translation id="9055278955535611574">說出「Ok Google」即可存取 Google 助理</translation> <translation id="9055636786322918818">強制執行 RC4 加密。由於 RC4 加密不安全,使用這個加密選項會提高風險。</translation> <translation id="9056810968620647706">找不到相符項目。</translation> <translation id="9057354806206861646">更新時間表</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 3244b3c..cf3df788 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -127,6 +127,9 @@ <translation id="1140351953533677694">Finyelela amadivayisi wakho we-Bluetooth nawomkhiqizo</translation> <translation id="114036956334641753">Umsindo namagama-ncazo</translation> <translation id="1140746652461896221">Vimbela okuqukethwe kunoma iliphi ikhasi olivakashelayo</translation> +<translation id="1141953877381847186">Vumela Umsizi ukuthi asebenzise ulwazi kusikrini ukuhlinzeka ngezimpendulo ezisheshayo njengokuhumusha, incazelo, ukuguqulwa kweyunithi nokuningi. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Khumbula:<ph name="END_BOLD" /> Ungakwazi ukushintsha lokhu ngokuhamba kwesikhathi kokuthi Amasethingi Womsizi we-Google > Ulwazi oluhambisanayo.</translation> <translation id="1143142264369994168">Isisayini sesitifiketi</translation> <translation id="1143816224540441191">{NUM_MINS,plural, =1{I-Chrome ayitholanga isofthiwe enobungozi kukhompuyutha yakho • Ihlolwe eminithini eli-1 eledlule}one{I-Chrome ayitholanga isofthiwe enobungozi kukhompuyutha yakho • Ihlolwe emaminithini angu-{NUM_MINS} edlule}other{I-Chrome ayitholanga isofthiwe enobungozi kukhompuyutha yakho • Ihlolwe emaminithini angu-{NUM_MINS} edlule}}</translation> <translation id="1145593918056169051">Iphrinta imile</translation> @@ -1435,7 +1438,9 @@ <translation id="2594999711683503743">Sesha i-Google noma thayipha i-URL</translation> <translation id="2602501489742255173">Swayiphela phezulu ukuze uqalise</translation> <translation id="2603115962224169880">Hlanza ikhompuyutha</translation> +<translation id="2603355571917519942">I-Voice Match seyilungile</translation> <translation id="2603463522847370204">Vula &Iwindi le-incognito</translation> +<translation id="2604138917550693049">Sesha isithombe ngokuthi Ilensi ye-Google</translation> <translation id="2604255671529671813">Iphutha lokuxhuma inethiwekhi</translation> <translation id="2606246518223360146">Xhumanisa idatha</translation> <translation id="2606454609872547359">Cha, qhubeka ngaphandle kwe-ChromeVox</translation> @@ -1778,6 +1783,7 @@ <translation id="2963151496262057773">I-plugin elandelayo ayiphenduli: i-<ph name="PLUGIN_NAME" />Ungathanda ukuyimisa?</translation> <translation id="2964193600955408481">Khubaza i-Wi-Fi</translation> <translation id="2964245677645334031">Ukubonakala Kokuthumela Eduze</translation> +<translation id="2966216232069818096">Vumela Umsizi wakho ukuthi asebenzise ulwazi olukusikrini sakho ukusiza</translation> <translation id="2966937470348689686">Lawula izintandokazi ze-Android</translation> <translation id="2972581237482394796">&Yenza futhi</translation> <translation id="2973324205039581528">Thulisa isayithi</translation> @@ -1874,6 +1880,7 @@ <translation id="308268297242056490">I-URI</translation> <translation id="3082780749197361769">Le thebhu isebenzisa ikhamela yakho noma imakrofoni.</translation> <translation id="3083193146044397360">Kuvinjelwe okwesikhashana ukuvikela ukuphepha kwakho</translation> +<translation id="3083899879156272923">Hambisa isikrini ugcine igundane maphakathi nesikrini</translation> <translation id="3084548735795614657">Dedela ukuze ufake</translation> <translation id="3084771660770137092">Kungenzeka i-Chrome iphelelwe yimemori noma inqubo yekhasi lewebhu iye yanqanyulwa ngenxa yesinye isizathu esithile. Ukuze uqhubeke, phinda ulayishe noma hamba kwelinye ikhasi.</translation> <translation id="3084958266922136097">Khubaza isilondolozi sesikrini</translation> @@ -2369,6 +2376,9 @@ <translation id="3654045516529121250">Funda izilungiselelo zokufinyelela kwakho</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Inokufinyelela okungunaphakade kufayela elilodwa.}one{Inokufinyelela okungunaphakade kumafayela angu-#.}other{Inokufinyelela okungunaphakade kumafayela angu-#.}}</translation> <translation id="3658871634334445293">Isisheshisi se-TrackPoint</translation> +<translation id="3659830472545192450">I-Voice Match isiza Umsizi wakho we-Google ukuzwa izwi lakho ku-Chromebook yakho nokukuhlukanisa kusuka kwabanye. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Khumbula:<ph name="END_BOLD" /> Izwi elifanayo noma ukurekhoda kungase kukwazi ukufinyelela futhi imiphumela yakho yomuntu. Ungasusa imvume ye-Voice Match ngemuva kwesikhathi ngokuyivala kuzilungiselelo zomsizi.</translation> <translation id="3660234220361471169">Okungathenjiwe</translation> <translation id="3664511988987167893">Isithonjana sesandiso</translation> <translation id="3665589677786828986">I-Chrome ithole ukuthi ezinye izilungiselelo zakho zonakaliswe olunye uhlelo bese yazisetha kabusha zaba okumisiwe kwasekuqaleni.</translation> @@ -2976,7 +2986,6 @@ <translation id="4364567974334641491"><ph name="APP_NAME" /> yabelana ngewindi.</translation> <translation id="4364830672918311045">Bonisa izaziso</translation> <translation id="4366138410738374926">Ukuphrinta kuqalile</translation> -<translation id="437004882363131692">Thola amathiphu e-<ph name="DEVICE_TYPE" />, okunikezwayo nezibuyekezo, kanye nokwabelana ngempendulo Zikhiphe ohlwini noma nini.</translation> <translation id="4370425812909262207">Amakalishi afihliwe. Azophinda avele lapho wenza izinguquko.</translation> <translation id="4370975561335139969">I-imeyili nephasiwedi oyifakile ayifani</translation> <translation id="4374831787438678295">Isifaki se-Linux</translation> @@ -3556,6 +3565,7 @@ <translation id="5050330054928994520">I-TTS</translation> <translation id="5051836348807686060">Ukuhlolwa kokupeleta akusekelwe kuzilimi ozikhethile</translation> <translation id="5052499409147950210">Hlela isayithi</translation> +<translation id="5053962746715621840">Sesha isithombe ngokuthi Ilensi ye-Google</translation> <translation id="5057110919553308744">Uma uchofoza isandiso</translation> <translation id="5057403786441168405">Phatha ama-akhawunti akho angene ngemvume. Amawebhusayithi, izinhlelo zokusebenza, nezandiso ku-Chrome naku-Google Play kungasebenzisa lawa ma-akhawunti ukuze kwenze kube ngendlela oyifisayo umuzwa wakho, ngokuya ngezimvume zakho. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Khawulela ukungena ngemvume</translation> @@ -4041,6 +4051,9 @@ <translation id="5610038042047936818">Shintshela kumodi yekhamera</translation> <translation id="561030196642865721">Amakhukhi enkampani yangaphandle avunyelwe kuleli sayithi</translation> <translation id="5612734644261457353">Uxolo, iphasiwedi yakho namanje ayikwazanga ukuqinisekiswa. Yazi: Uma uguqule iphasiwedi kamuva nje, iphasiwedi yakho entsha izosetshenziswa ngemuva kokuthi uphume ngemvume, sicela usebenzise iphasiwedi endala lapha.</translation> +<translation id="561308544008485315">I-Voice Match isiza Umsizi wakho we-Google ukuzwa izwi lakho ku-Chromebook yakho nokukuhlukanisa kusuka kwabanye. Ukuze wonge ibhethri, i-"Ok Google" ivulwa lapho idivayisi yakho ixhunywe kumthombo wamandla. Ukuze wenze izinguquko, hamba kuzilungiselelo. + <ph name="BR" /> + <ph name="BEGIN_BOLD" />Khumbula:<ph name="END_BOLD" /> Izwi elifanayo noma ukurekhoda kungase kukwazi ukufinyelela futhi imiphumela yakho yomuntu. Ungasusa imvume ye-Voice Match ngemuva kwesikhathi ngokuyivala kuzilungiselelo zomsizi.</translation> <translation id="5614190747811328134">Isaziso somsebenzisi</translation> <translation id="5614553682702429503">Londoloza iphasiwedi?</translation> <translation id="5616726534702877126">Gcina usayizi</translation> @@ -5072,6 +5085,7 @@ <translation id="6824584962142919697">&Hlola izinto</translation> <translation id="6825184156888454064">Hlunga ngegama</translation> <translation id="6826872289184051766">Qinisekisa nge-USB</translation> +<translation id="6827604573767207488">Kubonakala sengathi ususethe kakade Umsizi owenze waba ngowakho kudivayisi ehlukile. Thola okuningi nakakhulu Kumsizi wakho ngokuvula isethingi elandelayo.</translation> <translation id="6828153365543658583">Khawulela ukungena ngemvume kubasebenzisi abalandelayo:</translation> <translation id="6828182567531805778">Faka umushwana wakho wokungena ukuze uvumelanise idatha yakho</translation> <translation id="682871081149631693">I-QuickFix</translation> @@ -5507,6 +5521,7 @@ <translation id="7327989755579928735">I-<ph name="MANAGER" /> ikhubaze ukulungisa amaphutha e-ADB. Ngemva kokuqala kabusha i-<ph name="DEVICE_TYPE" /> yakho, ngeke ukwazi ukulayisha eceleni izinhlelo zakho zokusebenza.</translation> <translation id="7328867076235380839">Inhlanganisela engavumelekile</translation> <translation id="7329154610228416156">Ukungena ngemvume kwehlulekile ngoba kwalungiswa ukusebenzisa i-URL engaphephile (<ph name="BLOCKED_URL" />). Sicela uxhumane nomlawuli wakho.</translation> +<translation id="7329932885428707942">Loku kungase kubangele ukunqamuka kwenethiwekhi yeselula kwesikhashana.</translation> <translation id="7332053360324989309">Isisebenzi Ezikhuthele: <ph name="SCRIPT_URL" /></translation> <translation id="7334274148831027933">Nika amandla isikhulisi esidokhiwe</translation> <translation id="7335974957018254119">Sebenzisela ukuhlola isipele ku-</translation> @@ -5550,6 +5565,7 @@ <translation id="7374376573160927383">Phatha amadivayisi e-USB</translation> <translation id="7375235221357833624">{0,plural, =1{Buyekeza idivayisi phakathi nehora}one{Buyekeza idivayisi phakathi namahora angu-#}other{Buyekeza idivayisi phakathi namahora angu-#}}</translation> <translation id="7376553024552204454">Gqamisa isikhombisi segundane uma sinyakaza</translation> +<translation id="737728204345822099">Irekhodi lokuvakasha kwakho kule sayithi lingase ligcinwe kukhiye wakho wokuqinisekisa ubunikazi.</translation> <translation id="7377451353532943397">Qhubeka uvimbele ukufinyelela kwenzwa</translation> <translation id="7378611153938412599">Amaphasiwedi angaqinile aqageleka kalula. Qiniseka ukuthi udala iphasiwedi eqinile. <ph name="BEGIN_LINK" />Bona amathiphu amaningi okuvikeleka.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Vula isitolo sewebhu se-Chrome</translation> @@ -6176,6 +6192,7 @@ <translation id="8059417245945632445">&Hlola amadivayisi</translation> <translation id="8059456211585183827">Awekho amaphrinta atholakalayo ukuze alondolozwe.</translation> <translation id="8061091456562007989">Yibuyisele emuva</translation> +<translation id="8061991877177392872">Kubonakala sengathi usuyisethile kakade i-Voice Match ngomsizi wakho kwenye idivayisi. Lokhu kurekhodwa kwangaphambilini kade kusetshenziselwa ukwenza imodeli yezwi kule divayisi.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{Ishidi lephepha eli-1}one{amashidi ephepha a-{COUNT}}other{amashidi wephepha a-{COUNT}}}</translation> <translation id="8062879968880283306">Skena ikhodi ye-QR usebenzisa ikhamera yedivayisi noma ufake ikhodi yokusebenzisa ehlinzekwa yinkampani yenethiwekhi yakho.</translation> <translation id="8063235345342641131">Isithombe esizenzakalelayo esiluhlaza</translation> @@ -6447,6 +6464,7 @@ <translation id="8379991678458444070">Buyela lapha ngokushesha ngokwenza ibhukhimakhi leli thebhu</translation> <translation id="8382913212082956454">Kopisha ikheli le-&imeyili</translation> <translation id="8386091599636877289">Inqubomgomo ayitholiwe.</translation> +<translation id="8386819192691131213">Vumela Umsizi ukuthi asebenzise ulwazi kusikrini ukuhlinzeka ngezimpendulo ezisheshayo njengokuhumusha, incazelo, ukuguqulwa kweyunithi nokuningi</translation> <translation id="8386903983509584791">Ukuskena kuphelile</translation> <translation id="8387361103813440603">Ayivumelekile ukubona indawo yakho</translation> <translation id="8389264703141926739">Vimba izaziso</translation> @@ -6930,6 +6948,7 @@ <translation id="8915370057835397490">Ilayisha isiphakamiso</translation> <translation id="8916476537757519021">I-Incognito Subframe: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> <ph name="DEVICE_TYPE" /></translation> +<translation id="8922624386829239660">Hambisa isikrini lapho igundane lithinta unqenqema lwesikrini</translation> <translation id="8923880975836399332">I-teal emnyama</translation> <translation id="8925458182817574960">Izilungiselelo</translation> <translation id="8926389886865778422">Ungaphindi ubuze futhi</translation> @@ -7008,6 +7027,7 @@ <translation id="9009708085379296446">Ingabe bewuhlose ukushintsha leli khasi?</translation> <translation id="9011163749350026987">Njalo bonisa isithonjana</translation> <translation id="9011393886518328654">Amanothi okukhishwa</translation> +<translation id="9012122671773859802">Hambisa isikrini ngokuqhubekayo lapho igundane liihamba</translation> <translation id="9013037634206938463">Kudingeka u-<ph name="INSTALL_SIZE" /> wesikhala esingenalutho ukuze ufake i-Linux. Ukukhuphula isikhala esingenalutho. susa amafayela kusuka kudivayisi yakho.</translation> <translation id="9013707997379828817">Umlawuli wakho ubuyisele emuva le divayisi. Sicela ulondoloze amafayela abalulekile, bese uqalise kabusha. Yonke idatha kudivayisi izosuswa.</translation> <translation id="901668144954885282">Yenza isipele ku-Google Drayivu</translation> @@ -7052,6 +7072,7 @@ <translation id="9052404922357793350">Qhubeka uvimbele</translation> <translation id="9053563360605707198">Phrinta kuzinhlangothi zombili</translation> <translation id="9053893665344928494">Khumbula ukukhetha kwami</translation> +<translation id="9055278955535611574">Finyelela Umsizi wakho ngokuthi "Ok Google"</translation> <translation id="9055636786322918818">Phoqelela ukubethelwa kwe-RC4. Ukusebenzisa le nketho kukhulisa ubucayi bakho, njengoba ama-chipers e-RC4 awaphephile.</translation> <translation id="9056810968620647706">Akukho ukufana okutholiwe.</translation> <translation id="9057354806206861646">Buyekeza ishejuli</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb index b9c8bfe..cf543f3 100644 --- a/chrome/app/resources/google_chrome_strings_eu.xtb +++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -257,7 +257,7 @@ <translation id="7896673875602241923">Norbaitek <ph name="ACCOUNT_EMAIL_LAST" /> gisa hasi du saioa Chrome-n ordenagailu hau erabilita. Zure informazioa bereizita izateko, sortu beste Chrome erabiltzaile bat.</translation> <translation id="7905891027772979035">Chrome-k ezin ditu egiaztatu luzapenak. Saiatu geroago.</translation> <translation id="7930071585467473040">Pasahitzak kopiatzen saiatzen ari da Google Chrome.</translation> -<translation id="7962410387636238736">Ordenagailuak ez du jasoko beste Google Chrome eguneratzerik, jada ez baita bateragarria Windows XP eta Windows Vista-rekin</translation> +<translation id="7962410387636238736">Ordenagailuak ez du jasoko Google Chrome-ren beste eguneratzerik, jada ez baita bateragarria Windows XP eta Windows Vista-rekin</translation> <translation id="8008534537613507642">Berrinstalatu Chrome</translation> <translation id="8009904340233602924">Erabili Chrome saioa hasi gabe</translation> <translation id="8013993649590906847">Irudiren batek ez badu azalpen lagungarririk, halako bat lortzen ahaleginduko da Chrome. Azalpen horiek sortzeko, irudiak Google-ri bidaltzen zaizkio.</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index e287ae0..2fbbc05 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -3746,12 +3746,12 @@ "metrics/first_web_contents_profiler.cc", "metrics/first_web_contents_profiler.h", "metrics/incognito_observer_desktop.cc", - "metrics/tab_stats_data_store.cc", - "metrics/tab_stats_data_store.h", - "metrics/tab_stats_observer.h", - "metrics/tab_stats_tracker.cc", - "metrics/tab_stats_tracker.h", - "metrics/tab_stats_tracker_delegate.h", + "metrics/tab_stats/tab_stats_data_store.cc", + "metrics/tab_stats/tab_stats_data_store.h", + "metrics/tab_stats/tab_stats_observer.h", + "metrics/tab_stats/tab_stats_tracker.cc", + "metrics/tab_stats/tab_stats_tracker.h", + "metrics/tab_stats/tab_stats_tracker_delegate.h", "metrics/usage_scenario/tab_usage_scenario_tracker.cc", "metrics/usage_scenario/tab_usage_scenario_tracker.h", "notifications/muted_notification_handler.cc", @@ -4733,8 +4733,8 @@ "metrics/jumplist_metrics_win.cc", "metrics/jumplist_metrics_win.h", "metrics/power/battery_level_provider_win.cc", - "metrics/tab_stats_tracker_delegate_win.cc", - "metrics/tab_stats_tracker_win.cc", + "metrics/tab_stats/tab_stats_tracker_delegate_win.cc", + "metrics/tab_stats/tab_stats_tracker_win.cc", "net/service_providers_win.cc", "net/service_providers_win.h", "notifications/win/notification_template_builder.cc", @@ -5034,6 +5034,7 @@ "//chrome/app_shim", "//chrome/browser/apps/app_shim", "//chrome/browser/ui/cocoa/notifications:common", + "//chrome/services/mac_notifications/public/cpp", "//chrome/services/mac_notifications/public/mojom", "//components/crash/core/app", "//components/metal_util",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index c5aca64..3f7802eb 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2604,6 +2604,9 @@ flag_descriptions::kHistoryManipulationIntervention, flag_descriptions::kHistoryManipulationInterventionDescription, kOsAll, FEATURE_VALUE_TYPE(features::kHistoryManipulationIntervention)}, + {"colr-v1-fonts", flag_descriptions::kCOLRV1FontsName, + flag_descriptions::kCOLRV1FontsDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kCOLRV1Fonts)}, #if defined(OS_ANDROID) {"contextual-search-debug", flag_descriptions::kContextualSearchDebugName, flag_descriptions::kContextualSearchDebugDescription, kOsAndroid, @@ -2654,6 +2657,9 @@ {"related-searches", flag_descriptions::kRelatedSearchesName, flag_descriptions::kRelatedSearchesDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kRelatedSearches)}, + {"related-searches-ui", flag_descriptions::kRelatedSearchesUiName, + flag_descriptions::kRelatedSearchesUiDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kRelatedSearchesUi)}, {"bento-offline", flag_descriptions::kBentoOfflineName, flag_descriptions::kBentoOfflineDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kBentoOffline)}, @@ -6457,10 +6463,6 @@ flag_descriptions::kAndroidManagedByMenuItemName, flag_descriptions::kAndroidManagedByMenuItemDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kAndroidManagedByMenuItem)}, - - {"android-multiple-display", flag_descriptions::kAndroidMultipleDisplayName, - flag_descriptions::kAndroidMultipleDisplayDescription, kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kAndroidMultipleDisplay)}, #endif // defined(OS_ANDROID) {"app-cache", flag_descriptions::kAppCacheName,
diff --git a/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.cc b/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.cc index 9d87d14b..aebb92c 100644 --- a/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.cc +++ b/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.cc
@@ -70,7 +70,7 @@ base::Base64UrlDecodePolicy::IGNORE_PADDING, &response)) { LOG(ERROR) << "Failed to base64-decode trigger scripts response"; Metrics::RecordLiteScriptFinished( - ukm::UkmRecorder::Get(), web_contents, + ukm::UkmRecorder::Get(), web_contents, UNSPECIFIED_TRIGGER_UI_TYPE, Metrics::LiteScriptFinishedState::LITE_SCRIPT_BASE64_DECODING_ERROR); return; }
diff --git a/chrome/browser/android/compositor/tab_content_manager.cc b/chrome/browser/android/compositor/tab_content_manager.cc index 89eedee..de7b2c2 100644 --- a/chrome/browser/android/compositor/tab_content_manager.cc +++ b/chrome/browser/android/compositor/tab_content_manager.cc
@@ -43,8 +43,6 @@ namespace { -const double kDefaultThumbnailAspectRatio = 0.85; - using TabReadbackCallback = base::OnceCallback<void(float, const SkBitmap&)>; } // namespace @@ -74,7 +72,7 @@ if (crop_to_match_aspect_ratio) { double aspect_ratio = base::GetFieldTrialParamByFeatureAsDouble( chrome::android::kTabGridLayoutAndroid, "thumbnail_aspect_ratio", - kDefaultThumbnailAspectRatio); + 1.0); aspect_ratio = ThumbnailCache::clampAspectRatio(aspect_ratio, 0.5, 2.0); int height = std::min(view_size_in_pixels.height(), (int)(view_size_in_pixels.width() / aspect_ratio)); @@ -132,8 +130,7 @@ jboolean save_jpeg_thumbnails) : weak_java_tab_content_manager_(env, obj) { double jpeg_aspect_ratio = base::GetFieldTrialParamByFeatureAsDouble( - chrome::android::kTabGridLayoutAndroid, "thumbnail_aspect_ratio", - kDefaultThumbnailAspectRatio); + chrome::android::kTabGridLayoutAndroid, "thumbnail_aspect_ratio", 1.0); thumbnail_cache_ = std::make_unique<ThumbnailCache>( static_cast<size_t>(default_cache_size), static_cast<size_t>(approximation_cache_size), @@ -396,8 +393,7 @@ // landscape mode. int scale = need_downsampling ? 2 : 1; double aspect_ratio = base::GetFieldTrialParamByFeatureAsDouble( - chrome::android::kTabGridLayoutAndroid, "thumbnail_aspect_ratio", - kDefaultThumbnailAspectRatio); + chrome::android::kTabGridLayoutAndroid, "thumbnail_aspect_ratio", 1.0); aspect_ratio = ThumbnailCache::clampAspectRatio(aspect_ratio, 0.5, 2.0); int width = std::min(bitmap.width() / scale,
diff --git a/chrome/browser/apps/app_service/notifications_browsertest.cc b/chrome/browser/apps/app_service/notifications_browsertest.cc index 8681a1f..df64d8b 100644 --- a/chrome/browser/apps/app_service/notifications_browsertest.cc +++ b/chrome/browser/apps/app_service/notifications_browsertest.cc
@@ -15,6 +15,7 @@ #include "chrome/browser/apps/app_service/arc_apps.h" #include "chrome/browser/apps/app_service/arc_apps_factory.h" #include "chrome/browser/apps/platform_apps/app_browsertest_util.h" +#include "chrome/browser/badging/badge_manager_factory.h" #include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/arc/session/arc_session_manager.h" #include "chrome/browser/extensions/api/notifications/extension_notification_display_helper.h" @@ -28,12 +29,14 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h" #include "chrome/common/chrome_features.h" +#include "chrome/common/chrome_switches.h" #include "components/arc/arc_service_manager.h" #include "components/arc/arc_util.h" #include "components/arc/session/arc_bridge_service.h" #include "components/arc/session/connection_holder.h" #include "components/arc/test/connection_holder_util.h" #include "components/arc/test/fake_app_instance.h" +#include "components/ukm/test_ukm_recorder.h" #include "content/public/browser/notification_service.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_navigation_observer.h" @@ -48,6 +51,7 @@ #include "ui/message_center/public/cpp/notification.h" #include "ui/message_center/public/cpp/notifier_id.h" +using apps::mojom::OptionalBool; using extensions::Extension; using extensions::ExtensionNotificationDisplayHelper; using extensions::ExtensionNotificationDisplayHelperFactory; @@ -86,9 +90,8 @@ return apps; } -apps::mojom::OptionalBool HasBadge(Profile* profile, - const std::string& app_id) { - auto has_badge = apps::mojom::OptionalBool::kUnknown; +OptionalBool HasBadge(Profile* profile, const std::string& app_id) { + auto has_badge = OptionalBool::kUnknown; apps::AppServiceProxy* proxy = apps::AppServiceProxyFactory::GetForProfile(profile); proxy->FlushMojoCallsForTesting(); @@ -175,8 +178,7 @@ const Extension* extension1 = LoadExtensionAndWait("notifications/api/permission"); ASSERT_TRUE(extension1); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, - HasBadge(profile(), extension1->id())); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), extension1->id())); // Load the basic app to generate a notification. ExtensionTestMessageListener notification_created_listener("created", false); @@ -185,20 +187,16 @@ ASSERT_TRUE(extension2); ASSERT_TRUE(notification_created_listener.WaitUntilSatisfied()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, - HasBadge(profile(), extension1->id())); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, - HasBadge(profile(), extension2->id())); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), extension1->id())); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), extension2->id())); message_center::Notification* notification = GetNotificationForExtension(extension2); ASSERT_TRUE(notification); RemoveNotification(profile(), notification->id()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, - HasBadge(profile(), extension1->id())); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, - HasBadge(profile(), extension2->id())); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), extension1->id())); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), extension2->id())); } IN_PROC_BROWSER_TEST_F(AppNotificationsExtensionApiTest, @@ -207,8 +205,7 @@ const Extension* extension1 = LoadExtensionAndWait("notifications/api/permission"); ASSERT_TRUE(extension1); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, - HasBadge(profile(), extension1->id())); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), extension1->id())); // Load the basic app to generate a notification. ExtensionTestMessageListener notification_created_listener1("created", false); @@ -217,16 +214,13 @@ ASSERT_TRUE(extension2); ASSERT_TRUE(notification_created_listener1.WaitUntilSatisfied()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, - HasBadge(profile(), extension1->id())); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, - HasBadge(profile(), extension2->id())); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), extension1->id())); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), extension2->id())); // Uninstall the basic app. UninstallApp(profile(), extension2->id()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, - HasBadge(profile(), extension1->id())); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), extension1->id())); // Re-load the basic app to generate a notification again. ExtensionTestMessageListener notification_created_listener2("created", false); @@ -235,10 +229,8 @@ ASSERT_TRUE(extension3); ASSERT_TRUE(notification_created_listener2.WaitUntilSatisfied()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, - HasBadge(profile(), extension1->id())); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, - HasBadge(profile(), extension3->id())); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), extension1->id())); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), extension3->id())); // Remove the notification. message_center::Notification* notification = @@ -246,10 +238,8 @@ ASSERT_TRUE(notification); RemoveNotification(profile(), notification->id()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, - HasBadge(profile(), extension1->id())); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, - HasBadge(profile(), extension3->id())); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), extension1->id())); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), extension3->id())); } class AppNotificationsWebNotificationTest @@ -334,8 +324,8 @@ AddAndRemovePersistentNotification) { std::string app_id1 = CreateWebApp(GetUrl1(), GetScope1()); std::string app_id2 = CreateWebApp(GetUrl2(), GetScope2()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); const GURL origin = GetOrigin(); std::string notification_id = "notification-id1"; @@ -347,13 +337,13 @@ NotificationDisplayService::GetForProfile(profile())->Display( NotificationHandler::Type::WEB_PERSISTENT, *notification, std::move(metadata)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); NotificationDisplayService::GetForProfile(profile())->Close( NotificationHandler::Type::WEB_PERSISTENT, notification_id); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); notification_id = "notification-id2"; notification = CreateNotification(notification_id, origin); @@ -363,13 +353,13 @@ NotificationDisplayService::GetForProfile(profile())->Display( NotificationHandler::Type::WEB_PERSISTENT, *notification, std::move(metadata)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); NotificationDisplayService::GetForProfile(profile())->Close( NotificationHandler::Type::WEB_PERSISTENT, notification_id); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); } IN_PROC_BROWSER_TEST_F(AppNotificationsWebNotificationTest, @@ -389,14 +379,14 @@ // Install apps, and verify the notification badge is not set. std::string app_id1 = CreateWebApp(GetUrl1(), GetScope1()); std::string app_id2 = CreateWebApp(GetUrl2(), GetScope2()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); // Remove the notification. It should not affect the notification badge. NotificationDisplayService::GetForProfile(profile())->Close( NotificationHandler::Type::WEB_PERSISTENT, notification_id); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); // Send a notification for the installed app 2. notification_id = "notification-id3"; @@ -408,22 +398,22 @@ NotificationDisplayService::GetForProfile(profile())->Display( NotificationHandler::Type::WEB_PERSISTENT, *notification, std::move(metadata)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); // Uninstall the app 2. UninstallApp(profile(), app_id2); // Re-install the app 2. app_id2 = CreateWebApp(GetUrl2(), GetScope2()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); // Remove the notification. NotificationDisplayService::GetForProfile(profile())->Close( NotificationHandler::Type::WEB_PERSISTENT, notification_id); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); // Resend the notifications for both apps. std::string notification_id1 = "notification-id4"; @@ -436,8 +426,8 @@ NotificationHandler::Type::WEB_PERSISTENT, *notification, std::move(metadata)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); std::string notification_id2 = "notification-id5"; notification = CreateNotification(notification_id2, origin); @@ -449,21 +439,21 @@ NotificationHandler::Type::WEB_PERSISTENT, *notification, std::move(metadata)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); // Remove notifications. NotificationDisplayService::GetForProfile(profile())->Close( NotificationHandler::Type::WEB_PERSISTENT, notification_id1); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); NotificationDisplayService::GetForProfile(profile())->Close( NotificationHandler::Type::WEB_PERSISTENT, notification_id2); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); } IN_PROC_BROWSER_TEST_F(AppNotificationsWebNotificationTest, @@ -474,8 +464,8 @@ std::string app_id1 = CreateWebApp(GetUrl1(), GetScope1()); std::string app_id3 = CreateWebApp(GetUrl3(), GetScope3()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); const std::string notification_id = "notification-id"; auto notification = CreateNotification(notification_id, origin); @@ -483,15 +473,15 @@ NotificationDisplayService::GetForProfile(profile())->Display( NotificationHandler::Type::WEB_NON_PERSISTENT, *notification, /*metadata=*/nullptr); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); histogram_tester.ExpectUniqueSample( "ChromeOS.Apps.NumberOfAppsForNotification", false, 1); RemoveNotification(profile(), notification_id); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); } IN_PROC_BROWSER_TEST_F(AppNotificationsWebNotificationTest, @@ -503,9 +493,9 @@ std::string app_id2 = CreateWebApp(GetUrl2(), GetScope2()); std::string app_id3 = CreateWebApp(GetUrl3(), GetScope3()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); const std::string notification_id = "notification-id"; auto notification = CreateNotification(notification_id, origin); @@ -513,17 +503,17 @@ NotificationDisplayService::GetForProfile(profile())->Display( NotificationHandler::Type::WEB_NON_PERSISTENT, *notification, /*metadata=*/nullptr); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); histogram_tester.ExpectUniqueSample( "ChromeOS.Apps.NumberOfAppsForNotification", true, 1); RemoveNotification(profile(), notification_id); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); } IN_PROC_BROWSER_TEST_F(AppNotificationsWebNotificationTest, @@ -544,9 +534,9 @@ std::string app_id2 = CreateWebApp(GetUrl2(), GetScope2()); std::string app_id3 = CreateWebApp(GetUrl3(), GetScope3()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); histogram_tester.ExpectTotalCount("ChromeOS.Apps.NumberOfAppsForNotification", 0); @@ -559,9 +549,9 @@ NotificationHandler::Type::WEB_NON_PERSISTENT, *notification, /*metadata=*/nullptr); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); histogram_tester.ExpectUniqueSample( "ChromeOS.Apps.NumberOfAppsForNotification", true, 1); @@ -569,14 +559,14 @@ // Uninstall the app 1. The notification badge for app 2 and app 3 should not // be affected. UninstallWebApp(app_id1); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); // Re-install the app 1. app_id1 = CreateWebApp(GetUrl1(), GetScope1()); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); // Send the notification 3. const std::string notification_id3 = "notification-id3"; @@ -585,32 +575,115 @@ NotificationDisplayService::GetForProfile(profile())->Display( NotificationHandler::Type::WEB_NON_PERSISTENT, *notification, /*metadata=*/nullptr); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); histogram_tester.ExpectUniqueSample( "ChromeOS.Apps.NumberOfAppsForNotification", true, 2); // Remove the notification 3 RemoveNotification(profile(), notification_id3); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); // Remove the notification 1 RemoveNotification(profile(), notification_id1); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); // Remove the notification 2 RemoveNotification(profile(), notification_id2); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id3)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id3)); } +class WebAppBadgingTest : public AppNotificationsWebNotificationTest, + public ::testing::WithParamInterface<std::string> { + protected: + WebAppBadgingTest() = default; + ~WebAppBadgingTest() override = default; + + void SetUp() override { + base::test::ScopedFeatureList scoped_feature_list_; + scoped_feature_list_.InitAndEnableFeatureWithParameters( + features::kDesktopPWAsAttentionBadgingCrOS, + {{"badge-source", GetParam()}}); + extensions::PlatformAppBrowserTest::SetUp(); + } +}; + +IN_PROC_BROWSER_TEST_P(WebAppBadgingTest, SetAndClearBadgeWithApi) { + ukm::TestUkmRecorder test_recorder; + badging::BadgeManager* badge_manager_ = + badging::BadgeManagerFactory::GetForProfile(profile()); + + std::string app_id = CreateWebApp(GetUrl1(), GetScope1()); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id)); + + badge_manager_->SetBadgeForTesting(app_id, 1, &test_recorder); + if (GetParam() == + switches::kDesktopPWAsAttentionBadgingCrOSNotificationsOnly) { + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id)); + } else { + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id)); + } + + badge_manager_->ClearBadgeForTesting(app_id, &test_recorder); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id)); +} + +IN_PROC_BROWSER_TEST_P(WebAppBadgingTest, + SetAndClearBadgeWithApiAndNotifications) { + ukm::TestUkmRecorder test_recorder; + badging::BadgeManager* badge_manager_ = + badging::BadgeManagerFactory::GetForProfile(profile()); + + std::string app_id = CreateWebApp(GetUrl1(), GetScope1()); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id)); + + badge_manager_->SetBadgeForTesting(app_id, 1, &test_recorder); + if (GetParam() == + switches::kDesktopPWAsAttentionBadgingCrOSNotificationsOnly) { + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id)); + } else { + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id)); + } + + const std::string notification_id = "notification-id"; + auto notification = CreateNotification(notification_id, GetOrigin()); + + auto metadata = std::make_unique<PersistentNotificationMetadata>(); + metadata->service_worker_scope = GetScope1(); + + NotificationDisplayService::GetForProfile(profile())->Display( + NotificationHandler::Type::WEB_PERSISTENT, *notification, + std::move(metadata)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id)); + + badge_manager_->ClearBadgeForTesting(app_id, &test_recorder); + if (GetParam() == switches::kDesktopPWAsAttentionBadgingCrOSApiOnly) { + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id)); + } else { + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id)); + } + + NotificationDisplayService::GetForProfile(profile())->Close( + NotificationHandler::Type::WEB_PERSISTENT, notification_id); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id)); +} + +INSTANTIATE_TEST_SUITE_P( + All, + WebAppBadgingTest, + ::testing::Values( + switches::kDesktopPWAsAttentionBadgingCrOSApiOnly, + switches::kDesktopPWAsAttentionBadgingCrOSApiAndNotifications, + switches::kDesktopPWAsAttentionBadgingCrOSNotificationsOnly)); + class FakeArcNotificationManagerDelegate : public ash::ArcNotificationManagerDelegate { public: @@ -742,26 +815,26 @@ const std::string app_id1 = GetTestAppId(kTestAppPackage1, kTestAppActivity1); const std::string app_id2 = GetTestAppId(kTestAppPackage2, kTestAppActivity2); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); const std::string notification_key1 = "notification_key1"; CreateNotificationWithKey(notification_key1, kTestAppPackage1); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); const std::string notification_key2 = "notification_key2"; CreateNotificationWithKey(notification_key2, kTestAppPackage2); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); RemoveNotificationWithKey(notification_key1); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); RemoveNotificationWithKey(notification_key2); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); } IN_PROC_BROWSER_TEST_F(AppNotificationsArcNotificationTest, @@ -771,20 +844,20 @@ const std::string app_id1 = GetTestAppId(kTestAppPackage1, kTestAppActivity1); const std::string app_id2 = GetTestAppId(kTestAppPackage2, kTestAppActivity2); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); // Sent 2 notifications for the app 1. const std::string notification_key1 = "notification_key1"; CreateNotificationWithKey(notification_key1, kTestAppPackage1); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); const std::string notification_key2 = "notification_key2"; CreateNotificationWithKey(notification_key2, kTestAppPackage1); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); // Remove the app 1. SendPackageRemoved(app_id1); @@ -792,27 +865,27 @@ // Sent 1 notification for the app 2. const std::string notification_key3 = "notification_key3"; CreateNotificationWithKey(notification_key3, kTestAppPackage2); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); // Remove the notification for the app 2. RemoveNotificationWithKey(notification_key3); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); // Sent 2 notifications for the app 2. const std::string notification_key4 = "notification_key4"; CreateNotificationWithKey(notification_key4, kTestAppPackage2); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); const std::string notification_key5 = "notification_key5"; CreateNotificationWithKey(notification_key5, kTestAppPackage1); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); // Remove notifications for the app2. RemoveNotificationWithKey(notification_key5); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); RemoveNotificationWithKey(notification_key4); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); // Remove the app 2. SendPackageRemoved(app_id2); @@ -825,34 +898,34 @@ const std::string app_id1 = GetTestAppId(kTestAppPackage1, kTestAppActivity1); const std::string app_id2 = GetTestAppId(kTestAppPackage2, kTestAppActivity2); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); // Sent 2 notifications for the app 1, and 1 notification for the app 2. const std::string notification_key1 = "notification_key1"; CreateNotificationWithKey(notification_key1, kTestAppPackage1); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); const std::string notification_key2 = "notification_key2"; CreateNotificationWithKey(notification_key2, kTestAppPackage1); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); // Sent 1 notification for the app 2. const std::string notification_key3 = "notification_key3"; CreateNotificationWithKey(notification_key3, kTestAppPackage2); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); RemoveNotificationWithKey(notification_key1); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); // Uninstall the app 2. UninstallApp(profile(), app_id2); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); // Uninstall the app 1. UninstallApp(profile(), app_id1); @@ -860,36 +933,36 @@ // Reinstall apps InstallTestApps(); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); // Sent 2 notifications for the app 2, and 1 notification for the app 1. const std::string notification_key4 = "notification_key4"; CreateNotificationWithKey(notification_key4, kTestAppPackage2); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); const std::string notification_key5 = "notification_key5"; CreateNotificationWithKey(notification_key5, kTestAppPackage1); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); const std::string notification_key6 = "notification_key6"; CreateNotificationWithKey(notification_key6, kTestAppPackage2); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); // Remove notifications RemoveNotificationWithKey(notification_key5); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); RemoveNotificationWithKey(notification_key4); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kTrue, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kTrue, HasBadge(profile(), app_id2)); RemoveNotificationWithKey(notification_key6); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id1)); - ASSERT_EQ(apps::mojom::OptionalBool::kFalse, HasBadge(profile(), app_id2)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id1)); + ASSERT_EQ(OptionalBool::kFalse, HasBadge(profile(), app_id2)); }
diff --git a/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller.cc b/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller.cc index cf93ca00a..4f90ec23 100644 --- a/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller.cc +++ b/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller.cc
@@ -13,7 +13,7 @@ #include "chrome/browser/ash/account_manager/account_manager_util.h" #include "chrome/browser/chromeos/child_accounts/edu_coexistence_tos_store_utils.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/webui/chromeos/edu_coexistence_login_handler_chromeos.h" +#include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller_unittest.cc b/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller_unittest.cc index ec649362..a05570c 100644 --- a/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller_unittest.cc +++ b/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller_unittest.cc
@@ -16,7 +16,7 @@ #include "chrome/browser/chromeos/child_accounts/edu_coexistence_tos_store_utils.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/supervised_user/supervised_user_constants.h" -#include "chrome/browser/ui/webui/chromeos/edu_coexistence_login_handler_chromeos.h" +#include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h" #include "chrome/test/base/testing_profile.h" #include "components/account_id/account_id.h" #include "components/account_manager_core/account.h"
diff --git a/chrome/browser/ash/app_mode/kiosk_app_update_service.cc b/chrome/browser/ash/app_mode/kiosk_app_update_service.cc index 16f4b4c..c84f0d12 100644 --- a/chrome/browser/ash/app_mode/kiosk_app_update_service.cc +++ b/chrome/browser/ash/app_mode/kiosk_app_update_service.cc
@@ -7,9 +7,9 @@ #include "base/logging.h" #include "chrome/browser/app_mode/app_mode_utils.h" #include "chrome/browser/ash/app_mode/kiosk_app_manager.h" +#include "chrome/browser/ash/system/automatic_reboot_manager.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part_chromeos.h" -#include "chrome/browser/chromeos/system/automatic_reboot_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/ash/app_mode/kiosk_app_update_service.h b/chrome/browser/ash/app_mode/kiosk_app_update_service.h index 5c27470..44ba27c 100644 --- a/chrome/browser/ash/app_mode/kiosk_app_update_service.h +++ b/chrome/browser/ash/app_mode/kiosk_app_update_service.h
@@ -14,8 +14,8 @@ #include "chrome/browser/ash/app_mode/kiosk_app_manager_observer.h" // TODO(https://crbug.com/1164001): forward declare when moved to // chrome/browser/ash/. -#include "chrome/browser/chromeos/system/automatic_reboot_manager.h" -#include "chrome/browser/chromeos/system/automatic_reboot_manager_observer.h" +#include "chrome/browser/ash/system/automatic_reboot_manager.h" +#include "chrome/browser/ash/system/automatic_reboot_manager_observer.h" #include "components/keyed_service/content/browser_context_keyed_service_factory.h" #include "components/keyed_service/core/keyed_service.h" #include "extensions/browser/update_observer.h"
diff --git a/chrome/browser/ash/app_mode/kiosk_app_update_service_browsertest.cc b/chrome/browser/ash/app_mode/kiosk_app_update_service_browsertest.cc index 13ae0f7..8668a21 100644 --- a/chrome/browser/ash/app_mode/kiosk_app_update_service_browsertest.cc +++ b/chrome/browser/ash/app_mode/kiosk_app_update_service_browsertest.cc
@@ -27,10 +27,10 @@ #include "base/threading/thread_restrictions.h" #include "base/time/time.h" #include "chrome/browser/apps/platform_apps/app_browsertest_util.h" +#include "chrome/browser/ash/system/automatic_reboot_manager.h" +#include "chrome/browser/ash/system/automatic_reboot_manager_observer.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" -#include "chrome/browser/chromeos/system/automatic_reboot_manager.h" -#include "chrome/browser/chromeos/system/automatic_reboot_manager_observer.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/chromeos/system/OWNERS b/chrome/browser/ash/system/OWNERS similarity index 100% rename from chrome/browser/chromeos/system/OWNERS rename to chrome/browser/ash/system/OWNERS
diff --git a/chrome/browser/chromeos/system/automatic_reboot_manager.cc b/chrome/browser/ash/system/automatic_reboot_manager.cc similarity index 99% rename from chrome/browser/chromeos/system/automatic_reboot_manager.cc rename to chrome/browser/ash/system/automatic_reboot_manager.cc index 4af3026..88d7fdd 100644 --- a/chrome/browser/chromeos/system/automatic_reboot_manager.cc +++ b/chrome/browser/ash/system/automatic_reboot_manager.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/automatic_reboot_manager.h" +#include "chrome/browser/ash/system/automatic_reboot_manager.h" #include <fcntl.h> #include <stddef.h>
diff --git a/chrome/browser/chromeos/system/automatic_reboot_manager.h b/chrome/browser/ash/system/automatic_reboot_manager.h similarity index 96% rename from chrome/browser/chromeos/system/automatic_reboot_manager.h rename to chrome/browser/ash/system/automatic_reboot_manager.h index 34448e6..ec79068 100644 --- a/chrome/browser/chromeos/system/automatic_reboot_manager.h +++ b/chrome/browser/ash/system/automatic_reboot_manager.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_AUTOMATIC_REBOOT_MANAGER_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_AUTOMATIC_REBOOT_MANAGER_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_AUTOMATIC_REBOOT_MANAGER_H_ +#define CHROME_BROWSER_ASH_SYSTEM_AUTOMATIC_REBOOT_MANAGER_H_ #include <memory> @@ -15,7 +15,7 @@ #include "base/synchronization/waitable_event.h" #include "base/time/time.h" #include "base/timer/timer.h" -#include "chrome/browser/chromeos/system/automatic_reboot_manager_observer.h" +#include "chrome/browser/ash/system/automatic_reboot_manager_observer.h" #include "chromeos/dbus/power/power_manager_client.h" #include "chromeos/dbus/update_engine_client.h" #include "components/prefs/pref_change_registrar.h" @@ -197,4 +197,4 @@ } } // namespace ash -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_AUTOMATIC_REBOOT_MANAGER_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_AUTOMATIC_REBOOT_MANAGER_H_
diff --git a/chrome/browser/chromeos/system/automatic_reboot_manager_observer.h b/chrome/browser/ash/system/automatic_reboot_manager_observer.h similarity index 79% rename from chrome/browser/chromeos/system/automatic_reboot_manager_observer.h rename to chrome/browser/ash/system/automatic_reboot_manager_observer.h index 6ad9774..7da17ba 100644 --- a/chrome/browser/chromeos/system/automatic_reboot_manager_observer.h +++ b/chrome/browser/ash/system/automatic_reboot_manager_observer.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_AUTOMATIC_REBOOT_MANAGER_OBSERVER_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_AUTOMATIC_REBOOT_MANAGER_OBSERVER_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_AUTOMATIC_REBOOT_MANAGER_OBSERVER_H_ +#define CHROME_BROWSER_ASH_SYSTEM_AUTOMATIC_REBOOT_MANAGER_OBSERVER_H_ namespace chromeos { namespace system { @@ -36,4 +36,4 @@ } } // namespace ash -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_AUTOMATIC_REBOOT_MANAGER_OBSERVER_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_AUTOMATIC_REBOOT_MANAGER_OBSERVER_H_
diff --git a/chrome/browser/chromeos/system/automatic_reboot_manager_unittest.cc b/chrome/browser/ash/system/automatic_reboot_manager_unittest.cc similarity index 99% rename from chrome/browser/chromeos/system/automatic_reboot_manager_unittest.cc rename to chrome/browser/ash/system/automatic_reboot_manager_unittest.cc index b6a03fc..3e8209f 100644 --- a/chrome/browser/chromeos/system/automatic_reboot_manager_unittest.cc +++ b/chrome/browser/ash/system/automatic_reboot_manager_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/automatic_reboot_manager.h" +#include "chrome/browser/ash/system/automatic_reboot_manager.h" #include <string> @@ -23,9 +23,9 @@ #include "base/time/tick_clock.h" #include "base/values.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/automatic_reboot_manager_observer.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/chromeos/login/users/mock_user_manager.h" -#include "chrome/browser/chromeos/system/automatic_reboot_manager_observer.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_browser_process.h" #include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chrome/browser/chromeos/system/breakpad_consent_watcher.cc b/chrome/browser/ash/system/breakpad_consent_watcher.cc similarity index 96% rename from chrome/browser/chromeos/system/breakpad_consent_watcher.cc rename to chrome/browser/ash/system/breakpad_consent_watcher.cc index bdf3338..e7eee765 100644 --- a/chrome/browser/chromeos/system/breakpad_consent_watcher.cc +++ b/chrome/browser/ash/system/breakpad_consent_watcher.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/breakpad_consent_watcher.h" +#include "chrome/browser/ash/system/breakpad_consent_watcher.h" #include <string>
diff --git a/chrome/browser/chromeos/system/breakpad_consent_watcher.h b/chrome/browser/ash/system/breakpad_consent_watcher.h similarity index 90% rename from chrome/browser/chromeos/system/breakpad_consent_watcher.h rename to chrome/browser/ash/system/breakpad_consent_watcher.h index 52dfa80..25d47824 100644 --- a/chrome/browser/chromeos/system/breakpad_consent_watcher.h +++ b/chrome/browser/ash/system/breakpad_consent_watcher.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_BREAKPAD_CONSENT_WATCHER_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_BREAKPAD_CONSENT_WATCHER_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_BREAKPAD_CONSENT_WATCHER_H_ +#define CHROME_BROWSER_ASH_SYSTEM_BREAKPAD_CONSENT_WATCHER_H_ #include <memory> @@ -52,4 +52,4 @@ } // namespace system } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_BREAKPAD_CONSENT_WATCHER_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_BREAKPAD_CONSENT_WATCHER_H_
diff --git a/chrome/browser/chromeos/system/device_disabling_browsertest.cc b/chrome/browser/ash/system/device_disabling_browsertest.cc similarity index 99% rename from chrome/browser/chromeos/system/device_disabling_browsertest.cc rename to chrome/browser/ash/system/device_disabling_browsertest.cc index a12ef8f..4d3e2e52 100644 --- a/chrome/browser/chromeos/system/device_disabling_browsertest.cc +++ b/chrome/browser/ash/system/device_disabling_browsertest.cc
@@ -13,6 +13,7 @@ #include "base/memory/ref_counted.h" #include "base/run_loop.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/device_disabling_manager.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/login/login_wizard.h" @@ -25,7 +26,6 @@ #include "chrome/browser/chromeos/login/ui/webui_login_view.h" #include "chrome/browser/chromeos/login/wizard_controller.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/chromeos/system/device_disabling_manager.h" #include "chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
diff --git a/chrome/browser/chromeos/system/device_disabling_manager.cc b/chrome/browser/ash/system/device_disabling_manager.cc similarity index 98% rename from chrome/browser/chromeos/system/device_disabling_manager.cc rename to chrome/browser/ash/system/device_disabling_manager.cc index 89c47e11..5ba4a96 100644 --- a/chrome/browser/chromeos/system/device_disabling_manager.cc +++ b/chrome/browser/ash/system/device_disabling_manager.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/device_disabling_manager.h" +#include "chrome/browser/ash/system/device_disabling_manager.h" #include "ash/constants/ash_switches.h" #include "base/bind.h"
diff --git a/chrome/browser/chromeos/system/device_disabling_manager.h b/chrome/browser/ash/system/device_disabling_manager.h similarity index 96% rename from chrome/browser/chromeos/system/device_disabling_manager.h rename to chrome/browser/ash/system/device_disabling_manager.h index cc293495..35652c0 100644 --- a/chrome/browser/chromeos/system/device_disabling_manager.h +++ b/chrome/browser/ash/system/device_disabling_manager.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_DEVICE_DISABLING_MANAGER_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_DEVICE_DISABLING_MANAGER_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_DEVICE_DISABLING_MANAGER_H_ +#define CHROME_BROWSER_ASH_SYSTEM_DEVICE_DISABLING_MANAGER_H_ #include <memory> #include <string> @@ -154,4 +154,4 @@ } // namespace system } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_DEVICE_DISABLING_MANAGER_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_DEVICE_DISABLING_MANAGER_H_
diff --git a/chrome/browser/chromeos/system/device_disabling_manager_default_delegate.cc b/chrome/browser/ash/system/device_disabling_manager_default_delegate.cc similarity index 91% rename from chrome/browser/chromeos/system/device_disabling_manager_default_delegate.cc rename to chrome/browser/ash/system/device_disabling_manager_default_delegate.cc index fd2454d..98e5eb0 100644 --- a/chrome/browser/chromeos/system/device_disabling_manager_default_delegate.cc +++ b/chrome/browser/ash/system/device_disabling_manager_default_delegate.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/device_disabling_manager_default_delegate.h" +#include "chrome/browser/ash/system/device_disabling_manager_default_delegate.h" #include "chrome/browser/chromeos/login/ui/login_display_host.h" #include "chrome/browser/chromeos/login/wizard_controller.h"
diff --git a/chrome/browser/chromeos/system/device_disabling_manager_default_delegate.h b/chrome/browser/ash/system/device_disabling_manager_default_delegate.h similarity index 66% rename from chrome/browser/chromeos/system/device_disabling_manager_default_delegate.h rename to chrome/browser/ash/system/device_disabling_manager_default_delegate.h index 2316e70..2a782c8 100644 --- a/chrome/browser/chromeos/system/device_disabling_manager_default_delegate.h +++ b/chrome/browser/ash/system/device_disabling_manager_default_delegate.h
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_DEVICE_DISABLING_MANAGER_DEFAULT_DELEGATE_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_DEVICE_DISABLING_MANAGER_DEFAULT_DELEGATE_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_DEVICE_DISABLING_MANAGER_DEFAULT_DELEGATE_H_ +#define CHROME_BROWSER_ASH_SYSTEM_DEVICE_DISABLING_MANAGER_DEFAULT_DELEGATE_H_ #include "base/macros.h" -#include "chrome/browser/chromeos/system/device_disabling_manager.h" +#include "chrome/browser/ash/system/device_disabling_manager.h" namespace chromeos { namespace system { @@ -27,4 +27,4 @@ } // namespace system } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_DEVICE_DISABLING_MANAGER_DEFAULT_DELEGATE_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_DEVICE_DISABLING_MANAGER_DEFAULT_DELEGATE_H_
diff --git a/chrome/browser/chromeos/system/device_disabling_manager_unittest.cc b/chrome/browser/ash/system/device_disabling_manager_unittest.cc similarity index 99% rename from chrome/browser/chromeos/system/device_disabling_manager_unittest.cc rename to chrome/browser/ash/system/device_disabling_manager_unittest.cc index b01086b..428a446 100644 --- a/chrome/browser/chromeos/system/device_disabling_manager_unittest.cc +++ b/chrome/browser/ash/system/device_disabling_manager_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/device_disabling_manager.h" +#include "chrome/browser/ash/system/device_disabling_manager.h" #include "ash/constants/ash_switches.h" #include "base/bind.h"
diff --git a/chrome/browser/chromeos/system/fake_input_device_settings.cc b/chrome/browser/ash/system/fake_input_device_settings.cc similarity index 98% rename from chrome/browser/chromeos/system/fake_input_device_settings.cc rename to chrome/browser/ash/system/fake_input_device_settings.cc index 7842d3e..95616ae 100644 --- a/chrome/browser/chromeos/system/fake_input_device_settings.cc +++ b/chrome/browser/ash/system/fake_input_device_settings.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/fake_input_device_settings.h" +#include "chrome/browser/ash/system/fake_input_device_settings.h" #include <utility>
diff --git a/chrome/browser/chromeos/system/fake_input_device_settings.h b/chrome/browser/ash/system/fake_input_device_settings.h similarity index 91% rename from chrome/browser/chromeos/system/fake_input_device_settings.h rename to chrome/browser/ash/system/fake_input_device_settings.h index 56c9106a..f51fb36b 100644 --- a/chrome/browser/chromeos/system/fake_input_device_settings.h +++ b/chrome/browser/ash/system/fake_input_device_settings.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_FAKE_INPUT_DEVICE_SETTINGS_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_FAKE_INPUT_DEVICE_SETTINGS_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_FAKE_INPUT_DEVICE_SETTINGS_H_ +#define CHROME_BROWSER_ASH_SYSTEM_FAKE_INPUT_DEVICE_SETTINGS_H_ #include "base/compiler_specific.h" #include "base/macros.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" +#include "chrome/browser/ash/system/input_device_settings.h" namespace chromeos { namespace system { @@ -72,4 +72,4 @@ } // namespace system } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_FAKE_INPUT_DEVICE_SETTINGS_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_FAKE_INPUT_DEVICE_SETTINGS_H_
diff --git a/chrome/browser/chromeos/system/input_device_settings.cc b/chrome/browser/ash/system/input_device_settings.cc similarity index 99% rename from chrome/browser/chromeos/system/input_device_settings.cc rename to chrome/browser/ash/system/input_device_settings.cc index b695ebff..4fb62c1b 100644 --- a/chrome/browser/chromeos/system/input_device_settings.cc +++ b/chrome/browser/ash/system/input_device_settings.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/input_device_settings.h" +#include "chrome/browser/ash/system/input_device_settings.h" #include "chrome/browser/chromeos/policy/enrollment_requisition_manager.h" #include "chromeos/system/statistics_provider.h"
diff --git a/chrome/browser/chromeos/system/input_device_settings.h b/chrome/browser/ash/system/input_device_settings.h similarity index 97% rename from chrome/browser/chromeos/system/input_device_settings.h rename to chrome/browser/ash/system/input_device_settings.h index f222d4d..2d110b4 100644 --- a/chrome/browser/chromeos/system/input_device_settings.h +++ b/chrome/browser/ash/system/input_device_settings.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_INPUT_DEVICE_SETTINGS_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_INPUT_DEVICE_SETTINGS_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_INPUT_DEVICE_SETTINGS_H_ +#define CHROME_BROWSER_ASH_SYSTEM_INPUT_DEVICE_SETTINGS_H_ #include "base/callback_forward.h" #include "base/optional.h" @@ -310,4 +310,4 @@ } // namespace system } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_INPUT_DEVICE_SETTINGS_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_INPUT_DEVICE_SETTINGS_H_
diff --git a/chrome/browser/chromeos/system/input_device_settings_impl_ozone.cc b/chrome/browser/ash/system/input_device_settings_impl_ozone.cc similarity index 98% rename from chrome/browser/chromeos/system/input_device_settings_impl_ozone.cc rename to chrome/browser/ash/system/input_device_settings_impl_ozone.cc index dd79f35..3507ba54 100644 --- a/chrome/browser/chromeos/system/input_device_settings_impl_ozone.cc +++ b/chrome/browser/ash/system/input_device_settings_impl_ozone.cc
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/input_device_settings.h" +#include "chrome/browser/ash/system/input_device_settings.h" #include "base/bind.h" #include "base/macros.h" +#include "chrome/browser/ash/system/fake_input_device_settings.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part_chromeos.h" -#include "chrome/browser/chromeos/system/fake_input_device_settings.h" #include "chromeos/system/devicemode.h" #include "content/public/browser/browser_thread.h" #include "ui/ozone/public/input_controller.h"
diff --git a/chrome/browser/chromeos/system/pointer_device_observer.cc b/chrome/browser/ash/system/pointer_device_observer.cc similarity index 94% rename from chrome/browser/chromeos/system/pointer_device_observer.cc rename to chrome/browser/ash/system/pointer_device_observer.cc index 709b4914..4bbcfc6 100644 --- a/chrome/browser/chromeos/system/pointer_device_observer.cc +++ b/chrome/browser/ash/system/pointer_device_observer.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/pointer_device_observer.h" +#include "chrome/browser/ash/system/pointer_device_observer.h" #include "base/bind.h" #include "base/callback_helpers.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" +#include "chrome/browser/ash/system/input_device_settings.h" #include "content/public/browser/browser_thread.h" #include "ui/events/devices/device_data_manager.h"
diff --git a/chrome/browser/chromeos/system/pointer_device_observer.h b/chrome/browser/ash/system/pointer_device_observer.h similarity index 88% rename from chrome/browser/chromeos/system/pointer_device_observer.h rename to chrome/browser/ash/system/pointer_device_observer.h index 58dca6bc..eb2d7410 100644 --- a/chrome/browser/chromeos/system/pointer_device_observer.h +++ b/chrome/browser/ash/system/pointer_device_observer.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_POINTER_DEVICE_OBSERVER_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_POINTER_DEVICE_OBSERVER_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_POINTER_DEVICE_OBSERVER_H_ +#define CHROME_BROWSER_ASH_SYSTEM_POINTER_DEVICE_OBSERVER_H_ #include "base/macros.h" #include "base/memory/weak_ptr.h" @@ -61,4 +61,4 @@ } // namespace system } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_POINTER_DEVICE_OBSERVER_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_POINTER_DEVICE_OBSERVER_H_
diff --git a/chrome/browser/chromeos/system/procfs_util.cc b/chrome/browser/ash/system/procfs_util.cc similarity index 98% rename from chrome/browser/chromeos/system/procfs_util.cc rename to chrome/browser/ash/system/procfs_util.cc index a56ba423..b58514ae 100644 --- a/chrome/browser/chromeos/system/procfs_util.cc +++ b/chrome/browser/ash/system/procfs_util.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/procfs_util.h" +#include "chrome/browser/ash/system/procfs_util.h" #include "base/files/file_util.h" #include "base/strings/string_number_conversions.h"
diff --git a/chrome/browser/chromeos/system/procfs_util.h b/chrome/browser/ash/system/procfs_util.h similarity index 91% rename from chrome/browser/chromeos/system/procfs_util.h rename to chrome/browser/ash/system/procfs_util.h index b8b77d96..b73c1e6 100644 --- a/chrome/browser/chromeos/system/procfs_util.h +++ b/chrome/browser/ash/system/procfs_util.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_PROCFS_UTIL_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_PROCFS_UTIL_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_PROCFS_UTIL_H_ +#define CHROME_BROWSER_ASH_SYSTEM_PROCFS_UTIL_H_ #include "base/files/file_path.h" #include "base/values.h" @@ -61,4 +61,4 @@ } // namespace system } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_PROCFS_UTIL_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_PROCFS_UTIL_H_
diff --git a/chrome/browser/chromeos/system/procfs_util_unittest.cc b/chrome/browser/ash/system/procfs_util_unittest.cc similarity index 98% rename from chrome/browser/chromeos/system/procfs_util_unittest.cc rename to chrome/browser/ash/system/procfs_util_unittest.cc index 4a27a133..3cf41b1 100644 --- a/chrome/browser/chromeos/system/procfs_util_unittest.cc +++ b/chrome/browser/ash/system/procfs_util_unittest.cc
@@ -7,7 +7,7 @@ #include "base/strings/string_number_conversions.h" #include "testing/gtest/include/gtest/gtest.h" -#include "chrome/browser/chromeos/system/procfs_util.h" +#include "chrome/browser/ash/system/procfs_util.h" namespace chromeos { namespace system {
diff --git a/chrome/browser/chromeos/system/system_clock.cc b/chrome/browser/ash/system/system_clock.cc similarity index 98% rename from chrome/browser/chromeos/system/system_clock.cc rename to chrome/browser/ash/system/system_clock.cc index 5913cb0..6586657b 100644 --- a/chrome/browser/chromeos/system/system_clock.cc +++ b/chrome/browser/ash/system/system_clock.cc
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/system_clock.h" +#include "chrome/browser/ash/system/system_clock.h" #include <memory> #include "base/bind.h" #include "base/logging.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/system_clock_observer.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/chromeos/system/system_clock_observer.h" #include "chrome/common/pref_names.h" #include "chromeos/login/login_state/login_state.h" #include "chromeos/settings/cros_settings_names.h"
diff --git a/chrome/browser/chromeos/system/system_clock.h b/chrome/browser/ash/system/system_clock.h similarity index 94% rename from chrome/browser/chromeos/system/system_clock.h rename to chrome/browser/ash/system/system_clock.h index c1e54d0..e065eed 100644 --- a/chrome/browser/chromeos/system/system_clock.h +++ b/chrome/browser/ash/system/system_clock.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_SYSTEM_CLOCK_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_SYSTEM_CLOCK_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_SYSTEM_CLOCK_H_ +#define CHROME_BROWSER_ASH_SYSTEM_SYSTEM_CLOCK_H_ #include <memory> @@ -101,4 +101,4 @@ } // namespace system } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_SYSTEM_CLOCK_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_SYSTEM_CLOCK_H_
diff --git a/chrome/browser/chromeos/system/system_clock_observer.cc b/chrome/browser/ash/system/system_clock_observer.cc similarity index 82% rename from chrome/browser/chromeos/system/system_clock_observer.cc rename to chrome/browser/ash/system/system_clock_observer.cc index 52a8dc1..53eedf8 100644 --- a/chrome/browser/chromeos/system/system_clock_observer.cc +++ b/chrome/browser/ash/system/system_clock_observer.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/system_clock_observer.h" +#include "chrome/browser/ash/system/system_clock_observer.h" namespace chromeos { namespace system {
diff --git a/chrome/browser/chromeos/system/system_clock_observer.h b/chrome/browser/ash/system/system_clock_observer.h similarity index 71% rename from chrome/browser/chromeos/system/system_clock_observer.h rename to chrome/browser/ash/system/system_clock_observer.h index 08f4494f..1d9b984 100644 --- a/chrome/browser/chromeos/system/system_clock_observer.h +++ b/chrome/browser/ash/system/system_clock_observer.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_SYSTEM_CLOCK_OBSERVER_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_SYSTEM_CLOCK_OBSERVER_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_SYSTEM_CLOCK_OBSERVER_H_ +#define CHROME_BROWSER_ASH_SYSTEM_SYSTEM_CLOCK_OBSERVER_H_ #include "base/macros.h" @@ -22,4 +22,4 @@ } // namespace system } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_SYSTEM_CLOCK_OBSERVER_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_SYSTEM_CLOCK_OBSERVER_H_
diff --git a/chrome/browser/chromeos/system/timezone_resolver_manager.cc b/chrome/browser/ash/system/timezone_resolver_manager.cc similarity index 98% rename from chrome/browser/chromeos/system/timezone_resolver_manager.cc rename to chrome/browser/ash/system/timezone_resolver_manager.cc index 196b811..d568f89f 100644 --- a/chrome/browser/chromeos/system/timezone_resolver_manager.cc +++ b/chrome/browser/ash/system/timezone_resolver_manager.cc
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/check.h" #include "base/command_line.h" #include "base/notreached.h" +#include "chrome/browser/ash/system/input_device_settings.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/preferences.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/common/pref_names.h" #include "components/policy/proto/chrome_device_policy.pb.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/chromeos/system/timezone_resolver_manager.h b/chrome/browser/ash/system/timezone_resolver_manager.h similarity index 94% rename from chrome/browser/chromeos/system/timezone_resolver_manager.h rename to chrome/browser/ash/system/timezone_resolver_manager.h index 02be20d..193c8c5 100644 --- a/chrome/browser/chromeos/system/timezone_resolver_manager.h +++ b/chrome/browser/ash/system/timezone_resolver_manager.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_TIMEZONE_RESOLVER_MANAGER_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_TIMEZONE_RESOLVER_MANAGER_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_TIMEZONE_RESOLVER_MANAGER_H_ +#define CHROME_BROWSER_ASH_SYSTEM_TIMEZONE_RESOLVER_MANAGER_H_ #include "base/macros.h" #include "base/memory/weak_ptr.h" @@ -112,4 +112,4 @@ } // namespace system } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_TIMEZONE_RESOLVER_MANAGER_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_TIMEZONE_RESOLVER_MANAGER_H_
diff --git a/chrome/browser/chromeos/system/timezone_util.cc b/chrome/browser/ash/system/timezone_util.cc similarity index 98% rename from chrome/browser/chromeos/system/timezone_util.cc rename to chrome/browser/ash/system/timezone_util.cc index 6c50bb4..3987ee3a 100644 --- a/chrome/browser/chromeos/system/timezone_util.cc +++ b/chrome/browser/ash/system/timezone_util.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/timezone_util.h" +#include "chrome/browser/ash/system/timezone_util.h" #include <stddef.h> @@ -21,11 +21,11 @@ #include "base/synchronization/lock.h" #include "base/values.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h"
diff --git a/chrome/browser/chromeos/system/timezone_util.h b/chrome/browser/ash/system/timezone_util.h similarity index 93% rename from chrome/browser/chromeos/system/timezone_util.h rename to chrome/browser/ash/system/timezone_util.h index 81a4ee4..98ec1580 100644 --- a/chrome/browser/chromeos/system/timezone_util.h +++ b/chrome/browser/ash/system/timezone_util.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_TIMEZONE_UTIL_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_TIMEZONE_UTIL_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_TIMEZONE_UTIL_H_ +#define CHROME_BROWSER_ASH_SYSTEM_TIMEZONE_UTIL_H_ #include <memory> @@ -74,4 +74,4 @@ } // namespace system } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_TIMEZONE_UTIL_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_TIMEZONE_UTIL_H_
diff --git a/chrome/browser/chromeos/system/tray_accessibility_browsertest.cc b/chrome/browser/ash/system/tray_accessibility_browsertest.cc similarity index 100% rename from chrome/browser/chromeos/system/tray_accessibility_browsertest.cc rename to chrome/browser/ash/system/tray_accessibility_browsertest.cc
diff --git a/chrome/browser/chromeos/system/user_removal_manager.cc b/chrome/browser/ash/system/user_removal_manager.cc similarity index 97% rename from chrome/browser/chromeos/system/user_removal_manager.cc rename to chrome/browser/ash/system/user_removal_manager.cc index 47fdcb4..d67d02c 100644 --- a/chrome/browser/chromeos/system/user_removal_manager.cc +++ b/chrome/browser/ash/system/user_removal_manager.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/user_removal_manager.h" +#include "chrome/browser/ash/system/user_removal_manager.h" #include <utility>
diff --git a/chrome/browser/chromeos/system/user_removal_manager.h b/chrome/browser/ash/system/user_removal_manager.h similarity index 88% rename from chrome/browser/chromeos/system/user_removal_manager.h rename to chrome/browser/ash/system/user_removal_manager.h index 5ea2a4dc..3ad83a7 100644 --- a/chrome/browser/chromeos/system/user_removal_manager.h +++ b/chrome/browser/ash/system/user_removal_manager.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_USER_REMOVAL_MANAGER_H_ -#define CHROME_BROWSER_CHROMEOS_SYSTEM_USER_REMOVAL_MANAGER_H_ +#ifndef CHROME_BROWSER_ASH_SYSTEM_USER_REMOVAL_MANAGER_H_ +#define CHROME_BROWSER_ASH_SYSTEM_USER_REMOVAL_MANAGER_H_ #include "base/callback_forward.h" @@ -40,4 +40,4 @@ } // namespace user_removal_manager } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_USER_REMOVAL_MANAGER_H_ +#endif // CHROME_BROWSER_ASH_SYSTEM_USER_REMOVAL_MANAGER_H_
diff --git a/chrome/browser/chromeos/system/user_removal_manager_unittest.cc b/chrome/browser/ash/system/user_removal_manager_unittest.cc similarity index 97% rename from chrome/browser/chromeos/system/user_removal_manager_unittest.cc rename to chrome/browser/ash/system/user_removal_manager_unittest.cc index 12ae8ea..4d923a4e 100644 --- a/chrome/browser/chromeos/system/user_removal_manager_unittest.cc +++ b/chrome/browser/ash/system/user_removal_manager_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/system/user_removal_manager.h" +#include "chrome/browser/ash/system/user_removal_manager.h" #include <memory>
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc index e390584..43ed146 100644 --- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc +++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
@@ -357,6 +357,11 @@ return omnibox_triggered_feature_service_.get(); } +signin::IdentityManager* ChromeAutocompleteProviderClient::GetIdentityManager() + const { + return IdentityManagerFactory::GetForProfile(profile_); +} + bool ChromeAutocompleteProviderClient::IsOffTheRecord() const { return profile_->IsOffTheRecord(); }
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h index f0742c0..a3a5f93 100644 --- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h +++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h
@@ -65,7 +65,7 @@ query_tiles::TileService* GetQueryTileService() const override; OmniboxTriggeredFeatureService* GetOmniboxTriggeredFeatureService() const override; - + signin::IdentityManager* GetIdentityManager() const override; bool IsOffTheRecord() const override; bool SearchSuggestEnabled() const override; bool IsPersonalizedUrlDataCollectionActive() const override;
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc index 98908d5..b0dc01c6 100644 --- a/chrome/browser/autofill/autofill_interactive_uitest.cc +++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -2767,13 +2767,7 @@ // This test verifies that credit card (payment card list) popup works when the // form is inside an OOPIF. -// TODO(crbug.com/1176012): This now flakes on MacOS AND Linux, so it is -// disabled until fixed. -// Previous flakes: -// Flaky on Windows http://crbug.com/728488 -// Flaky on ChromeOS http://crbug.com/1175735 -IN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, - DISABLED_CrossSitePaymentForms) { +IN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, CrossSitePaymentForms) { CreateTestCreditCart(); // Main frame is on a.com, iframe is on b.com. GURL url = embedded_test_server()->GetURL( @@ -2801,6 +2795,11 @@ "document.getElementById('CREDIT_CARD_NUMBER').focus();"); ASSERT_TRUE(content::ExecuteScript(cross_frame, script_focus)); + // Wait to make sure iframe is fully rendered. Without the wait, Chrome + // sometimes got the signal to render a dropdown at a time and coordinate + // where the trigger element was outside the view port of the website. + DoNothingAndWait(2); + // Send an arrow dow keypress in order to trigger the autofill popup. SendKeyToPageAndWait(ui::DomKey::ARROW_DOWN, {ObservedUiEvents::kSuggestionShown});
diff --git a/chrome/browser/browser_process_platform_part_chromeos.cc b/chrome/browser/browser_process_platform_part_chromeos.cc index f198517..39fa5ef0 100644 --- a/chrome/browser/browser_process_platform_part_chromeos.cc +++ b/chrome/browser/browser_process_platform_part_chromeos.cc
@@ -13,6 +13,12 @@ #include "base/time/default_tick_clock.h" #include "base/time/tick_clock.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/automatic_reboot_manager.h" +#include "chrome/browser/ash/system/device_disabling_manager.h" +#include "chrome/browser/ash/system/device_disabling_manager_default_delegate.h" +#include "chrome/browser/ash/system/system_clock.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/login/saml/in_session_password_change_manager.h" #include "chrome/browser/chromeos/login/session/chrome_session_manager.h" @@ -22,12 +28,6 @@ #include "chrome/browser/chromeos/policy/system_proxy_manager.h" #include "chrome/browser/chromeos/scheduler_configuration_manager.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/chromeos/system/automatic_reboot_manager.h" -#include "chrome/browser/chromeos/system/device_disabling_manager.h" -#include "chrome/browser/chromeos/system/device_disabling_manager_default_delegate.h" -#include "chrome/browser/chromeos/system/system_clock.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/component_updater/metadata_table_chromeos.h" #include "chrome/common/chrome_switches.h" #include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chrome/browser/browser_switcher/browser_switcher_service_win.cc b/chrome/browser/browser_switcher/browser_switcher_service_win.cc index a777b53..6e51b9e5 100644 --- a/chrome/browser/browser_switcher/browser_switcher_service_win.cc +++ b/chrome/browser/browser_switcher/browser_switcher_service_win.cc
@@ -214,7 +214,7 @@ std::wstring url_string; if (ERROR_SUCCESS != key.ReadValue(kIeSiteListValue, &url_string)) return GURL(); - return GURL(base::UTF16ToUTF8(url_string)); + return GURL(base::WideToUTF8(url_string)); } void BrowserSwitcherServiceWin::OnIeemSitelistParsed(ParsedXml xml) {
diff --git a/chrome/browser/chrome_browser_main_win.cc b/chrome/browser/chrome_browser_main_win.cc index e685415..2de8d03 100644 --- a/chrome/browser/chrome_browser_main_win.cc +++ b/chrome/browser/chrome_browser_main_win.cc
@@ -148,7 +148,7 @@ class TranslationDelegate : public installer::TranslationDelegate { public: - base::string16 GetLocalizedString(int installer_string_id) override; + std::wstring GetLocalizedString(int installer_string_id) override; }; void DetectFaultTolerantHeap() { @@ -188,7 +188,7 @@ base::win::RegKey FTH_HKLM_reg(HKEY_LOCAL_MACHINE, kRegPath, kRegFlags); FTHFlags detected = FTHFlags(); - base::string16 chrome_app_compat; + std::wstring chrome_app_compat; if (FTH_HKLM_reg.ReadValue(module_path, &chrome_app_compat) == 0) { // This *usually* indicates that the fault tolerant heap is enabled. if (wcsicmp(chrome_app_compat.c_str(), kFTHData) == 0) @@ -616,10 +616,10 @@ const auto& details = install_static::InstallDetails::Get(); static crash_reporter::CrashKeyString<50> ap_value("ap"); - ap_value.Set(base::UTF16ToUTF8(details.update_ap())); + ap_value.Set(base::WideToUTF8(details.update_ap())); static crash_reporter::CrashKeyString<32> update_cohort_name("cohort-name"); - update_cohort_name.Set(base::UTF16ToUTF8(details.update_cohort_name())); + update_cohort_name.Set(base::WideToUTF8(details.update_cohort_name())); if (chrome::GetChannel() == version_info::Channel::CANARY) { content::RenderProcessHost::SetHungRendererAnalysisFunction( @@ -636,8 +636,8 @@ } void ChromeBrowserMainPartsWin::ShowMissingLocaleMessageBox() { - ui::MessageBox(NULL, base::ASCIIToUTF16(kMissingLocaleDataMessage), - base::ASCIIToUTF16(kMissingLocaleDataTitle), + ui::MessageBox(NULL, base::ASCIIToWide(kMissingLocaleDataMessage), + base::ASCIIToWide(kMissingLocaleDataTitle), MB_OK | MB_ICONERROR | MB_TOPMOST); } @@ -818,13 +818,15 @@ if (parsed_command_line.HasSwitch(switches::kHideIcons)) { // TODO(740976): This is not up-to-date and not localized. Figure out if // the --hide-icons and --show-icons switches are still used. - base::string16 cp_applet(L"Programs and Features"); + base::string16 cp_applet = STRING16_LITERAL("Programs and Features"); const base::string16 msg = l10n_util::GetStringFUTF16(IDS_HIDE_ICONS_NOT_SUPPORTED, cp_applet); const base::string16 caption = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME); const UINT flags = MB_OKCANCEL | MB_ICONWARNING | MB_TOPMOST; - if (IDOK == ui::MessageBox(NULL, msg, caption, flags)) + if (IDOK == ui::MessageBox(NULL, base::AsWString(msg), + base::AsWString(caption), flags)) { ShellExecute(NULL, NULL, L"appwiz.cpl", NULL, NULL, SW_SHOWNORMAL); + } // Exit as we are not launching the browser. return content::RESULT_CODE_NORMAL_EXIT; @@ -862,7 +864,7 @@ uninstall_cmd.AppendSwitch(installer::switches::kTriggerActiveSetup); const base::FilePath setup_exe(uninstall_cmd.GetProgram()); - const base::string16 params(uninstall_cmd.GetArgumentsString()); + const std::wstring params(uninstall_cmd.GetArgumentsString()); SHELLEXECUTEINFO sei = { sizeof(sei) }; sei.fMask = SEE_MASK_NOASYNC; @@ -879,8 +881,7 @@ return false; } -base::string16 TranslationDelegate::GetLocalizedString( - int installer_string_id) { +std::wstring TranslationDelegate::GetLocalizedString(int installer_string_id) { int resource_id = 0; switch (installer_string_id) { // HANDLE_STRING is used by the DO_STRING_MAPPING macro which is in the @@ -895,8 +896,8 @@ NOTREACHED(); } if (resource_id) - return l10n_util::GetStringUTF16(resource_id); - return base::string16(); + return base::UTF16ToWide(l10n_util::GetStringUTF16(resource_id)); + return std::wstring(); } // static
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 3ed80cb..16196723 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -413,6 +413,7 @@ #include "ash/public/cpp/tablet_mode.h" #include "chrome/app/chrome_crash_reporter_client.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/input_device_settings.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/arc/fileapi/arc_content_file_system_backend_delegate.h" @@ -434,7 +435,6 @@ #include "chrome/browser/chromeos/policy/system_features_disable_list_policy_handler.h" #include "chrome/browser/chromeos/policy/system_proxy_manager.h" #include "chrome/browser/chromeos/smb_client/fileapi/smbfs_file_system_backend_delegate.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" #include "chrome/browser/speech/tts_chromeos.h" #include "chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.h" #include "chrome/browser/ui/browser_dialogs.h" @@ -3775,15 +3775,13 @@ // TODO(wfh): Add support for more process types here. crbug.com/499523 switch (sandbox_type) { case sandbox::policy::SandboxType::kRenderer: - return base::string16(install_static::GetSandboxSidPrefix()) + - L"129201922"; + return std::wstring(install_static::GetSandboxSidPrefix()) + L"129201922"; case sandbox::policy::SandboxType::kUtility: - return base::string16(); + return std::wstring(); case sandbox::policy::SandboxType::kGpu: - return base::string16(); + return std::wstring(); case sandbox::policy::SandboxType::kPpapi: - return base::string16(install_static::GetSandboxSidPrefix()) + - L"129201925"; + return std::wstring(install_static::GetSandboxSidPrefix()) + L"129201925"; case sandbox::policy::SandboxType::kNoSandbox: case sandbox::policy::SandboxType::kNoSandboxAndElevatedPrivileges: case sandbox::policy::SandboxType::kXrCompositing:
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 2801656b..43b535a 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -547,6 +547,34 @@ "../ash/profiles/profile_helper.cc", "../ash/profiles/profile_helper.h", "../ash/reset/metrics.h", + "../ash/system/automatic_reboot_manager.cc", + "../ash/system/automatic_reboot_manager.h", + "../ash/system/automatic_reboot_manager_observer.h", + "../ash/system/breakpad_consent_watcher.cc", + "../ash/system/breakpad_consent_watcher.h", + "../ash/system/device_disabling_manager.cc", + "../ash/system/device_disabling_manager.h", + "../ash/system/device_disabling_manager_default_delegate.cc", + "../ash/system/device_disabling_manager_default_delegate.h", + "../ash/system/fake_input_device_settings.cc", + "../ash/system/fake_input_device_settings.h", + "../ash/system/input_device_settings.cc", + "../ash/system/input_device_settings.h", + "../ash/system/input_device_settings_impl_ozone.cc", + "../ash/system/pointer_device_observer.cc", + "../ash/system/pointer_device_observer.h", + "../ash/system/procfs_util.cc", + "../ash/system/procfs_util.h", + "../ash/system/system_clock.cc", + "../ash/system/system_clock.h", + "../ash/system/system_clock_observer.cc", + "../ash/system/system_clock_observer.h", + "../ash/system/timezone_resolver_manager.cc", + "../ash/system/timezone_resolver_manager.h", + "../ash/system/timezone_util.cc", + "../ash/system/timezone_util.h", + "../ash/system/user_removal_manager.cc", + "../ash/system/user_removal_manager.h", "android_sms/android_sms_app_manager.cc", "android_sms/android_sms_app_manager.h", "android_sms/android_sms_app_manager_impl.cc", @@ -2832,34 +2860,6 @@ "sync/split_settings_sync_field_trial.h", "sync/turn_sync_on_helper.cc", "sync/turn_sync_on_helper.h", - "system/automatic_reboot_manager.cc", - "system/automatic_reboot_manager.h", - "system/automatic_reboot_manager_observer.h", - "system/breakpad_consent_watcher.cc", - "system/breakpad_consent_watcher.h", - "system/device_disabling_manager.cc", - "system/device_disabling_manager.h", - "system/device_disabling_manager_default_delegate.cc", - "system/device_disabling_manager_default_delegate.h", - "system/fake_input_device_settings.cc", - "system/fake_input_device_settings.h", - "system/input_device_settings.cc", - "system/input_device_settings.h", - "system/input_device_settings_impl_ozone.cc", - "system/pointer_device_observer.cc", - "system/pointer_device_observer.h", - "system/procfs_util.cc", - "system/procfs_util.h", - "system/system_clock.cc", - "system/system_clock.h", - "system/system_clock_observer.cc", - "system/system_clock_observer.h", - "system/timezone_resolver_manager.cc", - "system/timezone_resolver_manager.h", - "system/timezone_util.cc", - "system/timezone_util.h", - "system/user_removal_manager.cc", - "system/user_removal_manager.h", "system_logs/command_line_log_source.cc", "system_logs/command_line_log_source.h", "system_logs/crosapi_system_log_source.cc", @@ -3437,6 +3437,10 @@ "../ash/app_mode/web_app/web_kiosk_app_launcher_unittest.cc", "../ash/assistant/assistant_util_unittest.cc", "../ash/mobile/mobile_activator_unittest.cc", + "../ash/system/automatic_reboot_manager_unittest.cc", + "../ash/system/device_disabling_manager_unittest.cc", + "../ash/system/procfs_util_unittest.cc", + "../ash/system/user_removal_manager_unittest.cc", "../download/notification/download_item_notification_unittest.cc", "../extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc", "../extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc", @@ -4052,10 +4056,6 @@ "startup_settings_cache_unittest.cc", "sync/os_sync_util_unittest.cc", "sync/turn_sync_on_helper_unittest.cc", - "system/automatic_reboot_manager_unittest.cc", - "system/device_disabling_manager_unittest.cc", - "system/procfs_util_unittest.cc", - "system/user_removal_manager_unittest.cc", "system_logs/crosapi_system_log_source_unittest.cc", "system_logs/shill_log_source_unittest.cc", "system_logs/single_debug_daemon_log_source_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/intent_helper/arc_settings_service.cc b/chrome/browser/chromeos/arc/intent_helper/arc_settings_service.cc index 93deaa9..e56729e3 100644 --- a/chrome/browser/chromeos/arc/intent_helper/arc_settings_service.cc +++ b/chrome/browser/chromeos/arc/intent_helper/arc_settings_service.cc
@@ -16,12 +16,12 @@ #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/values.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/arc/policy/arc_policy_util.h" #include "chrome/browser/chromeos/arc/session/arc_session_manager.h" #include "chrome/browser/chromeos/settings/stats_reporting_controller.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profiles_state.h" #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
diff --git a/chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing.cc b/chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing.cc index ec8a1e6..f34e5fc2 100644 --- a/chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing.cc +++ b/chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing.cc
@@ -111,7 +111,7 @@ // Releasing resources in DTOR is not safe, see |Shutdown|. ArcAppPerformanceTracing::~ArcAppPerformanceTracing() { if (arc_active_window_) { - exo::Surface* const surface = exo::GetShellMainSurface(arc_active_window_); + exo::Surface* const surface = exo::GetShellRootSurface(arc_active_window_); // Surface might be destroyed. if (surface) surface->RemoveSurfaceObserver(this); @@ -412,7 +412,7 @@ arc_active_window_ = window; arc_active_window_->AddObserver(this); - exo::Surface* const surface = exo::GetShellMainSurface(window); + exo::Surface* const surface = exo::GetShellRootSurface(window); DCHECK(surface); surface->AddSurfaceObserver(this); } @@ -421,7 +421,7 @@ if (!arc_active_window_) return; - exo::Surface* const surface = exo::GetShellMainSurface(arc_active_window_); + exo::Surface* const surface = exo::GetShellRootSurface(arc_active_window_); // Surface might be destroyed. if (surface) surface->RemoveSurfaceObserver(this);
diff --git a/chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing_session.cc b/chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing_session.cc index 9214968..361db94 100644 --- a/chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing_session.cc +++ b/chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing_session.cc
@@ -93,7 +93,7 @@ frame_deltas_.clear(); last_commit_timestamp_ = base::Time(); - exo::Surface* const surface = exo::GetShellMainSurface(window_); + exo::Surface* const surface = exo::GetShellRootSurface(window_); DCHECK(surface); surface->AddSurfaceObserver(this); @@ -113,7 +113,7 @@ void ArcAppPerformanceTracingSession::Stop() { tracing_active_ = false; tracing_timer_.Stop(); - exo::Surface* const surface = exo::GetShellMainSurface(window_); + exo::Surface* const surface = exo::GetShellRootSurface(window_); // Surface might be destroyed. if (surface) surface->RemoveSurfaceObserver(this);
diff --git a/chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing_test_helper.cc b/chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing_test_helper.cc index a4af339cd..2455de9 100644 --- a/chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing_test_helper.cc +++ b/chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing_test_helper.cc
@@ -50,7 +50,7 @@ // Set ARC id before showing the window to be recognized in // AppServiceAppWindowLauncherController. exo::SetShellApplicationId(widget->GetNativeWindow(), window_app_id); - exo::SetShellMainSurface(widget->GetNativeWindow(), new exo::Surface()); + exo::SetShellRootSurface(widget->GetNativeWindow(), new exo::Surface()); widget->Show(); widget->Activate(); return widget;
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 3d7cdff..65c70dd5 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -42,6 +42,9 @@ #include "chrome/browser/ash/app_mode/kiosk_mode_idle_app_name_notification.h" #include "chrome/browser/ash/app_mode/web_app/web_kiosk_app_manager.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/breakpad_consent_watcher.h" +#include "chrome/browser/ash/system/input_device_settings.h" +#include "chrome/browser/ash/system/user_removal_manager.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part_chromeos.h" #include "chrome/browser/chrome_notification_types.h" @@ -119,9 +122,6 @@ #include "chrome/browser/chromeos/settings/device_settings_service.h" #include "chrome/browser/chromeos/settings/shutdown_policy_forwarder.h" #include "chrome/browser/chromeos/startup_settings_cache.h" -#include "chrome/browser/chromeos/system/breakpad_consent_watcher.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" -#include "chrome/browser/chromeos/system/user_removal_manager.h" #include "chrome/browser/chromeos/system_token_cert_db_initializer.h" #include "chrome/browser/chromeos/ui/gnubby_notification.h" #include "chrome/browser/chromeos/ui/low_disk_notification.h"
diff --git a/chrome/browser/chromeos/crostini/crosvm_metrics.h b/chrome/browser/chromeos/crostini/crosvm_metrics.h index b6d98d8..d428398 100644 --- a/chrome/browser/chromeos/crostini/crosvm_metrics.h +++ b/chrome/browser/chromeos/crostini/crosvm_metrics.h
@@ -14,7 +14,7 @@ #include "base/optional.h" #include "base/sequenced_task_runner.h" #include "base/timer/timer.h" -#include "chrome/browser/chromeos/system/procfs_util.h" +#include "chrome/browser/ash/system/procfs_util.h" namespace crostini {
diff --git a/chrome/browser/chromeos/crostini/crosvm_process_list.h b/chrome/browser/chromeos/crostini/crosvm_process_list.h index 708629f9..1040ecdc 100644 --- a/chrome/browser/chromeos/crostini/crosvm_process_list.h +++ b/chrome/browser/chromeos/crostini/crosvm_process_list.h
@@ -9,7 +9,7 @@ #include <unordered_map> #include "base/files/file_path.h" -#include "chrome/browser/chromeos/system/procfs_util.h" +#include "chrome/browser/ash/system/procfs_util.h" namespace crostini {
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc index 558a1b4d..0d5461b 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -59,6 +59,7 @@ #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/ash/assistant/assistant_util.h" +#include "chrome/browser/ash/system/input_device_settings.h" #include "chrome/browser/banners/app_banner_manager_desktop.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" @@ -84,7 +85,6 @@ #include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h" #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/chromeos/settings/stats_reporting_controller.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/policy/chrome_policy_conversions_client.h"
diff --git a/chrome/browser/chromeos/extensions/info_private_api.cc b/chrome/browser/chromeos/extensions/info_private_api.cc index 53ba8f8..177906a 100644 --- a/chrome/browser/chromeos/extensions/info_private_api.cc +++ b/chrome/browser/chromeos/extensions/info_private_api.cc
@@ -19,13 +19,13 @@ #include "base/values.h" #include "chrome/browser/app_mode/app_mode_utils.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/login/startup_utils.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/pref_names.h" #include "chromeos/network/device_state.h"
diff --git a/chrome/browser/chromeos/file_manager/file_manager_string_util.cc b/chrome/browser/chromeos/file_manager/file_manager_string_util.cc index 0503f5b..784ce94 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_string_util.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_string_util.cc
@@ -747,6 +747,8 @@ SET_STRING("OFFLINE_MESSAGE", IDS_FILE_BROWSER_OFFLINE_MESSAGE); SET_STRING("OFFLINE_MESSAGE_PLURAL", IDS_FILE_BROWSER_OFFLINE_MESSAGE_PLURAL); SET_STRING("OFFLINE_BANNER_MESSAGE", IDS_FILE_BROWSER_OFFLINE_BANNER_MESSAGE); + SET_STRING("OFFLINE_FAILURE_MESSAGE", + IDS_FILE_BROWSER_OFFLINE_FAILURE_MESSAGE); SET_STRING("OFFLINE_PROGRESS_MESSAGE", IDS_FILE_BROWSER_OFFLINE_PROGRESS_MESSAGE); SET_STRING("OFFLINE_PROGRESS_MESSAGE_PLURAL",
diff --git a/chrome/browser/chromeos/login/existing_user_controller.cc b/chrome/browser/chromeos/login/existing_user_controller.cc index 2a381cd..8588dc8 100644 --- a/chrome/browser/chromeos/login/existing_user_controller.cc +++ b/chrome/browser/chromeos/login/existing_user_controller.cc
@@ -33,6 +33,7 @@ #include "chrome/browser/ash/app_mode/kiosk_app_launch_error.h" #include "chrome/browser/ash/app_mode/kiosk_app_types.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/device_disabling_manager.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chrome_notification_types.h" @@ -62,7 +63,6 @@ #include "chrome/browser/chromeos/policy/minimum_version_policy_handler.h" #include "chrome/browser/chromeos/policy/powerwash_requirements_checker.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/chromeos/system/device_disabling_manager.h" #include "chrome/browser/net/system_network_context_manager.h" #include "chrome/browser/notifications/system_notification_helper.h" #include "chrome/browser/policy/profile_policy_connector.h"
diff --git a/chrome/browser/chromeos/login/lock/views_screen_locker.cc b/chrome/browser/chromeos/login/lock/views_screen_locker.cc index 794726e..b10e2079 100644 --- a/chrome/browser/chromeos/login/lock/views_screen_locker.cc +++ b/chrome/browser/chromeos/login/lock/views_screen_locker.cc
@@ -19,6 +19,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" +#include "chrome/browser/ash/system/system_clock.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/authpolicy/authpolicy_helper.h" @@ -30,7 +31,6 @@ #include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_factory.h" #include "chrome/browser/chromeos/login/screens/chrome_user_selection_screen.h" #include "chrome/browser/chromeos/login/user_board_view_mojo.h" -#include "chrome/browser/chromeos/system/system_clock.h" #include "chrome/browser/ui/ash/session_controller_client_impl.h" #include "chrome/browser/ui/ash/wallpaper_controller_client.h" #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/chromeos/login/screens/device_disabled_screen.h b/chrome/browser/chromeos/login/screens/device_disabled_screen.h index 5326861..4067f84a 100644 --- a/chrome/browser/chromeos/login/screens/device_disabled_screen.h +++ b/chrome/browser/chromeos/login/screens/device_disabled_screen.h
@@ -6,8 +6,8 @@ #define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_DEVICE_DISABLED_SCREEN_H_ #include "base/macros.h" +#include "chrome/browser/ash/system/device_disabling_manager.h" #include "chrome/browser/chromeos/login/screens/base_screen.h" -#include "chrome/browser/chromeos/system/device_disabling_manager.h" namespace chromeos {
diff --git a/chrome/browser/chromeos/login/screens/user_selection_screen.cc b/chrome/browser/chromeos/login/screens/user_selection_screen.cc index 3dcf4f8..37385a3 100644 --- a/chrome/browser/chromeos/login/screens/user_selection_screen.cc +++ b/chrome/browser/chromeos/login/screens/user_selection_screen.cc
@@ -23,6 +23,7 @@ #include "base/time/time.h" #include "base/values.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/system_clock.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/login/demo_mode/demo_session.h" @@ -39,7 +40,6 @@ #include "chrome/browser/chromeos/login/users/default_user_image/default_user_images.h" #include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" -#include "chrome/browser/chromeos/system/system_clock.h" #include "chrome/browser/ui/ash/login_screen_client.h" #include "chrome/browser/ui/webui/chromeos/login/l10n_util.h" #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/chromeos/login/screens/user_selection_screen.h b/chrome/browser/chromeos/login/screens/user_selection_screen.h index b04151f..7b945e6 100644 --- a/chrome/browser/chromeos/login/screens/user_selection_screen.h +++ b/chrome/browser/chromeos/login/screens/user_selection_screen.h
@@ -16,12 +16,12 @@ #include "base/time/time.h" #include "base/timer/timer.h" #include "base/values.h" +#include "chrome/browser/ash/system/system_clock.h" #include "chrome/browser/chromeos/login/saml/password_sync_token_checkers_collection.h" #include "chrome/browser/chromeos/login/screens/base_screen.h" #include "chrome/browser/chromeos/login/signin/token_handle_util.h" #include "chrome/browser/chromeos/login/ui/login_display.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/chromeos/system/system_clock.h" #include "chromeos/components/proximity_auth/screenlock_bridge.h" #include "chromeos/dbus/cryptohome/rpc.pb.h" #include "components/account_id/account_id.h"
diff --git a/chrome/browser/chromeos/login/screens/welcome_screen.cc b/chrome/browser/chromeos/login/screens/welcome_screen.cc index d0013d7..d53094c 100644 --- a/chrome/browser/chromeos/login/screens/welcome_screen.cc +++ b/chrome/browser/chromeos/login/screens/welcome_screen.cc
@@ -17,6 +17,8 @@ #include "base/time/default_tick_clock.h" #include "chrome/browser/ash/accessibility/accessibility_manager.h" #include "chrome/browser/ash/accessibility/magnification_manager.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/base/locale_util.h" #include "chrome/browser/chromeos/customization/customization_document.h" @@ -26,8 +28,6 @@ #include "chrome/browser/chromeos/login/ui/input_events_blocker.h" #include "chrome/browser/chromeos/login/wizard_controller.h" #include "chrome/browser/chromeos/policy/enrollment_requisition_manager.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/webui/chromeos/login/l10n_util.h"
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_common.cc b/chrome/browser/chromeos/login/ui/login_display_host_common.cc index 4ba7c97e..14c467c 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_common.cc +++ b/chrome/browser/chromeos/login/ui/login_display_host_common.cc
@@ -9,6 +9,7 @@ #include "base/callback_helpers.h" #include "chrome/browser/ash/app_mode/kiosk_app_types.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/device_disabling_manager.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chrome_notification_types.h" @@ -25,7 +26,6 @@ #include "chrome/browser/chromeos/login/ui/webui_accelerator_mapping.h" #include "chrome/browser/chromeos/login/wizard_controller.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" -#include "chrome/browser/chromeos/system/device_disabling_manager.h" #include "chrome/browser/ui/ash/wallpaper_controller_client.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/webui/chromeos/internet_detail_dialog.h"
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc index d03731f..44b43c5 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc +++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
@@ -33,6 +33,10 @@ #include "chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.h" #include "chrome/browser/ash/app_mode/kiosk_app_types.h" #include "chrome/browser/ash/app_mode/web_app/web_kiosk_app_manager.h" +#include "chrome/browser/ash/system/device_disabling_manager.h" +#include "chrome/browser/ash/system/input_device_settings.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chrome_notification_types.h" @@ -55,10 +59,6 @@ #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/policy/enrollment_config.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/chromeos/system/device_disabling_manager.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/lifetime/browser_shutdown.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/ash/ash_util.h"
diff --git a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc index 3f1b0d9d..29a5a33 100644 --- a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc +++ b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
@@ -35,6 +35,8 @@ #include "base/values.h" #include "chrome/browser/ash/app_mode/kiosk_app_manager.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chrome_notification_types.h" @@ -64,8 +66,6 @@ #include "chrome/browser/chromeos/policy/user_network_configuration_updater.h" #include "chrome/browser/chromeos/session_length_limiter.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/extensions/permissions_updater.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc index 9a13bc5..932ce46 100644 --- a/chrome/browser/chromeos/login/wizard_controller.cc +++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -36,6 +36,9 @@ #include "chrome/browser/ash/app_mode/kiosk_app_manager.h" #include "chrome/browser/ash/app_mode/kiosk_app_types.h" #include "chrome/browser/ash/app_mode/web_app/web_kiosk_app_manager.h" +#include "chrome/browser/ash/system/device_disabling_manager.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chrome_notification_types.h" @@ -105,9 +108,6 @@ #include "chrome/browser/chromeos/policy/enrollment_requisition_manager.h" #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/chromeos/settings/stats_reporting_controller.h" -#include "chrome/browser/chromeos/system/device_disabling_manager.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/metrics/metrics_reporting_state.h" #include "chrome/browser/policy/profile_policy_connector.h"
diff --git a/chrome/browser/chromeos/net/network_health/network_health.cc b/chrome/browser/chromeos/net/network_health/network_health.cc index 6c57561..2b69810 100644 --- a/chrome/browser/chromeos/net/network_health/network_health.cc +++ b/chrome/browser/chromeos/net/network_health/network_health.cc
@@ -65,6 +65,10 @@ auto net = mojom::Network::New(); net->mac_address = device_prop->mac_address; net->type = device_prop->type; + if (device_prop->ipv6_address) + net->ipv6_addresses.push_back(device_prop->ipv6_address->ToString()); + if (device_prop->ipv4_address) + net->ipv4_address = device_prop->ipv4_address->ToString(); if (net_prop) { net->state = ConnectionStateToNetworkState(net_prop->connection_state);
diff --git a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc index f91af7c..94e102e 100644 --- a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc +++ b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
@@ -23,6 +23,7 @@ #include "base/task/post_task.h" #include "base/task/thread_pool.h" #include "base/threading/thread_task_runner_handle.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/chromeos/attestation/attestation_ca_client.h" #include "chrome/browser/chromeos/policy/active_directory_policy_manager.h" #include "chrome/browser/chromeos/policy/adb_sideloading_allowance_mode_policy_handler.h" @@ -55,7 +56,6 @@ #include "chrome/browser/chromeos/printing/bulk_printers_calculator_factory.h" #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/chromeos/settings/device_settings_service.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/chromeos/ui/adb_sideloading_policy_change_notification.h" #include "chrome/browser/policy/device_management_service_configuration.h" #include "chrome/common/chrome_features.h"
diff --git a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc index c18d0b9..687ba33 100644 --- a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc +++ b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
@@ -45,6 +45,7 @@ #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/apps/app_service/launch_utils.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chrome_notification_types.h" @@ -78,7 +79,6 @@ #include "chrome/browser/chromeos/policy/device_network_configuration_updater.h" #include "chrome/browser/chromeos/policy/device_policy_builder.h" #include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/extensions/crx_installer.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/updater/chromeos_extension_cache_delegate.h"
diff --git a/chrome/browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc b/chrome/browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc index 8c2322e..ad92f86 100644 --- a/chrome/browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc +++ b/chrome/browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc
@@ -10,12 +10,12 @@ #include "base/macros.h" #include "base/run_loop.h" #include "base/threading/thread_task_runner_handle.h" +#include "chrome/browser/ash/system/system_clock.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/login/ui/login_display_host.h" #include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/chromeos/system/system_clock.h" #include "chrome/browser/lifetime/application_lifetime.h" #include "components/policy/proto/chrome_device_policy.pb.h" #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/chromeos/policy/dlp/clipboard_bubble.cc b/chrome/browser/chromeos/policy/dlp/clipboard_bubble.cc index fe5d0b4..0066e73 100644 --- a/chrome/browser/chromeos/policy/dlp/clipboard_bubble.cc +++ b/chrome/browser/chromeos/policy/dlp/clipboard_bubble.cc
@@ -140,6 +140,7 @@ label_->SizeToFit(kBubbleWidth - 2 * kBubblePadding - kManagedIconSize - kIconLabelSpacing); label_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); + label_->SetAutoColorReadabilityEnabled(false); // Bubble borders border_ = AddChildView(std::make_unique<views::ImageView>());
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.cc index f00c11f..135c061 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.cc
@@ -6,7 +6,7 @@ #include "base/bind.h" #include "base/time/time.h" -#include "chrome/browser/chromeos/system/user_removal_manager.h" +#include "chrome/browser/ash/system/user_removal_manager.h" #include "components/policy/core/common/remote_commands/remote_commands_service.h" #include "components/policy/proto/device_management_backend.pb.h"
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job_unittest.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job_unittest.cc index b69f8cb..ec47c0f 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job_unittest.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job_unittest.cc
@@ -17,9 +17,9 @@ #include "base/task_runner.h" #include "base/threading/sequenced_task_runner_handle.h" #include "base/time/time.h" +#include "chrome/browser/ash/system/user_removal_manager.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.h" -#include "chrome/browser/chromeos/system/user_removal_manager.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h"
diff --git a/chrome/browser/chromeos/power/process_data_collector.cc b/chrome/browser/chromeos/power/process_data_collector.cc index d52c590..4f336e9 100644 --- a/chrome/browser/chromeos/power/process_data_collector.cc +++ b/chrome/browser/chromeos/power/process_data_collector.cc
@@ -36,7 +36,7 @@ #include "base/threading/scoped_blocking_call.h" #include "base/time/time.h" #include "base/values.h" -#include "chrome/browser/chromeos/system/procfs_util.h" +#include "chrome/browser/ash/system/procfs_util.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/power/power_manager_client.h" #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc index 11ff8dfa..5449f16 100644 --- a/chrome/browser/chromeos/preferences.cc +++ b/chrome/browser/chromeos/preferences.cc
@@ -26,6 +26,9 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/ash/accessibility/magnification_manager.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/input_device_settings.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chrome_notification_types.h" @@ -40,9 +43,6 @@ #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/chromeos/sync/split_settings_sync_field_trial.h" #include "chrome/browser/chromeos/sync/turn_sync_on_helper.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/download/download_prefs.h" #include "chrome/browser/prefs/pref_service_syncable_util.h" #include "chrome/browser/ui/ash/system_tray_client.h"
diff --git a/chrome/browser/chromeos/preferences_chromeos_browsertest.cc b/chrome/browser/chromeos/preferences_chromeos_browsertest.cc index bdfeb30..35e3fa53 100644 --- a/chrome/browser/chromeos/preferences_chromeos_browsertest.cc +++ b/chrome/browser/chromeos/preferences_chromeos_browsertest.cc
@@ -11,6 +11,7 @@ #include "base/stl_util.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/fake_input_device_settings.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/input_method/input_method_manager_impl.h" #include "chrome/browser/chromeos/login/login_manager_test.h" @@ -19,7 +20,6 @@ #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/chromeos/settings/scoped_testing_cros_settings.h" #include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h" -#include "chrome/browser/chromeos/system/fake_input_device_settings.h" #include "chrome/common/pref_names.h" #include "components/feedback/tracing_manager.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/chromeos/system_logs/network_health_source.cc b/chrome/browser/chromeos/system_logs/network_health_source.cc index f71007fe..c49ae65 100644 --- a/chrome/browser/chromeos/system_logs/network_health_source.cc +++ b/chrome/browser/chromeos/system_logs/network_health_source.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "chrome/browser/chromeos/net/network_health/network_health_service.h" #include "chromeos/network/network_event_log.h" #include "content/public/browser/browser_thread.h" @@ -41,6 +42,17 @@ : "N/A") << "\n"; output << "MAC Address: " << net->mac_address.value_or("N/A") << "\n"; + + // Automatic PII scrubbing does not work for IP addresses so manually scrub + // them. + if (!scrub) { + output << "IPV4 Address: " << net->ipv4_address.value_or("N/A") << "\n"; + output << "IPV6 Addresses: " + << (net->ipv6_addresses.size() + ? base::JoinString(net->ipv6_addresses, ", ") + : "N/A"); + } + output << "\n"; } return output.str();
diff --git a/chrome/browser/component_updater/sw_reporter_installer_win.cc b/chrome/browser/component_updater/sw_reporter_installer_win.cc index abc9337..a8993ad 100644 --- a/chrome/browser/component_updater/sw_reporter_installer_win.cc +++ b/chrome/browser/component_updater/sw_reporter_installer_win.cc
@@ -208,7 +208,7 @@ return false; } - std::vector<base::string16> argv = {exe_path.value()}; + std::vector<std::wstring> argv = {exe_path.value()}; for (const auto& value : *arguments) { base::string16 argument; if (!value.GetAsString(&argument)) { @@ -216,7 +216,7 @@ return false; } if (!argument.empty()) - argv.push_back(argument); + argv.push_back(base::UTF16ToWide(argument)); } base::CommandLine command_line(argv); @@ -416,7 +416,7 @@ } void ReportUMAForLastCleanerRun() { - base::string16 cleaner_key_name = + std::wstring cleaner_key_name = chrome_cleaner::kSoftwareRemovalToolRegistryKey; cleaner_key_name.append(1, L'\\').append(chrome_cleaner::kCleanerSubKey); base::win::RegKey cleaner_key(HKEY_CURRENT_USER, cleaner_key_name.c_str(), @@ -467,10 +467,10 @@ } if (cleaner_key.HasValue(chrome_cleaner::kUploadResultsValueName)) { - base::string16 upload_results; + std::wstring upload_results; cleaner_key.ReadValue(chrome_cleaner::kUploadResultsValueName, &upload_results); - ReportUploadsWithUma(upload_results); + ReportUploadsWithUma(base::WideToUTF16(upload_results)); } } else { if (cleaner_key.HasValue(chrome_cleaner::kEndTimeValueName)) {
diff --git a/chrome/browser/diagnostics/diagnostics_writer.cc b/chrome/browser/diagnostics/diagnostics_writer.cc index b95d27f..85d5644 100644 --- a/chrome/browser/diagnostics/diagnostics_writer.cc +++ b/chrome/browser/diagnostics/diagnostics_writer.cc
@@ -13,6 +13,7 @@ #include "base/notreached.h" #include "base/stl_util.h" #include "base/strings/string16.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" @@ -77,7 +78,8 @@ bool Write(const base::string16& txt) override { DWORD sz = txt.size(); - return (TRUE == ::WriteConsoleW(std_out_, txt.c_str(), sz, &sz, NULL)); + return (TRUE == + ::WriteConsoleW(std_out_, base::as_wcstr(txt), sz, &sz, NULL)); } // Reads a string from the console. Internally it is limited to 256 @@ -85,7 +87,7 @@ void OnQuit() override { // Block here so the user can see the results. SetColor(SimpleConsole::DEFAULT); - Write(L"Press [enter] to continue\n"); + Write(STRING16_LITERAL("Press [enter] to continue\n")); wchar_t buf[256]; DWORD read = base::size(buf); ::ReadConsoleW(std_in_, buf, read, &read, NULL);
diff --git a/chrome/browser/downgrade/user_data_downgrade.cc b/chrome/browser/downgrade/user_data_downgrade.cc index 6d4599d..a40115c4 100644 --- a/chrome/browser/downgrade/user_data_downgrade.cc +++ b/chrome/browser/downgrade/user_data_downgrade.cc
@@ -26,7 +26,7 @@ #if defined(OS_WIN) // On Windows, for Unicode-aware applications, native pathnames are wchar_t // arrays encoded in UTF-16. - return base::Version(base::UTF16ToUTF8(path.BaseName().value())); + return base::Version(base::WideToUTF8(path.BaseName().value())); #elif defined(OS_POSIX) || defined(OS_FUCHSIA) // On most platforms, native pathnames are char arrays, and the encoding // may or may not be specified. On Mac OS X, native pathnames are encoded
diff --git a/chrome/browser/download/default_download_dir_policy_handler.cc b/chrome/browser/download/default_download_dir_policy_handler.cc index d825583da..2678a4a 100644 --- a/chrome/browser/download/default_download_dir_policy_handler.cc +++ b/chrome/browser/download/default_download_dir_policy_handler.cc
@@ -5,7 +5,9 @@ #include "chrome/browser/download/default_download_dir_policy_handler.h" #include "base/files/file_path.h" +#include "base/strings/utf_string_conversions.h" #include "base/values.h" +#include "build/build_config.h" #include "chrome/browser/download/download_dir_util.h" #include "chrome/common/pref_names.h" #include "components/policy/policy_constants.h" @@ -31,18 +33,31 @@ const policy::PolicyHandlerParameters& parameters, PrefValueMap* prefs) { const base::Value* value = policies.GetValue(policy_name()); - base::FilePath::StringType string_value; - if (!value || !value->GetAsString(&string_value)) + std::string str_value; + if (!value || !value->GetAsString(&str_value)) return; + base::FilePath::StringType string_value = +#if defined(OS_WIN) + base::UTF8ToWide(str_value); +#else + str_value; +#endif base::FilePath::StringType expanded_value = download_dir_util::ExpandDownloadDirectoryPath(string_value, parameters); if (policies.Get(policy_name())->level == policy::POLICY_LEVEL_RECOMMENDED) { +#if defined(OS_WIN) + prefs->SetValue(prefs::kDownloadDefaultDirectory, + base::Value(base::WideToUTF8(expanded_value))); + prefs->SetValue(prefs::kSaveFileDefaultDirectory, + base::Value(base::WideToUTF8(expanded_value))); +#else prefs->SetValue(prefs::kDownloadDefaultDirectory, base::Value(expanded_value)); prefs->SetValue(prefs::kSaveFileDefaultDirectory, base::Value(expanded_value)); +#endif // Prevents a download path set by policy from being reset because it is // dangerous. prefs->SetBoolean(prefs::kDownloadDirUpgraded, true);
diff --git a/chrome/browser/download/download_dir_policy_handler.cc b/chrome/browser/download/download_dir_policy_handler.cc index 1c7f138..4305639 100644 --- a/chrome/browser/download/download_dir_policy_handler.cc +++ b/chrome/browser/download/download_dir_policy_handler.cc
@@ -9,6 +9,7 @@ #include <memory> #include "base/files/file_path.h" +#include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -58,9 +59,15 @@ const policy::PolicyHandlerParameters& parameters, PrefValueMap* prefs) { const base::Value* value = policies.GetValue(policy_name()); - base::FilePath::StringType string_value; - if (!value || !value->GetAsString(&string_value)) + std::string str_value; + if (!value || !value->GetAsString(&str_value)) return; + base::FilePath::StringType string_value = +#if defined(OS_WIN) + base::UTF8ToWide(str_value); +#else + str_value; +#endif // Make sure the path isn't empty, since that will point to an undefined // location; the default location is used instead in that case. @@ -72,8 +79,13 @@ expanded_value = policy::path_parser::ExpandPathVariables( DownloadPrefs::GetDefaultDownloadDirectory().value()); } +#if defined(OS_WIN) + prefs->SetValue(prefs::kDownloadDefaultDirectory, + base::Value(base::WideToUTF8(expanded_value))); +#else prefs->SetValue(prefs::kDownloadDefaultDirectory, base::Value(expanded_value)); +#endif // If the policy is mandatory, prompt for download should be disabled. // Otherwise, it would enable a user to bypass the mandatory policy.
diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/browser/download/download_target_determiner.cc index 21ab458..540bc26c 100644 --- a/chrome/browser/download/download_target_determiner.cc +++ b/chrome/browser/download/download_target_determiner.cc
@@ -937,23 +937,18 @@ // Dangerous downloads receive a random intermediate name that looks like: // 'Unconfirmed <random>.crdownload'. - const base::FilePath::CharType kUnconfirmedFormatSuffix[] = - FILE_PATH_LITERAL(" %d.crdownload"); + const char kUnconfirmedFormatSuffix[] = " %d.crdownload"; // Range of the <random> uniquifier. const int kUnconfirmedUniquifierRange = 1000000; -#if defined(OS_WIN) - base::string16 unconfirmed_format = - l10n_util::GetStringUTF16(IDS_DOWNLOAD_UNCONFIRMED_PREFIX); -#else std::string unconfirmed_format = l10n_util::GetStringUTF8(IDS_DOWNLOAD_UNCONFIRMED_PREFIX); -#endif unconfirmed_format.append(kUnconfirmedFormatSuffix); - base::FilePath::StringType file_name = base::StringPrintf( - unconfirmed_format.c_str(), - base::RandInt(0, kUnconfirmedUniquifierRange)); - intermediate_path_ = local_path_.DirName().Append(file_name); + std::string file_name = + base::StringPrintf(unconfirmed_format.c_str(), + base::RandInt(0, kUnconfirmedUniquifierRange)); + intermediate_path_ = + local_path_.DirName().Append(base::FilePath::FromUTF8Unsafe(file_name)); return COMPLETE; }
diff --git a/chrome/browser/download/trusted_sources_manager_win.cc b/chrome/browser/download/trusted_sources_manager_win.cc index 12a5d2c4..e4ccf32 100644 --- a/chrome/browser/download/trusted_sources_manager_win.cc +++ b/chrome/browser/download/trusted_sources_manager_win.cc
@@ -36,8 +36,8 @@ // URLZONE_INTERNET 3 // URLZONE_UNTRUSTED 4 DWORD zone = 0; - base::string16 url16 = base::ASCIIToUTF16(url.spec()); - hr = security_manager->MapUrlToZone(url16.c_str(), &zone, 0); + std::wstring urlw = base::ASCIIToWide(url.spec()); + hr = security_manager->MapUrlToZone(urlw.c_str(), &zone, 0); if (FAILED(hr)) { LOG(ERROR) << "security_manager->MapUrlToZone failed with hr: " << std::hex << hr;
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc index cd57862d..61f1706 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc
@@ -39,6 +39,8 @@ #include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" #include "ui/views/layout/grid_layout.h" +#include "ui/views/metadata/metadata_header_macros.h" +#include "ui/views/metadata/metadata_impl_macros.h" namespace enterprise_connectors { @@ -103,6 +105,8 @@ class DeepScanningTopImageView : public DeepScanningBaseView, public views::ImageView { public: + METADATA_HEADER(DeepScanningTopImageView); + using DeepScanningBaseView::DeepScanningBaseView; void Update() { SetImage(dialog()->GetTopImage()); } @@ -114,9 +118,14 @@ } }; +BEGIN_METADATA(DeepScanningTopImageView, views::ImageView) +END_METADATA + class DeepScanningSideIconImageView : public DeepScanningBaseView, public views::ImageView { public: + METADATA_HEADER(DeepScanningSideIconImageView); + using DeepScanningBaseView::DeepScanningBaseView; void Update() { @@ -135,9 +144,14 @@ } }; +BEGIN_METADATA(DeepScanningSideIconImageView, views::ImageView) +END_METADATA + class DeepScanningSideIconSpinnerView : public DeepScanningBaseView, public views::Throbber { public: + METADATA_HEADER(DeepScanningSideIconSpinnerView); + using DeepScanningBaseView::DeepScanningBaseView; void Update() { @@ -154,9 +168,14 @@ } }; +BEGIN_METADATA(DeepScanningSideIconSpinnerView, views::Throbber) +END_METADATA + class DeepScanningMessageView : public DeepScanningBaseView, public views::Label { public: + METADATA_HEADER(DeepScanningMessageView); + using DeepScanningBaseView::DeepScanningBaseView; void Update() { @@ -171,6 +190,9 @@ } }; +BEGIN_METADATA(DeepScanningMessageView, views::Label) +END_METADATA + // static base::TimeDelta ContentAnalysisDialog::GetMinimumPendingDialogTime() { return minimum_pending_dialog_time_;
diff --git a/chrome/browser/enterprise/signals/device_info_fetcher_win.cc b/chrome/browser/enterprise/signals/device_info_fetcher_win.cc index dfd7e7e4..f89fbbb 100644 --- a/chrome/browser/enterprise/signals/device_info_fetcher_win.cc +++ b/chrome/browser/enterprise/signals/device_info_fetcher_win.cc
@@ -48,7 +48,7 @@ std::string GetSerialNumber() { base::win::WmiComputerSystemInfo sys_info = base::win::WmiComputerSystemInfo::Get(); - return base::UTF16ToUTF8(sys_info.serial_number()); + return base::WideToUTF8(sys_info.serial_number()); } // Retrieves the FQDN of the comeputer and if this fails reverts to the hostname
diff --git a/chrome/browser/extensions/active_tab_permission_granter.cc b/chrome/browser/extensions/active_tab_permission_granter.cc index cb0a9c9..0d647cf 100644 --- a/chrome/browser/extensions/active_tab_permission_granter.cc +++ b/chrome/browser/extensions/active_tab_permission_granter.cc
@@ -21,6 +21,7 @@ #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" +#include "extensions/browser/extension_util.h" #include "extensions/browser/process_manager.h" #include "extensions/common/cors_util.h" #include "extensions/common/extension.h" @@ -97,14 +98,6 @@ extension, web_contents); } -void UpdateTabSpecificCorsOriginAccessLists( - const Extension& extension, - content::BrowserContext* browser_context) { - browser_context->SetCorsOriginAccessListForOrigin( - extension.origin(), CreateCorsOriginAccessAllowList(extension), - CreateCorsOriginAccessBlockList(extension), base::DoNothing::Once()); -} - } // namespace ActiveTabPermissionGranter::ActiveTabPermissionGranter( @@ -172,7 +165,10 @@ PermissionSet new_permissions(std::move(new_apis), ManifestPermissionSet(), new_hosts.Clone(), new_hosts.Clone()); permissions_data->UpdateTabSpecificPermissions(tab_id_, new_permissions); - UpdateTabSpecificCorsOriginAccessLists(*extension, browser_context); + util::SetCorsOriginAccessListForExtension( + browser_context, *extension, + base::nullopt, // compute the `target_mode` based on the `extension` + base::DoNothing::Once()); content::NavigationEntry* navigation_entry = web_contents()->GetController().GetVisibleEntry(); @@ -249,7 +245,10 @@ ProcessManager* process_manager = ProcessManager::Get(browser_context); for (const scoped_refptr<const Extension>& extension : granted_extensions_) { extension->permissions_data()->ClearTabSpecificPermissions(tab_id_); - UpdateTabSpecificCorsOriginAccessLists(*extension, browser_context); + util::SetCorsOriginAccessListForExtension( + browser_context, *extension, + base::nullopt, // compute the `target_mode` based on the `extension` + base::DoNothing::Once()); extension_ids.push_back(extension->id()); std::set<content::RenderFrameHost*> extension_frame_hosts =
diff --git a/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc b/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc index 3cea597..15f6ad4b 100644 --- a/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc +++ b/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
@@ -75,21 +75,17 @@ base::Time time = base::Time::Now(); // Concatenate a date stamp to the filename. -#if defined(OS_POSIX) - base::FilePath::StringType filename = + std::string filename = l10n_util::GetStringFUTF8(IDS_EXPORT_BOOKMARKS_DEFAULT_FILENAME, base::TimeFormatShortDateNumeric(time)); -#elif defined(OS_WIN) - base::FilePath::StringType filename = - l10n_util::GetStringFUTF16(IDS_EXPORT_BOOKMARKS_DEFAULT_FILENAME, - base::TimeFormatShortDateNumeric(time)); -#endif - - base::i18n::ReplaceIllegalCharactersInPath(&filename, '_'); + base::FilePath path = base::FilePath::FromUTF8Unsafe(filename); + base::FilePath::StringType path_str = path.value(); + base::i18n::ReplaceIllegalCharactersInPath(&path_str, '_'); + path = base::FilePath(path_str); base::FilePath default_path; base::PathService::Get(chrome::DIR_USER_DOCUMENTS, &default_path); - return default_path.Append(filename); + return default_path.Append(path); } } // namespace
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc index e0618a9a..b8a4f9de 100644 --- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc +++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -1070,7 +1070,6 @@ ShowPermissionsDialogHelper::Show( browser_context(), web_contents, target_extension, - source_context_type() == Feature::WEBUI_CONTEXT, base::BindOnce(&DeveloperPrivateShowPermissionsDialogFunction::Finish, this)); return RespondLater();
diff --git a/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc b/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc index bb38ed5..de51c93 100644 --- a/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc +++ b/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc
@@ -7,7 +7,6 @@ #include <utility> #include "apps/saved_files_service.h" -#include "base/metrics/histogram_macros.h" #include "chrome/browser/apps/platform_apps/app_load_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/apps/app_info_dialog.h" @@ -31,22 +30,14 @@ void ShowPermissionsDialogHelper::Show(content::BrowserContext* browser_context, content::WebContents* web_contents, const Extension* extension, - bool from_webui, base::OnceClosure on_complete) { Profile* profile = Profile::FromBrowserContext(browser_context); // Show the new-style extensions dialog when it is available. It is currently // unavailable by default on Mac. if (CanPlatformShowAppInfoDialog()) { - if (from_webui) { - UMA_HISTOGRAM_ENUMERATION("Apps.AppInfoDialog.Launches", - AppInfoLaunchSource::FROM_EXTENSIONS_PAGE, - AppInfoLaunchSource::NUM_LAUNCH_SOURCES); - } - ShowAppInfoInNativeDialog(web_contents, profile, extension, std::move(on_complete)); - return; // All done. }
diff --git a/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.h b/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.h index 154ccaf..859902c 100644 --- a/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.h +++ b/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.h
@@ -29,7 +29,6 @@ static void Show(content::BrowserContext* browser_context, content::WebContents* web_contents, const Extension* extension, - bool from_webui, base::OnceClosure on_complete); private:
diff --git a/chrome/browser/extensions/api/downloads/downloads_api.cc b/chrome/browser/extensions/api/downloads/downloads_api.cc index fe266af2..b20a75d 100644 --- a/chrome/browser/extensions/api/downloads/downloads_api.cc +++ b/chrome/browser/extensions/api/downloads/downloads_api.cc
@@ -1042,14 +1042,8 @@ base::FilePath creator_suggested_filename; if (options.filename.get()) { #if defined(OS_WIN) - // Can't get filename16 from options.ToValue() because that converts it from - // std::string. - base::DictionaryValue* options_value = NULL; - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &options_value)); - base::string16 filename16; - EXTENSION_FUNCTION_VALIDATE(options_value->GetString( - kFilenameKey, &filename16)); - creator_suggested_filename = base::FilePath(filename16); + creator_suggested_filename = + base::FilePath::FromUTF8Unsafe(*options.filename); #elif defined(OS_POSIX) creator_suggested_filename = base::FilePath(*options.filename); #endif
diff --git a/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.cc b/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.cc index b682e00..d4ce667 100644 --- a/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.cc +++ b/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.cc
@@ -24,12 +24,12 @@ std::unique_ptr<DetermineFilenameParams> params( DetermineFilenameParams::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params.get()); - base::FilePath::StringType filename; + std::string filename; EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &filename)); std::string error; bool result = ExtensionDownloadsEventRouter::DetermineFilename( browser_context(), include_incognito_information(), extension()->id(), - params->download_id, base::FilePath(filename), + params->download_id, base::FilePath::FromUTF8Unsafe(filename), extensions::api::downloads::ParseFilenameConflictAction( params->conflict_action), &error);
diff --git a/chrome/browser/extensions/api/messaging/native_process_launcher.cc b/chrome/browser/extensions/api/messaging/native_process_launcher.cc index 7ff8037..2a1d6647 100644 --- a/chrome/browser/extensions/api/messaging/native_process_launcher.cc +++ b/chrome/browser/extensions/api/messaging/native_process_launcher.cc
@@ -23,6 +23,7 @@ #include "base/path_service.h" #include "base/strings/strcat.h" #include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" #include "base/task/thread_pool.h" #include "base/values.h" #include "build/build_config.h" @@ -267,7 +268,11 @@ #endif base::Value args(base::Value::Type::LIST); for (const auto& arg : reconnect_command_line.argv()) { +#if defined(OS_WIN) + args.Append(base::WideToUTF8(arg)); +#else args.Append(arg); +#endif } std::string encoded_reconnect_command; bool success =
diff --git a/chrome/browser/extensions/api/messaging/native_process_launcher_win.cc b/chrome/browser/extensions/api/messaging/native_process_launcher_win.cc index a148bcf..78e53631 100644 --- a/chrome/browser/extensions/api/messaging/native_process_launcher_win.cc +++ b/chrome/browser/extensions/api/messaging/native_process_launcher_win.cc
@@ -36,8 +36,8 @@ bool GetManifestPathWithFlagsFromSubkey(HKEY root_key, DWORD flags, const wchar_t* subkey, - const base::string16& host_name, - base::string16* result) { + const std::wstring& host_name, + std::wstring* result) { base::win::RegKey key; return key.Open(root_key, subkey, KEY_QUERY_VALUE | flags) == ERROR_SUCCESS && @@ -50,8 +50,8 @@ // false if the path isn't found. bool GetManifestPathWithFlags(HKEY root_key, DWORD flags, - const base::string16& host_name, - base::string16* result) { + const std::wstring& host_name, + std::wstring* result) { #if BUILDFLAG(CHROMIUM_BRANDING) // Try to read the path using the Chromium-specific registry for Chromium. // If that fails, fallback to Chrome-specific registry key below. @@ -67,8 +67,8 @@ } bool GetManifestPath(HKEY root_key, - const base::string16& host_name, - base::string16* result) { + const std::wstring& host_name, + std::wstring* result) { // First check 32-bit registry and then try 64-bit. return GetManifestPathWithFlags( root_key, KEY_WOW64_32KEY, host_name, result) || @@ -83,11 +83,11 @@ const std::string& host_name, bool allow_user_level_hosts, std::string* error_message) { - base::string16 host_name_wide = base::UTF8ToUTF16(host_name); + std::wstring host_name_wide = base::UTF8ToWide(host_name); // If permitted, look in HKEY_CURRENT_USER first. If the manifest isn't found // there, then try HKEY_LOCAL_MACHINE. https://crbug.com/1034919#c6 - base::string16 path_str; + std::wstring path_str; bool found = false; if (allow_user_level_hosts) found = GetManifestPath(HKEY_CURRENT_USER, host_name_wide, &path_str); @@ -129,9 +129,9 @@ uint64_t pipe_name_token; crypto::RandBytes(&pipe_name_token, sizeof(pipe_name_token)); - base::string16 out_pipe_name = base::StringPrintf( + std::wstring out_pipe_name = base::StringPrintf( L"\\\\.\\pipe\\chrome.nativeMessaging.out.%llx", pipe_name_token); - base::string16 in_pipe_name = base::StringPrintf( + std::wstring in_pipe_name = base::StringPrintf( L"\\\\.\\pipe\\chrome.nativeMessaging.in.%llx", pipe_name_token); // Create the pipes to read and write from. @@ -165,9 +165,9 @@ std::unique_ptr<wchar_t[]> comspec(new wchar_t[comspec_length]); ::GetEnvironmentVariable(L"COMSPEC", comspec.get(), comspec_length); - base::string16 command_line_string = command_line.GetCommandLineString(); + std::wstring command_line_string = command_line.GetCommandLineString(); - base::string16 command = base::StringPrintf( + std::wstring command = base::StringPrintf( L"%ls /d /c %ls < %ls > %ls", comspec.get(), command_line_string.c_str(), in_pipe_name.c_str(), out_pipe_name.c_str());
diff --git a/chrome/browser/extensions/api/page_capture/page_capture_api.cc b/chrome/browser/extensions/api/page_capture/page_capture_api.cc index ee2e182b..dc7384ab 100644 --- a/chrome/browser/extensions/api/page_capture/page_capture_api.cc +++ b/chrome/browser/extensions/api/page_capture/page_capture_api.cc
@@ -302,7 +302,7 @@ mhtml_path_); std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); - dict->SetString("mhtmlFilePath", mhtml_path_.value()); + dict->SetString("mhtmlFilePath", mhtml_path_.AsUTF8Unsafe()); dict->SetInteger("mhtmlFileLength", file_size); Respond(OneArgument(base::Value::FromUniquePtrValue(std::move(dict))));
diff --git a/chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_method_short.cc b/chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_method_short.cc index dbaadf5..d3cc53b4 100644 --- a/chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_method_short.cc +++ b/chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_method_short.cc
@@ -4,9 +4,9 @@ #include "chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_method_short.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" #include "chrome/browser/extensions/api/settings_private/generated_pref.h" #include "chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.cc b/chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.cc index 9eaea7c..8f404b82 100644 --- a/chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.cc +++ b/chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.cc
@@ -4,9 +4,9 @@ #include "chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" #include "chrome/browser/extensions/api/settings_private/generated_pref.h" #include "chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.cc b/chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.cc index 13c821c8..fbc2a3aa5 100644 --- a/chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.cc +++ b/chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.cc
@@ -4,9 +4,9 @@ #include "chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/extensions/api/settings_private.h" #include "components/user_manager/user_manager.h"
diff --git a/chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.h b/chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.h index 99ec2946..3ad6369 100644 --- a/chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.h +++ b/chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.h
@@ -8,7 +8,7 @@ #include <string> #include "base/macros.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" #include "chrome/browser/extensions/api/settings_private/generated_pref.h" class Profile;
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc index 50f8070f..ec4c176 100644 --- a/chrome/browser/extensions/api/settings_private/prefs_util.cc +++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -57,6 +57,7 @@ #include "ash/public/cpp/ambient/ambient_prefs.h" #include "ash/public/cpp/ash_pref_names.h" // nogncheck #include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/chromeos/crostini/crostini_pref_names.h" #include "chrome/browser/chromeos/full_restore/full_restore_prefs.h" #include "chrome/browser/chromeos/guest_os/guest_os_pref_names.h" @@ -66,7 +67,6 @@ #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/chromeos/settings/supervised_user_cros_settings_provider.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_method_short.h" #include "chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.h" #include "chromeos/services/assistant/public/cpp/assistant_prefs.h"
diff --git a/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc b/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc index cebbbfe..9d116ce8 100644 --- a/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc +++ b/chrome/browser/extensions/api/terminal/terminal_private_browsertest.cc
@@ -49,12 +49,12 @@ crostini_features.set_is_allowed_now(false); ExpectJsResult(script, "vmshell not allowed"); - // 'Error starting crostini for terminal: 22' when crostini is allowed. + // 'Error starting crostini for terminal: 20' when crostini is allowed. // This is the specific error we expect to see in a test environment - // (LOAD_COMPONENT_FAILED), but the point of the test is to see that we get + // (SSHFS_MOUNT_ERROR), but the point of the test is to see that we get // past the vmshell allowed checks. crostini_features.set_is_allowed_now(true); - ExpectJsResult(script, "Waiting for component update dialog response"); + ExpectJsResult(script, "Error starting crostini for terminal: 20"); // openTerminalProcess not defined. ExpectJsResult("typeof chrome.terminalPrivate.openTerminalProcess",
diff --git a/chrome/browser/extensions/content_script_apitest.cc b/chrome/browser/extensions/content_script_apitest.cc index d98ec19..5bba84bc 100644 --- a/chrome/browser/extensions/content_script_apitest.cc +++ b/chrome/browser/extensions/content_script_apitest.cc
@@ -62,52 +62,6 @@ // A fake webstore domain. const char kWebstoreDomain[] = "cws.com"; -// Check whether or not style was injected, with |expected_injection| indicating -// the expected result. Also ensure that no CSS was added to the -// document.styleSheets array. -testing::AssertionResult CheckStyleInjection(Browser* browser, - const GURL& url, - bool expected_injection) { - ui_test_utils::NavigateToURL(browser, url); - - bool css_injected = false; - if (!content::ExecuteScriptAndExtractBool( - browser->tab_strip_model()->GetActiveWebContents(), - "window.domAutomationController.send(" - " document.defaultView.getComputedStyle(document.body, null)." - " getPropertyValue('display') == 'none');", - &css_injected)) { - return testing::AssertionFailure() - << "Failed to execute script and extract bool for injection status."; - } - - if (css_injected != expected_injection) { - std::string message; - if (css_injected) - message = "CSS injected when no injection was expected."; - else - message = "CSS not injected when injection was expected."; - return testing::AssertionFailure() << message; - } - - bool css_doesnt_add_to_list = false; - if (!content::ExecuteScriptAndExtractBool( - browser->tab_strip_model()->GetActiveWebContents(), - "window.domAutomationController.send(" - " document.styleSheets.length == 0);", - &css_doesnt_add_to_list)) { - return testing::AssertionFailure() - << "Failed to execute script and extract bool for stylesheets " - "length."; - } - if (!css_doesnt_add_to_list) { - return testing::AssertionFailure() - << "CSS injection added to number of stylesheets."; - } - - return testing::AssertionSuccess(); -} - // Runs all pending tasks in the renderer associated with |web_contents|, and // then all pending tasks in the browser process. // Returns true on success. @@ -429,19 +383,65 @@ IN_PROC_BROWSER_TEST_F(ContentScriptCssInjectionTest, ContentScriptInjectsStyles) { ASSERT_TRUE(StartEmbeddedTestServer()); - ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("content_scripts") .AppendASCII("css_injection"))); - // CSS injection should be allowed on an aribitrary web page. + // Helper to get the active tab from the browser. + auto get_active_tab = [browser = browser()]() { + return browser->tab_strip_model()->GetActiveWebContents(); + }; + // Returns the background color for the element retrieved from the given + // `query_selector`. + auto get_element_color = + [&get_active_tab](const char* query_selector) -> std::string { + content::WebContents* web_contents = get_active_tab(); + SCOPED_TRACE(base::StringPrintf( + "URL: %s; Selector: %s", + web_contents->GetLastCommittedURL().spec().c_str(), query_selector)); + std::string color; + constexpr char kGetColor[] = + R"((function() { + let element = document.querySelector('%s'); + style = window.getComputedStyle(element); + domAutomationController.send(style.backgroundColor); + })();)"; + if (!content::ExecuteScriptAndExtractString( + get_active_tab(), base::StringPrintf(kGetColor, query_selector), + &color)) { + return "<Failed to execute>"; + } + + return color; + }; + // Returns the number of stylesheets attached to the document. + auto get_style_sheet_count = [&get_active_tab]() { + int count = -1; + constexpr char kGetStyleSheetCount[] = + "domAutomationController.send(document.styleSheets.length);"; + if (!content::ExecuteScriptAndExtractInt(get_active_tab(), + kGetStyleSheetCount, &count)) { + return -1; + } + return count; + }; + + // CSS injection should be allowed on an unprivileged web page that matches + // the patterns specified for the content script. GURL url = embedded_test_server()->GetURL("/extensions/test_file_with_body.html"); - EXPECT_TRUE(CheckStyleInjection(browser(), url, true)); + ui_test_utils::NavigateToURL(browser(), url); + constexpr char kInjectedBodyColor[] = "rgb(0, 0, 255)"; // Blue + EXPECT_EQ(kInjectedBodyColor, get_element_color("body")); + EXPECT_EQ(0, get_style_sheet_count()) + << "Extension-injected content scripts should not be included in " + << "document.styleSheets."; // The loaded extension has an exclude match for "extensions/test_file.html", // so no CSS should be injected. url = embedded_test_server()->GetURL("/extensions/test_file.html"); - EXPECT_TRUE(CheckStyleInjection(browser(), url, false)); + ui_test_utils::NavigateToURL(browser(), url); + EXPECT_NE(kInjectedBodyColor, get_element_color("body")); + EXPECT_EQ(0, get_style_sheet_count()); // We disallow all injection on the webstore. GURL::Replacements replacements; @@ -449,7 +449,48 @@ url = embedded_test_server() ->GetURL("/extensions/test_file_with_body.html") .ReplaceComponents(replacements); - EXPECT_TRUE(CheckStyleInjection(browser(), url, false)); + ui_test_utils::NavigateToURL(browser(), url); + EXPECT_NE(kInjectedBodyColor, get_element_color("body")); + EXPECT_EQ(0, get_style_sheet_count()); + + // Check extensions override page styles if they have more specific rules. + // Regression test for https://crbug.com/1175506. + // This page has four divs (with ids div1, div2, div3, and div4). The page + // specifies styles for them, but the extension has more specific styles for + // divs 1, 2, and 3. + // The extension styles should win by specificity, since they are in the same + // style origin ("author"). + url = embedded_test_server()->GetURL("/extensions/test_file_with_style.html"); + ui_test_utils::NavigateToURL(browser(), url); + constexpr char kInjectedDivColor[] = "rgb(0, 0, 255)"; // Blue + constexpr char kOriginalDivColor[] = "rgb(255, 0, 0)"; // Red + EXPECT_EQ(kInjectedDivColor, get_element_color("#div1")); + EXPECT_EQ(kInjectedDivColor, get_element_color("#div2")); + EXPECT_EQ(kInjectedDivColor, get_element_color("#div3")); + EXPECT_EQ(kOriginalDivColor, get_element_color("#div4")); + // There should be two style sheets on this website; one inline <style> tag + // and a second included as a <link>. + EXPECT_EQ(2, get_style_sheet_count()); + + // Load an additional stylesheet dynamically (ensuring it was added to the DOM + // later). div3 should still be styled by the extension (since that rule is + // more specific). This ensures that stylesheets that just happen to be added + // later don't override extension sheets of higher specificity. + constexpr char kLoadExtraStylesheet[] = + R"((function() { + let sheet = document.createElement('link'); + sheet.type = 'text/css'; + sheet.rel = 'stylesheet'; + sheet.href = 'test_file_with_style2.css'; + sheet.onload = () => { domAutomationController.send('success'); }; + sheet.onerror = () => { domAutomationController.send('error'); }; + document.head.appendChild(sheet); + })();)"; + std::string result; + ASSERT_TRUE(content::ExecuteScriptAndExtractString( + get_active_tab(), kLoadExtraStylesheet, &result)); + EXPECT_EQ("success", result); + EXPECT_EQ(kInjectedDivColor, get_element_color("#div3")); } IN_PROC_BROWSER_TEST_F(ContentScriptApiTest, ContentScriptCSSLocalization) {
diff --git a/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc b/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc index 7535c167..d41b0d1 100644 --- a/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc +++ b/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc
@@ -2319,10 +2319,7 @@ SCOPED_TRACE("Regular profile's background page"); std::string fetch_result = FetchViaBackgroundPage( cross_site_resource, extension, regular_profile); - // TODO(lukasza): Unexpectedly the permission is granted to both the - // `regular_profile` and the `incognito_profile` background page. Once - // this is fixed, change EXPECT_NE to EXPECT_EQ below. - EXPECT_NE(kCorsErrorWhenFetching, fetch_result); + EXPECT_EQ(kCorsErrorWhenFetching, fetch_result); } { SCOPED_TRACE("Incognito profile's background page"); @@ -2443,10 +2440,7 @@ SCOPED_TRACE("Regular profile's background page"); std::string fetch_result = FetchViaBackgroundPage( incognito_resource_url, extension, regular_profile); - // TODO(https://crbug.com/1159207): Change to EXPECT_EQ after fixing how - // ActiveTab granted to an incognito window propagates to the regular - // profile's background page. - EXPECT_NE(kCorsErrorWhenFetching, fetch_result); + EXPECT_EQ(kCorsErrorWhenFetching, fetch_result); } { SCOPED_TRACE("Incognito profile's background page"); @@ -2496,7 +2490,9 @@ SCOPED_TRACE("Regular profile's background page"); std::string fetch_result = FetchViaBackgroundPage( incognito_resource_url, extension, regular_profile); - EXPECT_EQ(kCorsErrorWhenFetching, fetch_result); + // TODO(https://crbug.com/1167262): Change to EXPECT_EQ after fixing the + // leak of permissions from incognito profile to regular profile. + EXPECT_NE(kCorsErrorWhenFetching, fetch_result); } } }
diff --git a/chrome/browser/extensions/extension_webkit_preferences.cc b/chrome/browser/extensions/extension_webkit_preferences.cc index 935c8e5..93ef5bb 100644 --- a/chrome/browser/extensions/extension_webkit_preferences.cc +++ b/chrome/browser/extensions/extension_webkit_preferences.cc
@@ -6,6 +6,7 @@ #include "base/command_line.h" #include "chrome/common/chrome_switches.h" +#include "extensions/common/constants.h" #include "extensions/common/extension.h" #include "extensions/common/manifest.h" #include "third_party/blink/public/common/web_preferences/web_preferences.h" @@ -41,6 +42,17 @@ false; } + // Prevent font size preferences from affecting the PDF Viewer extension. + if (extension->id() == extension_misc::kPdfExtensionId) { + blink::web_pref::WebPreferences default_prefs; + webkit_prefs->default_font_size = default_prefs.default_font_size; + webkit_prefs->default_fixed_font_size = + default_prefs.default_fixed_font_size; + webkit_prefs->minimum_font_size = default_prefs.minimum_font_size; + webkit_prefs->minimum_logical_font_size = + default_prefs.minimum_logical_font_size; + } + // Enable WebGL features that regular pages can't access, since they add // more risk of fingerprinting. webkit_prefs->privileged_webgl_extensions_enabled = true;
diff --git a/chrome/browser/extensions/external_pref_loader.cc b/chrome/browser/extensions/external_pref_loader.cc index 047cbb1..18f5867 100644 --- a/chrome/browser/extensions/external_pref_loader.cc +++ b/chrome/browser/extensions/external_pref_loader.cc
@@ -414,7 +414,7 @@ const std::string id = #if defined(OS_WIN) - base::UTF16ToASCII( + base::WideToASCII( extension_candidate_path.RemoveExtension().BaseName().value()); #elif defined(OS_POSIX) extension_candidate_path.RemoveExtension().BaseName().value();
diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc index 0b7a05e5..9138b10 100644 --- a/chrome/browser/extensions/external_provider_impl.cc +++ b/chrome/browser/extensions/external_provider_impl.cc
@@ -257,7 +257,7 @@ continue; } - base::FilePath::StringType external_crx; + std::string external_crx; const base::Value* external_version_value = nullptr; std::string external_version; std::string external_update_url; @@ -414,7 +414,9 @@ << "extensions from crx files."; continue; } - if (external_crx.find(base::FilePath::kParentDirectory) != + + base::FilePath path = base::FilePath::FromUTF8Unsafe(external_crx); + if (path.value().find(base::FilePath::kParentDirectory) != base::StringPiece::npos) { install_stage_tracker->ReportFailure( extension_id, InstallStageTracker::FailureReason:: @@ -426,7 +428,7 @@ // If the path is relative, and the provider has a base path, // build the absolute path to the crx file. - base::FilePath path(external_crx); + if (!path.IsAbsolute()) { base::FilePath base_path = loader_->GetBaseCrxFilePath(); if (base_path.empty()) { @@ -437,7 +439,7 @@ << " is relative. An absolute path is required."; continue; } - path = base_path.Append(external_crx); + path = base_path.Append(path); } base::Version version(external_version);
diff --git a/chrome/browser/extensions/external_registry_loader_win.cc b/chrome/browser/extensions/external_registry_loader_win.cc index c35cd24..2b127cdc 100644 --- a/chrome/browser/extensions/external_registry_loader_win.cc +++ b/chrome/browser/extensions/external_registry_loader_win.cc
@@ -32,20 +32,19 @@ namespace { // The Registry subkey that contains information about external extensions. -const base::char16 kRegistryExtensions[] = - L"Software\\Google\\Chrome\\Extensions"; +const wchar_t kRegistryExtensions[] = L"Software\\Google\\Chrome\\Extensions"; // Registry value of the key that defines the installation parameter. -const base::char16 kRegistryExtensionInstallParam[] = L"install_parameter"; +const wchar_t kRegistryExtensionInstallParam[] = L"install_parameter"; // Registry value of the key that defines the path to the .crx file. -const base::char16 kRegistryExtensionPath[] = L"path"; +const wchar_t kRegistryExtensionPath[] = L"path"; // Registry value of that key that defines the current version of the .crx file. -const base::char16 kRegistryExtensionVersion[] = L"version"; +const wchar_t kRegistryExtensionVersion[] = L"version"; // Registry value of the key that defines an external update URL. -const base::char16 kRegistryExtensionUpdateUrl[] = L"update_url"; +const wchar_t kRegistryExtensionUpdateUrl[] = L"update_url"; bool CanOpenFileForReading(const base::FilePath& path) { // Note: Because this ScopedFILE is used on the stack and not passed around @@ -83,7 +82,7 @@ auto prefs = std::make_unique<base::DictionaryValue>(); // A map of IDs, to weed out duplicates between HKCU and HKLM. - std::set<base::string16> keys; + std::set<std::wstring> keys; base::win::RegistryKeyIterator iterator_machine_key( HKEY_LOCAL_MACHINE, kRegistryExtensions, @@ -98,10 +97,9 @@ // Iterate over the keys found, first trying HKLM, then HKCU, as per Windows // policy conventions. We only fall back to HKCU if the HKLM key cannot be // opened, not if the data within the key is invalid, for example. - for (std::set<base::string16>::const_iterator it = keys.begin(); - it != keys.end(); ++it) { + for (auto it = keys.begin(); it != keys.end(); ++it) { base::win::RegKey key; - base::string16 key_path = kRegistryExtensions; + std::wstring key_path = kRegistryExtensions; key_path.append(L"\\"); key_path.append(*it); if (key.Open(HKEY_LOCAL_MACHINE, @@ -114,32 +112,32 @@ continue; } - std::string id = base::ToLowerASCII(base::UTF16ToASCII(*it)); + std::string id = base::ToLowerASCII(base::WideToASCII(*it)); if (!crx_file::id_util::IdIsValid(id)) { LOG(ERROR) << "Invalid id value " << id << " for key " << key_path << "."; continue; } - base::string16 extension_dist_id; + std::wstring extension_dist_id; if (key.ReadValue(kRegistryExtensionInstallParam, &extension_dist_id) == ERROR_SUCCESS) { prefs->SetString(MakePrefName(id, ExternalProviderImpl::kInstallParam), - base::UTF16ToASCII(extension_dist_id)); + base::WideToASCII(extension_dist_id)); } // If there is an update URL present, copy it to prefs and ignore // path and version keys for this entry. - base::string16 extension_update_url; + std::wstring extension_update_url; if (key.ReadValue(kRegistryExtensionUpdateUrl, &extension_update_url) == ERROR_SUCCESS) { prefs->SetString( MakePrefName(id, ExternalProviderImpl::kExternalUpdateUrl), - base::UTF16ToASCII(extension_update_url)); + base::WideToASCII(extension_update_url)); continue; } - base::string16 extension_path_str; + std::wstring extension_path_str; if (key.ReadValue(kRegistryExtensionPath, &extension_path_str) != ERROR_SUCCESS) { // TODO(erikkay): find a way to get this into about:extensions @@ -171,7 +169,7 @@ continue; } - base::string16 extension_version; + std::wstring extension_version; if (key.ReadValue(kRegistryExtensionVersion, &extension_version) != ERROR_SUCCESS) { // TODO(erikkay): find a way to get this into about:extensions @@ -180,19 +178,17 @@ continue; } - base::Version version(base::UTF16ToASCII(extension_version)); + base::Version version(base::WideToASCII(extension_version)); if (!version.IsValid()) { LOG(ERROR) << "Invalid version value " << extension_version << " for key " << key_path << "."; continue; } - prefs->SetString( - MakePrefName(id, ExternalProviderImpl::kExternalVersion), - base::UTF16ToASCII(extension_version)); - prefs->SetString( - MakePrefName(id, ExternalProviderImpl::kExternalCrx), - extension_path_str); + prefs->SetString(MakePrefName(id, ExternalProviderImpl::kExternalVersion), + base::WideToASCII(extension_version)); + prefs->SetString(MakePrefName(id, ExternalProviderImpl::kExternalCrx), + base::AsString16(extension_path_str)); prefs->SetBoolean( MakePrefName(id, ExternalProviderImpl::kMayBeUntrusted), true);
diff --git a/chrome/browser/extensions/omnibox_focus_interactive_test.cc b/chrome/browser/extensions/omnibox_focus_interactive_test.cc index 6e52ad0f..dcf4b861 100644 --- a/chrome/browser/extensions/omnibox_focus_interactive_test.cc +++ b/chrome/browser/extensions/omnibox_focus_interactive_test.cc
@@ -15,6 +15,7 @@ #include "content/public/browser/navigation_entry.h" #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test.h" +#include "content/public/test/test_frame_navigation_observer.h" #include "content/public/test/test_navigation_observer.h" #include "extensions/browser/extension_prefs.h" #include "extensions/test/test_extension_dir.h" @@ -118,7 +119,8 @@ // navigation above from the perspective of Browser::ScheduleUIUpdate). GURL replaced_url = embedded_test_server()->GetURL("/replacement"); { - content::TestNavigationObserver nav_observer(web_contents, 1); + content::TestFrameNavigationObserver nav_observer( + web_contents->GetMainFrame()); ASSERT_TRUE(content::ExecJs( web_contents, "history.replaceState({}, '', '/replacement');")); nav_observer.Wait(); @@ -168,7 +170,8 @@ chrome.tabs.update(tab.id, { "url": url }); }); )"; - content::TestNavigationObserver nav_observer(web_contents, 1); + content::TestFrameNavigationObserver nav_observer( + web_contents->GetMainFrame()); content::ExecuteScriptAsync( web_contents, content::JsReplace(kTabsUpdateTemplate, final_ntp_url)); nav_observer.Wait(); @@ -254,7 +257,8 @@ EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER)); // pushState - content::TestNavigationObserver nav_observer(web_contents, 1); + content::TestFrameNavigationObserver nav_observer( + web_contents->GetMainFrame()); content::ExecuteScriptAsync(web_contents, "history.pushState({}, '', '/push-state')"); nav_observer.Wait(); @@ -301,7 +305,8 @@ EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER)); // Execute `location.reload()`. - content::TestNavigationObserver nav_observer(web_contents, 1); + content::TestFrameNavigationObserver nav_observer( + web_contents->GetMainFrame()); content::ExecuteScriptAsync(web_contents, "window.location.reload()"); nav_observer.Wait(); EXPECT_EQ(1, web_contents->GetController().GetEntryCount()); @@ -349,7 +354,8 @@ GURL web_url = embedded_test_server()->GetURL("/title1.html"); content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); - content::TestNavigationObserver nav_observer(web_contents, 1); + content::TestFrameNavigationObserver nav_observer( + web_contents->GetMainFrame()); ASSERT_TRUE(content::ExecuteScript( web_contents, content::JsReplace("window.location = $1", web_url))); nav_observer.Wait(); @@ -430,7 +436,8 @@ )"; GURL target_url = embedded_test_server()->GetURL("/title2.html"); { - content::TestNavigationObserver nav_observer(web_contents); + content::TestFrameNavigationObserver nav_observer( + web_contents->GetMainFrame()); ASSERT_TRUE(content::ExecuteScript( subframe, content::JsReplace(kLinkClickingScriptTemplate, target_url))); nav_observer.Wait(); @@ -444,7 +451,8 @@ // Secondary verification: Focus should move to the Omnibox after pressing the // Home button. { - content::TestNavigationObserver nav_observer(web_contents); + content::TestFrameNavigationObserver nav_observer( + web_contents->GetMainFrame()); chrome::Home(browser(), WindowOpenDisposition::CURRENT_TAB); nav_observer.Wait(); } @@ -453,9 +461,8 @@ } // Tab focus should not be stolen by the omnibox - https://crbug.com/1127220. -// TODO(crbug.com/1163630): Flaky test. IN_PROC_BROWSER_TEST_F(OmniboxFocusInteractiveTest, - DISABLED_TabFocusStealingFromMainFrame) { + TabFocusStealingFromMainFrame) { ASSERT_TRUE(embedded_test_server()->Start()); // Open the new tab, focus should be on the location bar. @@ -480,7 +487,8 @@ )"; GURL target_url = embedded_test_server()->GetURL("/title2.html"); { - content::TestNavigationObserver nav_observer(web_contents); + content::TestFrameNavigationObserver nav_observer( + web_contents->GetMainFrame()); ASSERT_TRUE(content::ExecuteScript( web_contents, content::JsReplace(kLinkClickingScriptTemplate, target_url))); @@ -495,7 +503,8 @@ // Secondary verification: Focus should move to the Omnibox after pressing the // Home button. { - content::TestNavigationObserver nav_observer(web_contents); + content::TestFrameNavigationObserver nav_observer( + web_contents->GetMainFrame()); chrome::Home(browser(), WindowOpenDisposition::CURRENT_TAB); nav_observer.Wait(); }
diff --git a/chrome/browser/extensions/permissions_updater.cc b/chrome/browser/extensions/permissions_updater.cc index 6960a9dd..a7b95c1 100644 --- a/chrome/browser/extensions/permissions_updater.cc +++ b/chrome/browser/extensions/permissions_updater.cc
@@ -184,9 +184,9 @@ // After an asynchronous call below, the helper will call // NotifyPermissionsUpdated if the profile is still valid. - browser_context->SetCorsOriginAccessListForOrigin( - extension->origin(), CreateCorsOriginAccessAllowList(*extension), - CreateCorsOriginAccessBlockList(*extension), + util::SetCorsOriginAccessListForExtension( + browser_context, *extension, + content::BrowserContext::TargetBrowserContexts::kAllRelatedContexts, base::BindOnce(&NetworkPermissionsUpdateHelper::OnOriginAccessUpdated, helper->weak_factory_.GetWeakPtr())); } @@ -212,9 +212,10 @@ helper->weak_factory_.GetWeakPtr())); for (const auto& extension : extensions) { - browser_context->SetCorsOriginAccessListForOrigin( - extension->origin(), CreateCorsOriginAccessAllowList(*extension), - CreateCorsOriginAccessBlockList(*extension), barrier_closure); + util::SetCorsOriginAccessListForExtension( + browser_context, *extension, + content::BrowserContext::TargetBrowserContexts::kAllRelatedContexts, + barrier_closure); } }
diff --git a/chrome/browser/first_run/first_run.cc b/chrome/browser/first_run/first_run.cc index b377bd5..3127164 100644 --- a/chrome/browser/first_run/first_run.cc +++ b/chrome/browser/first_run/first_run.cc
@@ -151,7 +151,7 @@ const base::FilePath::StringType& import_bookmarks_path_str = #if defined(OS_WIN) - base::UTF8ToUTF16(import_bookmarks_path); + base::UTF8ToWide(import_bookmarks_path); #else import_bookmarks_path; #endif
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 3353bee..3dcbe73c 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -594,6 +594,11 @@ "expiry_milestone": 88 }, { + "name": "colr-v1-fonts", + "owners": [ "drott", "layout-dev@chromium.org" ], + "expiry_milestone": 94 + }, + { "name": "composited-layer-borders", "owners": [ "ccameron" ], "expiry_milestone": 76 @@ -750,7 +755,7 @@ { "name": "crostini-enable-dlc", "owners": [ "sidereal", "davidmunro@google.com", "nverne" ], - "expiry_milestone": 92 + "expiry_milestone": 90 }, { "name": "crostini-gpu-support", @@ -770,7 +775,7 @@ { "name": "crostini-use-dlc", "owners": [ "sidereal", "davidmunro@google.com", "nverne" ], - "expiry_milestone": 92 + "expiry_milestone": 90 }, { "name": "crostini-webui-upgrader", @@ -4277,7 +4282,12 @@ { "name": "related-searches", "owners": [ "ayman", "donnd" ], - "expiry_milestone": 89 + "expiry_milestone": 92 + }, + { + "name": "related-searches-ui", + "owners": [ "ayman", "donnd" ], + "expiry_milestone": 92 }, { "name": "release-notes-notification",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 88d1ae4..f891c97 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -63,6 +63,10 @@ "Enable setting ARIA relationship attributes that reference other elements " "directly without an IDREF"; +extern const char kCOLRV1FontsName[] = "COLR v1 Fonts"; +extern const char kCOLRV1FontsDescription[] = + "Display COLR v1 color gradient vector fonts."; + const char kConditionalTabStripAndroidName[] = "Conditional Tab Strip"; const char kConditionalTabStripAndroidDescription[] = "Allows users to access conditional tab strip."; @@ -2651,10 +2655,6 @@ "whether policies have been applied to this browser at the profile or " "machine level."; -const char kAndroidMultipleDisplayName[] = "Multiple Display"; -const char kAndroidMultipleDisplayDescription[] = - "When enabled, tabs can be moved to the secondary display."; - const char kAndroidSurfaceControlName[] = "Android SurfaceControl"; const char kAndroidSurfaceControlDescription[] = " Enables SurfaceControl to manage the buffer queue for the " @@ -3166,10 +3166,15 @@ const char kRelatedSearchesName[] = "Enables an experiment for Related Searches on Android"; const char kRelatedSearchesDescription[] = - "Enables displaying related searches in a UI surface for experimentation " - "purposes. This may have privacy implications so do not enable unless " - "you have no privacy worries about sending page content and URLs to " - "Google!"; + "Enables requesting related searches suggestions. These will be requested " + "but not shown unless the UI flag is also enabled."; + +const char kRelatedSearchesUiName[] = + "Forces showing of the Related Searches UI on Android"; +const char kRelatedSearchesUiDescription[] = + "Forces the Related Searches UI and underlying requests to be enabled " + "regardless of whether they are safe or useful. This requires the Related " + "Searches feature flag to also be enabled."; const char kReportFeedUserActionsName[] = "Enable the report of click actions on cards in Chrome's Feed on Android.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 83aabe1..94501d9 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -77,6 +77,9 @@ extern const char kAriaElementReflectionName[]; extern const char kAriaElementReflectionDescription[]; +extern const char kCOLRV1FontsName[]; +extern const char kCOLRV1FontsDescription[]; + extern const char kConversionMeasurementApiName[]; extern const char kConversionMeasurementApiDescription[]; @@ -1541,9 +1544,6 @@ extern const char kAndroidManagedByMenuItemName[]; extern const char kAndroidManagedByMenuItemDescription[]; -extern const char kAndroidMultipleDisplayName[]; -extern const char kAndroidMultipleDisplayDescription[]; - extern const char kAndroidPartnerCustomizationPhenotypeName[]; extern const char kAndroidPartnerCustomizationPhenotypeDescription[]; @@ -1833,6 +1833,9 @@ extern const char kRelatedSearchesName[]; extern const char kRelatedSearchesDescription[]; +extern const char kRelatedSearchesUiName[]; +extern const char kRelatedSearchesUiDescription[]; + extern const char kReportFeedUserActionsName[]; extern const char kReportFeedUserActionsDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 0819490..4ed1114 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -127,7 +127,6 @@ &kAndroidDefaultBrowserPromo, &kAndroidLayoutChangeTabReparenting, &kAndroidManagedByMenuItem, - &kAndroidMultipleDisplay, &kAndroidPartnerCustomizationPhenotype, &kAndroidSearchEngineChoiceNotification, &kAssistantIntentExperimentId, @@ -202,6 +201,7 @@ &kReaderModeInCCT, &kReengagementNotification, &kRelatedSearches, + &kRelatedSearchesUi, &kSearchEnginePromoExistingDevice, &kSearchEnginePromoNewDevice, &kServiceManagerForBackgroundPrefetch, @@ -328,9 +328,6 @@ const base::Feature kAndroidManagedByMenuItem{"AndroidManagedByMenuItem", base::FEATURE_ENABLED_BY_DEFAULT}; -const base::Feature kAndroidMultipleDisplay{"AndroidMultipleDisplay", - base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kAllowNewIncognitoTabIntents{ "AllowNewIncognitoTabIntents", base::FEATURE_ENABLED_BY_DEFAULT}; @@ -577,6 +574,9 @@ const base::Feature kRelatedSearches{"RelatedSearches", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kRelatedSearchesUi{"RelatedSearchesUi", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kServiceManagerForBackgroundPrefetch{ "ServiceManagerForBackgroundPrefetch", base::FEATURE_ENABLED_BY_DEFAULT}; @@ -609,7 +609,7 @@ "TabEngagementReportingAndroid", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kTabGroupsAndroid{"TabGroupsAndroid", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kTabGroupsContinuationAndroid{ "TabGroupsContinuationAndroid", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -618,7 +618,7 @@ "TabGroupsUiImprovementsAndroid", base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kTabGridLayoutAndroid{"TabGridLayoutAndroid", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kTabReparenting{"TabReparenting", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index a8aa4d2..dbbe88b 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -18,7 +18,6 @@ extern const base::Feature kAndroidDefaultBrowserPromo; extern const base::Feature kAndroidLayoutChangeTabReparenting; extern const base::Feature kAndroidManagedByMenuItem; -extern const base::Feature kAndroidMultipleDisplay; extern const base::Feature kAndroidPartnerCustomizationPhenotype; extern const base::Feature kAndroidSearchEngineChoiceNotification; extern const base::Feature kAssistantIntentExperimentId; @@ -100,6 +99,7 @@ extern const base::Feature kReengagementNotification; extern const base::Feature kReaderModeInCCT; extern const base::Feature kRelatedSearches; +extern const base::Feature kRelatedSearchesUi; extern const base::Feature kSearchEnginePromoExistingDevice; extern const base::Feature kSearchEnginePromoNewDevice; extern const base::Feature kServiceManagerForBackgroundPrefetch;
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java index b019e0b..e414df3e 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
@@ -75,7 +75,7 @@ put(ChromeFeatureList.TEST_DEFAULT_DISABLED, false); put(ChromeFeatureList.TEST_DEFAULT_ENABLED, true); put(ChromeFeatureList.REPORT_FEED_USER_ACTIONS, false); - put(ChromeFeatureList.INTEREST_FEED_V2, false); + put(ChromeFeatureList.INTEREST_FEED_V2, true); put(ChromeFeatureList.TABBED_APP_OVERFLOW_MENU_ICONS, false); put(ChromeFeatureList.TABBED_APP_OVERFLOW_MENU_REGROUP, false); put(ChromeFeatureList.TABBED_APP_OVERFLOW_MENU_THREE_BUTTON_ACTIONBAR, false);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index 72a8fdf..6914ca9 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -210,7 +210,6 @@ public static final String ANDROID_LAYOUT_CHANGE_TAB_REPARENT = "AndroidLayoutChangeTabReparenting"; public static final String ANDROID_MANAGED_BY_MENU_ITEM = "AndroidManagedByMenuItem"; - public static final String ANDROID_MULTIPLE_DISPLAY = "AndroidMultipleDisplay"; public static final String ANDROID_PARTNER_CUSTOMIZATION_PHENOTYPE = "AndroidPartnerCustomizationPhenotype"; public static final String ANDROID_SEARCH_ENGINE_CHOICE_NOTIFICATION = @@ -405,6 +404,7 @@ public static final String RECOVER_FROM_NEVER_SAVE_ANDROID = "RecoverFromNeverSaveAndroid"; public static final String REENGAGEMENT_NOTIFICATION = "ReengagementNotification"; public static final String RELATED_SEARCHES = "RelatedSearches"; + public static final String RELATED_SEARCHES_UI = "RelatedSearchesUi"; public static final String REPORT_FEED_USER_ACTIONS = "ReportFeedUserActions"; public static final String SAFETY_CHECK_ANDROID = "SafetyCheckAndroid"; public static final String SAFE_BROWSING_DELAYED_WARNINGS = "SafeBrowsingDelayedWarnings";
diff --git a/chrome/browser/google/google_brand.cc b/chrome/browser/google/google_brand.cc index 6a48645d..be54463d 100644 --- a/chrome/browser/google/google_brand.cc +++ b/chrome/browser/google/google_brand.cc
@@ -49,10 +49,10 @@ // Omnibox.CharTypedToRepaintLatency. static const base::NoDestructor<base::Optional<std::string>> brand_code( []() -> base::Optional<std::string> { - base::string16 brand16; - if (!GoogleUpdateSettings::GetBrand(&brand16)) + std::wstring brandw; + if (!GoogleUpdateSettings::GetBrand(&brandw)) return base::nullopt; - return base::UTF16ToASCII(brand16); + return base::WideToASCII(brandw); }()); if (!brand_code->has_value()) return false; @@ -61,10 +61,10 @@ } bool GetReactivationBrand(std::string* brand) { - base::string16 brand16; - bool ret = GoogleUpdateSettings::GetReactivationBrand(&brand16); + std::wstring brandw; + bool ret = GoogleUpdateSettings::GetReactivationBrand(&brandw); if (ret) - brand->assign(base::UTF16ToASCII(brand16)); + brand->assign(base::WideToASCII(brandw)); return ret; }
diff --git a/chrome/browser/icon_loader_win.cc b/chrome/browser/icon_loader_win.cc index a6c4d17c..502264a4 100644 --- a/chrome/browser/icon_loader_win.cc +++ b/chrome/browser/icon_loader_win.cc
@@ -10,6 +10,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/files/file_path.h" +#include "base/strings/string_util.h" #include "base/task/thread_pool.h" #include "base/threading/thread.h" #include "chrome/browser/win/icon_reader_service.h" @@ -116,16 +117,17 @@ const base::string16& group) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + std::wstring icon_group = base::AsWString(group); if (icon.isNull()) { - std::move(finally_).Run(std::move(default_icon_), group); + std::move(finally_).Run(std::move(default_icon_), icon_group); } else { gfx::Image image(icon); - std::move(finally_).Run(std::move(image), group); + std::move(finally_).Run(std::move(image), icon_group); } } // Must be called in a COM context. |group| should be a file extension. -gfx::Image GetIconForFileExtension(base::string16 group, +gfx::Image GetIconForFileExtension(const std::wstring& group, IconLoader::IconSize icon_size) { int size = 0; switch (icon_size) {
diff --git a/chrome/browser/install_verification/win/module_info.h b/chrome/browser/install_verification/win/module_info.h index cdc6aaf..6a6ad7b 100644 --- a/chrome/browser/install_verification/win/module_info.h +++ b/chrome/browser/install_verification/win/module_info.h
@@ -7,7 +7,7 @@ #include <stdint.h> -#include "base/strings/string16.h" +#include <string> // Represents and facilitates operations on the address range corresponding to a // loaded module. @@ -15,7 +15,7 @@ ModuleInfo() : base_address(0), size(0) { } - ModuleInfo(const base::char16* const module_name, + ModuleInfo(const wchar_t* const module_name, uintptr_t module_base_address, uint32_t module_size) : name(module_name), @@ -32,7 +32,7 @@ return address >= base_address && address < base_address + size; } - base::string16 name; + std::wstring name; uintptr_t base_address; uint32_t size; };
diff --git a/chrome/browser/loader/cors_origin_access_list_browsertest.cc b/chrome/browser/loader/cors_origin_access_list_browsertest.cc index 6f95a60..6f176bd7 100644 --- a/chrome/browser/loader/cors_origin_access_list_browsertest.cc +++ b/chrome/browser/loader/cors_origin_access_list_browsertest.cc
@@ -83,6 +83,7 @@ base::RunLoop run_loop; browser()->profile()->SetCorsOriginAccessListForOrigin( + content::BrowserContext::TargetBrowserContexts::kSingleContext, url::Origin::Create(embedded_test_server()->base_url().GetOrigin()), std::move(list), std::vector<network::mojom::CorsOriginPatternPtr>(), run_loop.QuitClosure()); @@ -98,6 +99,7 @@ base::RunLoop run_loop; browser()->profile()->SetCorsOriginAccessListForOrigin( + content::BrowserContext::TargetBrowserContexts::kSingleContext, url::Origin::Create( embedded_test_server()->GetURL(kTestHost, "/").GetOrigin()), std::move(list), std::vector<network::mojom::CorsOriginPatternPtr>(),
diff --git a/chrome/browser/media_galleries/media_galleries_preferences.cc b/chrome/browser/media_galleries/media_galleries_preferences.cc index cc17fff..f003f9c 100644 --- a/chrome/browser/media_galleries/media_galleries_preferences.cc +++ b/chrome/browser/media_galleries/media_galleries_preferences.cc
@@ -222,7 +222,7 @@ MediaGalleryPrefId pref_id; base::string16 display_name; std::string device_id; - base::FilePath::StringType path; + std::string path; MediaGalleryPrefInfo::Type type = MediaGalleryPrefInfo::kInvalidType; base::string16 volume_label; base::string16 vendor_name; @@ -268,7 +268,7 @@ out_gallery_info->pref_id = pref_id; out_gallery_info->display_name = display_name; out_gallery_info->device_id = device_id; - out_gallery_info->path = base::FilePath(path); + out_gallery_info->path = base::FilePath::FromUTF8Unsafe(path); out_gallery_info->type = type; out_gallery_info->volume_label = volume_label; out_gallery_info->vendor_name = vendor_name; @@ -288,7 +288,7 @@ dict->SetString(kMediaGalleriesPrefIdKey, base::NumberToString(gallery.pref_id)); dict->SetString(kMediaGalleriesDeviceIdKey, gallery.device_id); - dict->SetString(kMediaGalleriesPathKey, gallery.path.value()); + dict->SetString(kMediaGalleriesPathKey, gallery.path.AsUTF8Unsafe()); dict->SetString(kMediaGalleriesTypeKey, TypeToStringValue(gallery.type)); if (gallery.default_gallery_type != MediaGalleryPrefInfo::kNotDefault) {
diff --git a/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win.cc b/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win.cc index b691c8a..96e5634 100644 --- a/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win.cc +++ b/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win.cc
@@ -42,14 +42,14 @@ // Gets the details of the MTP partition storage specified by the // |storage_path| on the UI thread. Returns true if the storage details are // valid and returns false otherwise. -bool GetStorageInfoOnUIThread(const base::string16& storage_path, - base::string16* pnp_device_id, - base::string16* storage_object_id) { +bool GetStorageInfoOnUIThread(const std::wstring& storage_path, + std::wstring* pnp_device_id, + std::wstring* storage_object_id) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK(!storage_path.empty()); DCHECK(pnp_device_id); DCHECK(storage_object_id); - base::string16 storage_device_id; + std::wstring storage_device_id; base::RemoveChars(storage_path, L"\\\\", &storage_device_id); DCHECK(!storage_device_id.empty()); // TODO(gbillock): Take the StorageMonitor as an argument. @@ -57,7 +57,7 @@ storage_monitor::StorageMonitor::GetInstance(); DCHECK(monitor); return monitor->GetMTPStorageInfoFromDeviceId( - base::UTF16ToUTF8(storage_device_id), pnp_device_id, storage_object_id); + base::WideToUTF8(storage_device_id), pnp_device_id, storage_object_id); } // Returns the object id of the file object specified by the |file_path|, @@ -68,7 +68,7 @@ // // Returns an empty string if the device is detached while the request is in // progress or when the |file_path| is invalid. -base::string16 GetFileObjectIdFromPathOnBlockingPoolThread( +std::wstring GetFileObjectIdFromPathOnBlockingPoolThread( const MTPDeviceDelegateImplWin::StorageDeviceInfo& device_info, const base::FilePath& file_path) { DCHECK(!file_path.empty()); @@ -76,7 +76,7 @@ PortableDeviceMapService::GetInstance()->GetPortableDevice( device_info.registered_device_path); if (!device) - return base::string16(); + return std::wstring(); if (device_info.registered_device_path == file_path.value()) return device_info.storage_object_id; @@ -84,17 +84,16 @@ base::FilePath relative_path; if (!base::FilePath(device_info.registered_device_path).AppendRelativePath( file_path, &relative_path)) - return base::string16(); + return std::wstring(); - std::vector<base::string16> path_components; + std::vector<std::wstring> path_components; relative_path.GetComponents(&path_components); DCHECK(!path_components.empty()); - base::string16 parent_id(device_info.storage_object_id); - base::string16 file_object_id; + std::wstring parent_id(device_info.storage_object_id); + std::wstring file_object_id; for (size_t i = 0; i < path_components.size(); ++i) { - file_object_id = - media_transfer_protocol::GetObjectIdFromName(device, parent_id, - path_components[i]); + file_object_id = media_transfer_protocol::GetObjectIdFromName( + device, parent_id, base::AsString16(path_components[i])); if (file_object_id.empty()) break; parent_id = file_object_id; @@ -116,7 +115,7 @@ if (!device) return std::unique_ptr<MTPDeviceObjectEnumerator>(); - base::string16 object_id = + std::wstring object_id = GetFileObjectIdFromPathOnBlockingPoolThread(device_info, root); if (object_id.empty()) return std::unique_ptr<MTPDeviceObjectEnumerator>(); @@ -136,8 +135,8 @@ // |registered_device_path| specifies the registered file system root path for // the given device. bool OpenDeviceOnBlockingPoolThread( - const base::string16& pnp_device_id, - const base::string16& registered_device_path) { + const std::wstring& pnp_device_id, + const std::wstring& registered_device_path) { DCHECK(!pnp_device_id.empty()); DCHECK(!registered_device_path.empty()); Microsoft::WRL::ComPtr<IPortableDevice> device = @@ -167,7 +166,7 @@ if (!device) return base::File::FILE_ERROR_FAILED; - base::string16 object_id = + std::wstring object_id = GetFileObjectIdFromPathOnBlockingPoolThread(device_info, file_path); if (object_id.empty()) return base::File::FILE_ERROR_FAILED; @@ -228,9 +227,8 @@ if (!device) return base::File::FILE_ERROR_FAILED; - base::string16 file_object_id = - GetFileObjectIdFromPathOnBlockingPoolThread( - device_info, file_details->request_info().device_file_path); + std::wstring file_object_id = GetFileObjectIdFromPathOnBlockingPoolThread( + device_info, file_details->request_info().device_file_path); if (file_object_id.empty()) return base::File::FILE_ERROR_FAILED; @@ -283,7 +281,7 @@ } void DeletePortableDeviceOnBlockingPoolThread( - const base::string16& registered_device_path) { + const std::wstring& registered_device_path) { PortableDeviceMapService::GetInstance()->RemovePortableDevice( registered_device_path); } @@ -293,10 +291,10 @@ // Used by CreateMTPDeviceAsyncDelegate() to create the MTP device // delegate on the IO thread. void OnGetStorageInfoCreateDelegate( - const base::string16& device_location, + const std::wstring& device_location, CreateMTPDeviceAsyncDelegateCallback callback, - base::string16* pnp_device_id, - base::string16* storage_object_id, + std::wstring* pnp_device_id, + std::wstring* storage_object_id, bool succeeded) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); DCHECK(pnp_device_id); @@ -308,7 +306,7 @@ } void CreateMTPDeviceAsyncDelegate( - const base::string16& device_location, + const std::wstring& device_location, const bool read_only, CreateMTPDeviceAsyncDelegateCallback callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); @@ -317,8 +315,8 @@ DCHECK(read_only); DCHECK(!device_location.empty()); - base::string16* pnp_device_id = new base::string16; - base::string16* storage_object_id = new base::string16; + std::wstring* pnp_device_id = new std::wstring; + std::wstring* storage_object_id = new std::wstring; content::GetUIThreadTaskRunner({})->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&GetStorageInfoOnUIThread, device_location, @@ -332,9 +330,9 @@ // MTPDeviceDelegateImplWin --------------------------------------------------- MTPDeviceDelegateImplWin::StorageDeviceInfo::StorageDeviceInfo( - const base::string16& pnp_device_id, - const base::string16& registered_device_path, - const base::string16& storage_object_id) + const std::wstring& pnp_device_id, + const std::wstring& registered_device_path, + const std::wstring& storage_object_id) : pnp_device_id(pnp_device_id), registered_device_path(registered_device_path), storage_object_id(storage_object_id) { @@ -353,9 +351,9 @@ MTPDeviceDelegateImplWin::PendingTaskInfo::~PendingTaskInfo() = default; MTPDeviceDelegateImplWin::MTPDeviceDelegateImplWin( - const base::string16& registered_device_path, - const base::string16& pnp_device_id, - const base::string16& storage_object_id) + const std::wstring& registered_device_path, + const std::wstring& pnp_device_id, + const std::wstring& storage_object_id) : init_state_(UNINITIALIZED), media_task_runner_(MediaFileSystemBackend::MediaTaskRunner()), storage_device_info_(pnp_device_id,
diff --git a/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win.h b/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win.h index 324ea0d..1611a6d5 100644 --- a/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win.h +++ b/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win.h
@@ -9,6 +9,7 @@ #include <wrl/client.h> #include <memory> +#include <string> #include "base/callback.h" #include "base/containers/queue.h" @@ -16,7 +17,6 @@ #include "base/location.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" -#include "base/strings/string16.h" #include "chrome/browser/media_galleries/fileapi/mtp_device_async_delegate.h" #include "storage/browser/file_system/async_file_util.h" @@ -39,30 +39,30 @@ public: // Structure used to represent MTP device storage partition details. struct StorageDeviceInfo { - StorageDeviceInfo(const base::string16& pnp_device_id, - const base::string16& registered_device_path, - const base::string16& storage_object_id); + StorageDeviceInfo(const std::wstring& pnp_device_id, + const std::wstring& registered_device_path, + const std::wstring& storage_object_id); // The PnP Device Id, used to open the device for communication, // e.g. "\\?\usb#vid_04a9&pid_3073#12#{6ac27878-a6fa-4155-ba85-f1d4f33}". - const base::string16 pnp_device_id; + const std::wstring pnp_device_id; // The media file system root path, which is obtained during the // registration of MTP device storage partition as a file system, // e.g. "\\MTP:StorageSerial:SID-{10001,E,9823}:237483". - const base::string16 registered_device_path; + const std::wstring registered_device_path; // The MTP device storage partition object identifier, used to enumerate the // storage contents, e.g. "s10001". - const base::string16 storage_object_id; + const std::wstring storage_object_id; }; private: friend void OnGetStorageInfoCreateDelegate( - const base::string16& device_location, + const std::wstring& device_location, CreateMTPDeviceAsyncDelegateCallback callback, - base::string16* pnp_device_id, - base::string16* storage_object_id, + std::wstring* pnp_device_id, + std::wstring* storage_object_id, bool succeeded); enum InitializationState { @@ -86,9 +86,9 @@ // Defers the device initializations until the first file operation request. // Do all the initializations in EnsureInitAndRunTask() function. - MTPDeviceDelegateImplWin(const base::string16& registered_device_path, - const base::string16& pnp_device_id, - const base::string16& storage_object_id); + MTPDeviceDelegateImplWin(const std::wstring& registered_device_path, + const std::wstring& pnp_device_id, + const std::wstring& storage_object_id); // Destructed via CancelPendingTasksAndDeleteDelegate(). ~MTPDeviceDelegateImplWin() override;
diff --git a/chrome/browser/media_galleries/win/mtp_device_object_entry.cc b/chrome/browser/media_galleries/win/mtp_device_object_entry.cc index 61294ea..dc3f83e 100644 --- a/chrome/browser/media_galleries/win/mtp_device_object_entry.cc +++ b/chrome/browser/media_galleries/win/mtp_device_object_entry.cc
@@ -9,7 +9,7 @@ MTPDeviceObjectEntry::MTPDeviceObjectEntry() : is_directory(false), size(0) { } -MTPDeviceObjectEntry::MTPDeviceObjectEntry(const base::string16& object_id, +MTPDeviceObjectEntry::MTPDeviceObjectEntry(const std::wstring& object_id, const base::string16& object_name, bool is_directory, int64_t size,
diff --git a/chrome/browser/media_galleries/win/mtp_device_object_entry.h b/chrome/browser/media_galleries/win/mtp_device_object_entry.h index e182241..3ffd901 100644 --- a/chrome/browser/media_galleries/win/mtp_device_object_entry.h +++ b/chrome/browser/media_galleries/win/mtp_device_object_entry.h
@@ -17,7 +17,7 @@ // IPortableDeviceProperties::GetValues(). struct MTPDeviceObjectEntry { MTPDeviceObjectEntry(); // Necessary for STL. - MTPDeviceObjectEntry(const base::string16& object_id, + MTPDeviceObjectEntry(const std::wstring& object_id, const base::string16& object_name, bool is_directory, int64_t size, @@ -25,7 +25,7 @@ // The object identifier obtained using IEnumPortableDeviceObjectIDs::Next(), // e.g. "o299". - base::string16 object_id; + std::wstring object_id; // Friendly name of the object, e.g. "IMG_9911.jpeg". base::string16 name;
diff --git a/chrome/browser/media_galleries/win/mtp_device_object_enumerator.cc b/chrome/browser/media_galleries/win/mtp_device_object_enumerator.cc index 35e0872..869ae02 100644 --- a/chrome/browser/media_galleries/win/mtp_device_object_enumerator.cc +++ b/chrome/browser/media_galleries/win/mtp_device_object_enumerator.cc
@@ -7,6 +7,7 @@ #include "chrome/browser/media_galleries/win/mtp_device_object_enumerator.h" #include "base/check.h" +#include "base/strings/string_util.h" MTPDeviceObjectEnumerator::MTPDeviceObjectEnumerator( const MTPDeviceObjectEntries& entries) @@ -25,7 +26,7 @@ if (!HasMoreEntries()) return base::FilePath(); - return base::FilePath(object_entries_[index_].name); + return base::FilePath(base::AsWString(object_entries_[index_].name)); } int64_t MTPDeviceObjectEnumerator::Size() { @@ -49,10 +50,10 @@ return object_entries_[index_].last_modified_time; } -base::string16 MTPDeviceObjectEnumerator::GetObjectId() const { +std::wstring MTPDeviceObjectEnumerator::GetObjectId() const { DCHECK(thread_checker_.CalledOnValidThread()); if (!IsIndexReadyAndInRange()) - return base::string16(); + return std::wstring(); return object_entries_[index_].object_id; }
diff --git a/chrome/browser/media_galleries/win/mtp_device_object_enumerator.h b/chrome/browser/media_galleries/win/mtp_device_object_enumerator.h index ffb0078..1401bb8 100644 --- a/chrome/browser/media_galleries/win/mtp_device_object_enumerator.h +++ b/chrome/browser/media_galleries/win/mtp_device_object_enumerator.h
@@ -33,7 +33,7 @@ // If the current file object entry is valid, returns an non-empty object id. // Returns an empty string otherwise. - base::string16 GetObjectId() const; + std::wstring GetObjectId() const; private: // Returns true if the enumerator has more entries to traverse, false
diff --git a/chrome/browser/media_galleries/win/mtp_device_operations_util.cc b/chrome/browser/media_galleries/win/mtp_device_operations_util.cc index 5da4d5f..93c23fb 100644 --- a/chrome/browser/media_galleries/win/mtp_device_operations_util.cc +++ b/chrome/browser/media_galleries/win/mtp_device_operations_util.cc
@@ -73,7 +73,7 @@ // |parent_id| specifies the parent object identifier. Microsoft::WRL::ComPtr<IEnumPortableDeviceObjectIDs> GetDeviceObjectEnumerator( IPortableDevice* device, - const base::string16& parent_id) { + const std::wstring& parent_id) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); DCHECK(device); @@ -113,15 +113,14 @@ // no filename, try to use a friendly name instead. e.g. with MTP storage roots. base::string16 GetObjectName(IPortableDeviceValues* properties_values) { DCHECK(properties_values); - base::string16 result; - base::win::ScopedCoMem<base::char16> buffer; + base::win::ScopedCoMem<wchar_t> buffer; HRESULT hr = properties_values->GetStringValue(WPD_OBJECT_ORIGINAL_FILE_NAME, &buffer); if (FAILED(hr)) hr = properties_values->GetStringValue(WPD_OBJECT_NAME, &buffer); - if (SUCCEEDED(hr)) - result.assign(buffer); - return result; + if (FAILED(hr)) + return base::string16(); + return base::WideToUTF16(std::wstring(buffer)); } // Gets the last modified time of the object from the property key values @@ -173,7 +172,7 @@ // |is_directory|, |size|. |last_modified_time| will be filled in if possible, // but failure to get it doesn't prevent success. bool GetObjectDetails(IPortableDevice* device, - const base::string16 object_id, + const std::wstring object_id, base::string16* name, bool* is_directory, int64_t* size, @@ -244,7 +243,7 @@ // Creates an MTP device object entry for the given |device| and |object_id|. // On success, returns true and fills in |entry|. MTPDeviceObjectEntry GetMTPDeviceObjectEntry(IPortableDevice* device, - const base::string16& object_id) { + const std::wstring& object_id) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); DCHECK(device); @@ -267,7 +266,7 @@ // name in |object_name|. Leave |object_name| blank to request all entries. On // success returns true and set |object_entries|. bool GetMTPDeviceObjectEntries(IPortableDevice* device, - const base::string16& directory_object_id, + const std::wstring& directory_object_id, const base::string16& object_name, MTPDeviceObjectEntries* object_entries) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, @@ -285,8 +284,8 @@ const bool get_all_entries = object_name.empty(); for (HRESULT hr = S_OK; hr == S_OK;) { DWORD num_objects_fetched = 0; - std::unique_ptr<base::char16* []> object_ids( - new base::char16*[num_objects_to_request]); + std::unique_ptr<wchar_t*[]> object_ids( + new wchar_t*[num_objects_to_request]); hr = enum_object_ids->Next(num_objects_to_request, object_ids.get(), &num_objects_fetched); @@ -311,7 +310,7 @@ } // namespace Microsoft::WRL::ComPtr<IPortableDevice> OpenDevice( - const base::string16& pnp_device_id) { + const std::wstring& pnp_device_id) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); DCHECK(!pnp_device_id.empty()); @@ -332,10 +331,9 @@ return Microsoft::WRL::ComPtr<IPortableDevice>(); } -base::File::Error GetFileEntryInfo( - IPortableDevice* device, - const base::string16& object_id, - base::File::Info* file_entry_info) { +base::File::Error GetFileEntryInfo(IPortableDevice* device, + const std::wstring& object_id, + base::File::Info* file_entry_info) { DCHECK(device); DCHECK(!object_id.empty()); DCHECK(file_entry_info); @@ -353,14 +351,14 @@ } bool GetDirectoryEntries(IPortableDevice* device, - const base::string16& directory_object_id, + const std::wstring& directory_object_id, MTPDeviceObjectEntries* object_entries) { return GetMTPDeviceObjectEntries(device, directory_object_id, base::string16(), object_entries); } HRESULT GetFileStreamForObject(IPortableDevice* device, - const base::string16& file_object_id, + const std::wstring& file_object_id, IStream** file_stream, DWORD* optimal_transfer_size) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, @@ -410,14 +408,14 @@ : 0; } -base::string16 GetObjectIdFromName(IPortableDevice* device, - const base::string16& parent_id, - const base::string16& object_name) { +std::wstring GetObjectIdFromName(IPortableDevice* device, + const std::wstring& parent_id, + const base::string16& object_name) { MTPDeviceObjectEntries object_entries; if (!GetMTPDeviceObjectEntries(device, parent_id, object_name, &object_entries) || object_entries.empty()) - return base::string16(); + return std::wstring(); // TODO(thestig): This DCHECK can fail. Multiple MTP objects can have // the same name. Handle the situation gracefully. Refer to crbug.com/169930 // for more details.
diff --git a/chrome/browser/media_galleries/win/mtp_device_operations_util.h b/chrome/browser/media_galleries/win/mtp_device_operations_util.h index 2ff895bd..02a4144 100644 --- a/chrome/browser/media_galleries/win/mtp_device_operations_util.h +++ b/chrome/browser/media_galleries/win/mtp_device_operations_util.h
@@ -27,23 +27,22 @@ // play device ID string. On success, returns the IPortableDevice interface. // On failure, returns NULL. Microsoft::WRL::ComPtr<IPortableDevice> OpenDevice( - const base::string16& pnp_device_id); + const std::wstring& pnp_device_id); // Gets the details of the object specified by |object_id| from the given MTP // |device|. On success, returns no error (base::File::FILE_OK) and fills in // |file_entry_info|. On failure, returns the corresponding platform file error // and |file_entry_info| is not set. -base::File::Error GetFileEntryInfo( - IPortableDevice* device, - const base::string16& object_id, - base::File::Info* file_entry_info); +base::File::Error GetFileEntryInfo(IPortableDevice* device, + const std::wstring& object_id, + base::File::Info* file_entry_info); // Gets the entries of the directory specified by |directory_object_id| from // the given MTP |device|. On success, returns true and fills in // |object_entries|. On failure, returns false and |object_entries| is not // set. bool GetDirectoryEntries(IPortableDevice* device, - const base::string16& directory_object_id, + const std::wstring& directory_object_id, MTPDeviceObjectEntries* object_entries); // Gets an IStream interface to read the object content data from the |device|. @@ -52,7 +51,7 @@ // On failure, returns an error code and |file_stream| and // |optimal_transfer_size| are not set. HRESULT GetFileStreamForObject(IPortableDevice* device, - const base::string16& file_object_id, + const std::wstring& file_object_id, IStream** file_stream, DWORD* optimal_transfer_size); @@ -74,9 +73,9 @@ // Returns the identifier of the object specified by the |object_name|. // |parent_id| specifies the object's parent identifier. // |object_name| specifies the friendly name of the object. -base::string16 GetObjectIdFromName(IPortableDevice* device, - const base::string16& parent_id, - const base::string16& object_name); +std::wstring GetObjectIdFromName(IPortableDevice* device, + const std::wstring& parent_id, + const base::string16& object_name); } // namespace media_transfer_protocol
diff --git a/chrome/browser/media_galleries/win/portable_device_map_service.cc b/chrome/browser/media_galleries/win/portable_device_map_service.cc index f76ca82..5551b327 100644 --- a/chrome/browser/media_galleries/win/portable_device_map_service.cc +++ b/chrome/browser/media_galleries/win/portable_device_map_service.cc
@@ -21,7 +21,7 @@ } void PortableDeviceMapService::AddPortableDevice( - const base::string16& device_location, + const std::wstring& device_location, IPortableDevice* device) { DCHECK(!device_location.empty()); DCHECK(device); @@ -30,7 +30,7 @@ } void PortableDeviceMapService::MarkPortableDeviceForDeletion( - const base::string16& device_location) { + const std::wstring& device_location) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); DCHECK(!device_location.empty()); base::AutoLock lock(lock_); @@ -40,7 +40,7 @@ } void PortableDeviceMapService::RemovePortableDevice( - const base::string16& device_location) { + const std::wstring& device_location) { DCHECK(!device_location.empty()); base::AutoLock lock(lock_); PortableDeviceMap::const_iterator it = device_map_.find(device_location); @@ -49,7 +49,7 @@ } IPortableDevice* PortableDeviceMapService::GetPortableDevice( - const base::string16& device_location) { + const std::wstring& device_location) { DCHECK(!device_location.empty()); base::AutoLock lock(lock_); PortableDeviceMap::const_iterator it = device_map_.find(device_location);
diff --git a/chrome/browser/media_galleries/win/portable_device_map_service.h b/chrome/browser/media_galleries/win/portable_device_map_service.h index f2168f94..4f54f022 100644 --- a/chrome/browser/media_galleries/win/portable_device_map_service.h +++ b/chrome/browser/media_galleries/win/portable_device_map_service.h
@@ -9,10 +9,10 @@ #include <wrl/client.h> #include <map> +#include <string> #include "base/lazy_instance.h" #include "base/macros.h" -#include "base/strings/string16.h" #include "base/synchronization/lock.h" // PortableDeviceMapService keeps track of initialized portable device @@ -23,7 +23,7 @@ // Adds the portable |device| interface to the map service for the device // specified by the |device_location|. Called on a blocking pool thread. - void AddPortableDevice(const base::string16& device_location, + void AddPortableDevice(const std::wstring& device_location, IPortableDevice* device); // Marks the IPortableDevice interface of the device specified by the @@ -34,19 +34,19 @@ // remove the IPortableDevice interface from the map service. // // Called on the IO thread. - void MarkPortableDeviceForDeletion(const base::string16& device_location); + void MarkPortableDeviceForDeletion(const std::wstring& device_location); // Removes the IPortableDevice interface from the map service for the device // specified by the |device_location|. Callers of this function should have // already called MarkPortableDeviceForDeletion() on the IO thread. // Called on a blocking pool thread. - void RemovePortableDevice(const base::string16& device_location); + void RemovePortableDevice(const std::wstring& device_location); // Gets the IPortableDevice interface associated with the device specified // by the |device_location|. Returns NULL if the |device_location| is no // longer valid (e.g. the corresponding device is detached etc). // Called on a blocking pool thread. - IPortableDevice* GetPortableDevice(const base::string16& device_location); + IPortableDevice* GetPortableDevice(const std::wstring& device_location); private: friend struct base::LazyInstanceTraitsBase<PortableDeviceMapService>; @@ -63,7 +63,7 @@ bool scheduled_to_delete; }; - typedef std::map<const base::string16, PortableDeviceInfo> PortableDeviceMap; + typedef std::map<const std::wstring, PortableDeviceInfo> PortableDeviceMap; // Get access to this class using GetInstance() method. PortableDeviceMapService();
diff --git a/chrome/browser/memory_details_win.cc b/chrome/browser/memory_details_win.cc index 56e87cb5..f1fc41bd 100644 --- a/chrome/browser/memory_details_win.cc +++ b/chrome/browser/memory_details_win.cc
@@ -36,7 +36,7 @@ ProcessData process; process.name = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME); - process.process_name = browser_process_path.BaseName().value(); + process.process_name = browser_process_path.BaseName().AsUTF16Unsafe(); process_data_.push_back(process); } @@ -69,7 +69,7 @@ PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid)); if (!process_handle.IsValid()) continue; - if (_wcsicmp(process_data_[0].process_name.c_str(), + if (_wcsicmp(base::as_wcstr(process_data_[0].process_name), process_entry.szExeFile) != 0) { continue; }
diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc index 71557874..46769834 100644 --- a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc +++ b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
@@ -45,7 +45,7 @@ #if !defined(OS_ANDROID) #include "chrome/browser/metrics/first_web_contents_profiler.h" -#include "chrome/browser/metrics/tab_stats_tracker.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_tracker.h" #endif // !defined(OS_ANDROID) #if defined(OS_ANDROID) && defined(__arm__)
diff --git a/chrome/browser/metrics/chrome_feature_list_creator.cc b/chrome/browser/metrics/chrome_feature_list_creator.cc index be5b586e..76af130 100644 --- a/chrome/browser/metrics/chrome_feature_list_creator.cc +++ b/chrome/browser/metrics/chrome_feature_list_creator.cc
@@ -131,10 +131,10 @@ // language the user selected when downloading the installer. This // becomes our default language in the prefs. // Other platforms obey the system locale. - base::string16 install_lang; + std::wstring install_lang; if (GoogleUpdateSettings::GetLanguage(&install_lang)) { local_state_->SetString(language::prefs::kApplicationLocale, - base::UTF16ToASCII(install_lang)); + base::WideToASCII(install_lang)); } } #endif // defined(OS_WIN)
diff --git a/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc b/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc index 925f04c..e280f2d 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/metrics/chrome_metrics_service_client.h" +#include <string> + #include "base/files/file_path.h" #include "base/metrics/persistent_histogram_allocator.h" #include "base/process/process_handle.h" @@ -49,7 +51,7 @@ testing::Test::SetUp(); metrics::MetricsService::RegisterPrefs(prefs_.registry()); metrics_state_manager_ = metrics::MetricsStateManager::Create( - &prefs_, &enabled_state_provider_, base::string16(), + &prefs_, &enabled_state_provider_, std::wstring(), base::BindRepeating( &ChromeMetricsServiceClientTest::FakeStoreClientInfoBackup, base::Unretained(this)),
diff --git a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc index 6dc1748..c3e32a6 100644 --- a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc +++ b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
@@ -110,11 +110,11 @@ // Returns the name of a key under HKEY_CURRENT_USER that can be used to store // backups of metrics data. Unused except on Windows. -base::string16 GetRegistryBackupKey() { +std::wstring GetRegistryBackupKey() { #if defined(OS_WIN) return install_static::GetRegistryPath().append(L"\\StabilityMetrics"); #else - return base::string16(); + return std::wstring(); #endif }
diff --git a/chrome/browser/metrics/extensions_metrics_provider_unittest.cc b/chrome/browser/metrics/extensions_metrics_provider_unittest.cc index ac99015..37c3805 100644 --- a/chrome/browser/metrics/extensions_metrics_provider_unittest.cc +++ b/chrome/browser/metrics/extensions_metrics_provider_unittest.cc
@@ -132,7 +132,7 @@ metrics::MetricsService::RegisterPrefs(local_state.registry()); std::unique_ptr<metrics::MetricsStateManager> metrics_state_manager( metrics::MetricsStateManager::Create( - &local_state, &enabled_state_provider, base::string16(), + &local_state, &enabled_state_provider, std::wstring(), base::BindRepeating(&StoreNoClientInfoBackup), base::BindRepeating(&ReturnNoBackup))); TestExtensionsMetricsProvider extension_metrics(metrics_state_manager.get());
diff --git a/chrome/browser/metrics/tab_stats/OWNERS b/chrome/browser/metrics/tab_stats/OWNERS new file mode 100644 index 0000000..a870b13 --- /dev/null +++ b/chrome/browser/metrics/tab_stats/OWNERS
@@ -0,0 +1,3 @@ +fdoray@chromium.org +olivierli@chromium.org +sebmarchand@chromium.org
diff --git a/chrome/browser/metrics/tab_stats_data_store.cc b/chrome/browser/metrics/tab_stats/tab_stats_data_store.cc similarity index 98% rename from chrome/browser/metrics/tab_stats_data_store.cc rename to chrome/browser/metrics/tab_stats/tab_stats_data_store.cc index 7e7b5a8..363f0a36 100644 --- a/chrome/browser/metrics/tab_stats_data_store.cc +++ b/chrome/browser/metrics/tab_stats/tab_stats_data_store.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/metrics/tab_stats_data_store.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_data_store.h" #include <algorithm> #include <utility> @@ -32,8 +32,7 @@ total_tab_count_max(0U), max_tab_per_window(0U), window_count(0U), - window_count_max(0U) { -} + window_count_max(0U) {} TabStatsDataStore::TabsStats::TabsStats(const TabsStats& other) = default; TabStatsDataStore::TabStatsDataStore(PrefService* pref_service)
diff --git a/chrome/browser/metrics/tab_stats_data_store.h b/chrome/browser/metrics/tab_stats/tab_stats_data_store.h similarity index 95% rename from chrome/browser/metrics/tab_stats_data_store.h rename to chrome/browser/metrics/tab_stats/tab_stats_data_store.h index 4bd666a..b17e9ed 100644 --- a/chrome/browser/metrics/tab_stats_data_store.h +++ b/chrome/browser/metrics/tab_stats/tab_stats_data_store.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_METRICS_TAB_STATS_DATA_STORE_H_ -#define CHROME_BROWSER_METRICS_TAB_STATS_DATA_STORE_H_ +#ifndef CHROME_BROWSER_METRICS_TAB_STATS_TAB_STATS_DATA_STORE_H_ +#define CHROME_BROWSER_METRICS_TAB_STATS_TAB_STATS_DATA_STORE_H_ #include <memory> #include <vector> @@ -13,7 +13,7 @@ #include "base/optional.h" #include "base/profiler/sample_metadata.h" #include "base/sequence_checker.h" -#include "chrome/browser/metrics/tab_stats_observer.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_observer.h" #include "chrome/browser/resource_coordinator/lifecycle_unit_state.mojom.h" #include "content/public/browser/visibility.h" @@ -165,4 +165,4 @@ } // namespace metrics -#endif // CHROME_BROWSER_METRICS_TAB_STATS_DATA_STORE_H_ +#endif // CHROME_BROWSER_METRICS_TAB_STATS_TAB_STATS_DATA_STORE_H_
diff --git a/chrome/browser/metrics/tab_stats_data_store_unittest.cc b/chrome/browser/metrics/tab_stats/tab_stats_data_store_unittest.cc similarity index 98% rename from chrome/browser/metrics/tab_stats_data_store_unittest.cc rename to chrome/browser/metrics/tab_stats/tab_stats_data_store_unittest.cc index bfa8c29b..ee46e11 100644 --- a/chrome/browser/metrics/tab_stats_data_store_unittest.cc +++ b/chrome/browser/metrics/tab_stats/tab_stats_data_store_unittest.cc
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/metrics/tab_stats_data_store.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_data_store.h" -#include "chrome/browser/metrics/tab_stats_tracker.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_tracker.h" #include "chrome/browser/ui/recently_audible_helper.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "components/prefs/pref_registry_simple.h"
diff --git a/chrome/browser/metrics/tab_stats_observer.h b/chrome/browser/metrics/tab_stats/tab_stats_observer.h similarity index 89% rename from chrome/browser/metrics/tab_stats_observer.h rename to chrome/browser/metrics/tab_stats/tab_stats_observer.h index b436164..c135e34c 100644 --- a/chrome/browser/metrics/tab_stats_observer.h +++ b/chrome/browser/metrics/tab_stats/tab_stats_observer.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_METRICS_TAB_STATS_OBSERVER_H_ -#define CHROME_BROWSER_METRICS_TAB_STATS_OBSERVER_H_ +#ifndef CHROME_BROWSER_METRICS_TAB_STATS_TAB_STATS_OBSERVER_H_ +#define CHROME_BROWSER_METRICS_TAB_STATS_TAB_STATS_OBSERVER_H_ #include "base/observer_list_types.h" #include "content/public/browser/visibility.h" @@ -45,4 +45,4 @@ } // namespace metrics -#endif // CHROME_BROWSER_METRICS_TAB_STATS_OBSERVER_H_ +#endif // CHROME_BROWSER_METRICS_TAB_STATS_TAB_STATS_OBSERVER_H_
diff --git a/chrome/browser/metrics/tab_stats_tracker.cc b/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc similarity index 99% rename from chrome/browser/metrics/tab_stats_tracker.cc rename to chrome/browser/metrics/tab_stats/tab_stats_tracker.cc index 5dcc0f70..5c09087 100644 --- a/chrome/browser/metrics/tab_stats_tracker.cc +++ b/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/metrics/tab_stats_tracker.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_tracker.h" #include <algorithm> #include <string>
diff --git a/chrome/browser/metrics/tab_stats_tracker.h b/chrome/browser/metrics/tab_stats/tab_stats_tracker.h similarity index 96% rename from chrome/browser/metrics/tab_stats_tracker.h rename to chrome/browser/metrics/tab_stats/tab_stats_tracker.h index c7b9912..47287aa3 100644 --- a/chrome/browser/metrics/tab_stats_tracker.h +++ b/chrome/browser/metrics/tab_stats/tab_stats_tracker.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_METRICS_TAB_STATS_TRACKER_H_ -#define CHROME_BROWSER_METRICS_TAB_STATS_TRACKER_H_ +#ifndef CHROME_BROWSER_METRICS_TAB_STATS_TAB_STATS_TRACKER_H_ +#define CHROME_BROWSER_METRICS_TAB_STATS_TAB_STATS_TRACKER_H_ #include <map> #include <memory> @@ -19,8 +19,8 @@ #include "base/sequence_checker.h" #include "base/timer/timer.h" #include "build/build_config.h" -#include "chrome/browser/metrics/tab_stats_data_store.h" -#include "chrome/browser/metrics/tab_stats_tracker_delegate.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_data_store.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_tracker_delegate.h" #include "chrome/browser/ui/browser_list_observer.h" #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" #include "components/metrics/daily_event.h" @@ -297,4 +297,4 @@ } // namespace metrics -#endif // CHROME_BROWSER_METRICS_TAB_STATS_TRACKER_H_ +#endif // CHROME_BROWSER_METRICS_TAB_STATS_TAB_STATS_TRACKER_H_
diff --git a/chrome/browser/metrics/tab_stats_tracker_browsertest.cc b/chrome/browser/metrics/tab_stats/tab_stats_tracker_browsertest.cc similarity index 99% rename from chrome/browser/metrics/tab_stats_tracker_browsertest.cc rename to chrome/browser/metrics/tab_stats/tab_stats_tracker_browsertest.cc index b28cc49..bc76f32 100644 --- a/chrome/browser/metrics/tab_stats_tracker_browsertest.cc +++ b/chrome/browser/metrics/tab_stats/tab_stats_tracker_browsertest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/metrics/tab_stats_tracker.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_tracker.h" #include <memory> #include <vector>
diff --git a/chrome/browser/metrics/tab_stats_tracker_delegate.h b/chrome/browser/metrics/tab_stats/tab_stats_tracker_delegate.h similarity index 75% rename from chrome/browser/metrics/tab_stats_tracker_delegate.h rename to chrome/browser/metrics/tab_stats/tab_stats_tracker_delegate.h index b93719d5..028594e 100644 --- a/chrome/browser/metrics/tab_stats_tracker_delegate.h +++ b/chrome/browser/metrics/tab_stats/tab_stats_tracker_delegate.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_METRICS_TAB_STATS_TRACKER_DELEGATE_H_ -#define CHROME_BROWSER_METRICS_TAB_STATS_TRACKER_DELEGATE_H_ +#ifndef CHROME_BROWSER_METRICS_TAB_STATS_TAB_STATS_TRACKER_DELEGATE_H_ +#define CHROME_BROWSER_METRICS_TAB_STATS_TAB_STATS_TRACKER_DELEGATE_H_ #include "build/build_config.h" @@ -26,4 +26,4 @@ #endif // OS_WIN }; -#endif // CHROME_BROWSER_METRICS_TAB_STATS_TRACKER_DELEGATE_H_ +#endif // CHROME_BROWSER_METRICS_TAB_STATS_TAB_STATS_TRACKER_DELEGATE_H_
diff --git a/chrome/browser/metrics/tab_stats_tracker_delegate_win.cc b/chrome/browser/metrics/tab_stats/tab_stats_tracker_delegate_win.cc similarity index 85% rename from chrome/browser/metrics/tab_stats_tracker_delegate_win.cc rename to chrome/browser/metrics/tab_stats/tab_stats_tracker_delegate_win.cc index 37c35d1..49167d9 100644 --- a/chrome/browser/metrics/tab_stats_tracker_delegate_win.cc +++ b/chrome/browser/metrics/tab_stats/tab_stats_tracker_delegate_win.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/metrics/tab_stats_tracker_delegate.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_tracker_delegate.h" #include "ui/aura_extra/window_occlusion_win.h"
diff --git a/chrome/browser/metrics/tab_stats_tracker_unittest.cc b/chrome/browser/metrics/tab_stats/tab_stats_tracker_unittest.cc similarity index 99% rename from chrome/browser/metrics/tab_stats_tracker_unittest.cc rename to chrome/browser/metrics/tab_stats/tab_stats_tracker_unittest.cc index d566ee7..6f3be7f 100644 --- a/chrome/browser/metrics/tab_stats_tracker_unittest.cc +++ b/chrome/browser/metrics/tab_stats/tab_stats_tracker_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/metrics/tab_stats_tracker.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_tracker.h" #include <algorithm> @@ -33,9 +33,9 @@ class TestTabStatsTracker : public TabStatsTracker { public: + using TabStatsTracker::OnHeartbeatEvent; using TabStatsTracker::OnInitialOrInsertedTab; using TabStatsTracker::OnInterval; - using TabStatsTracker::OnHeartbeatEvent; using TabStatsTracker::TabChangedAt; using UmaStatsReportingDelegate = TabStatsTracker::UmaStatsReportingDelegate;
diff --git a/chrome/browser/metrics/tab_stats_tracker_win.cc b/chrome/browser/metrics/tab_stats/tab_stats_tracker_win.cc similarity index 97% rename from chrome/browser/metrics/tab_stats_tracker_win.cc rename to chrome/browser/metrics/tab_stats/tab_stats_tracker_win.cc index 4812ff95..023d3c7ca 100644 --- a/chrome/browser/metrics/tab_stats_tracker_win.cc +++ b/chrome/browser/metrics/tab_stats/tab_stats_tracker_win.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/metrics/tab_stats_tracker.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_tracker.h" #include "base/metrics/histogram_macros.h" #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/metrics/usage_scenario/tab_usage_scenario_tracker.h b/chrome/browser/metrics/usage_scenario/tab_usage_scenario_tracker.h index c466ab1..09ce828e 100644 --- a/chrome/browser/metrics/usage_scenario/tab_usage_scenario_tracker.h +++ b/chrome/browser/metrics/usage_scenario/tab_usage_scenario_tracker.h
@@ -6,7 +6,7 @@ #define CHROME_BROWSER_METRICS_USAGE_SCENARIO_TAB_USAGE_SCENARIO_TRACKER_H_ #include "base/containers/flat_set.h" -#include "chrome/browser/metrics/tab_stats_observer.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_observer.h" #include "chrome/browser/metrics/usage_scenario/usage_scenario_tracker.h" #include "content/public/browser/visibility.h"
diff --git a/chrome/browser/net/disk_cache_dir_policy_handler.cc b/chrome/browser/net/disk_cache_dir_policy_handler.cc index 4719c1c..445b486 100644 --- a/chrome/browser/net/disk_cache_dir_policy_handler.cc +++ b/chrome/browser/net/disk_cache_dir_policy_handler.cc
@@ -5,7 +5,9 @@ #include "chrome/browser/net/disk_cache_dir_policy_handler.h" #include "base/files/file_path.h" +#include "base/strings/utf_string_conversions.h" #include "base/values.h" +#include "build/build_config.h" #include "chrome/browser/policy/policy_path_parser.h" #include "chrome/common/pref_names.h" #include "components/policy/core/common/policy_map.h" @@ -23,11 +25,18 @@ void DiskCacheDirPolicyHandler::ApplyPolicySettings(const PolicyMap& policies, PrefValueMap* prefs) { const base::Value* value = policies.GetValue(policy_name()); - base::FilePath::StringType string_value; + std::string string_value; if (value && value->GetAsString(&string_value)) { base::FilePath::StringType expanded_value = +#if defined(OS_WIN) + policy::path_parser::ExpandPathVariables( + base::UTF8ToWide(string_value)); +#else policy::path_parser::ExpandPathVariables(string_value); - prefs->SetValue(prefs::kDiskCacheDir, base::Value(expanded_value)); +#endif + base::FilePath expanded_path(expanded_value); + prefs->SetValue(prefs::kDiskCacheDir, + base::Value(expanded_path.AsUTF8Unsafe())); } }
diff --git a/chrome/browser/net/net_error_diagnostics_dialog_win.cc b/chrome/browser/net/net_error_diagnostics_dialog_win.cc index ba2826a8..7e0b653 100644 --- a/chrome/browser/net/net_error_diagnostics_dialog_win.cc +++ b/chrome/browser/net/net_error_diagnostics_dialog_win.cc
@@ -64,7 +64,7 @@ private: void ShowDialogOnPrivateThread(HWND parent, const std::string& failed_url) { NDFHANDLE incident_handle; - base::string16 failed_url_wide = base::UTF8ToUTF16(failed_url); + std::wstring failed_url_wide = base::UTF8ToWide(failed_url); if (!SUCCEEDED(NdfCreateWebIncident(failed_url_wide.c_str(), &incident_handle))) { return;
diff --git a/chrome/browser/net/net_export_helper.cc b/chrome/browser/net/net_export_helper.cc index 8bb966e..da735ae 100644 --- a/chrome/browser/net/net_export_helper.cc +++ b/chrome/browser/net/net_export_helper.cc
@@ -19,6 +19,8 @@ #endif #if defined(OS_WIN) +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" #include "chrome/browser/net/service_providers_win.h" #endif @@ -73,13 +75,15 @@ auto layered_provider_list = std::make_unique<base::ListValue>(); for (size_t i = 0; i < layered_providers.size(); ++i) { auto service_dict = std::make_unique<base::DictionaryValue>(); - service_dict->SetString("name", layered_providers[i].name); + service_dict->SetString("name", + base::AsString16(layered_providers[i].name)); service_dict->SetInteger("version", layered_providers[i].version); service_dict->SetInteger("chain_length", layered_providers[i].chain_length); service_dict->SetInteger("socket_type", layered_providers[i].socket_type); service_dict->SetInteger("socket_protocol", layered_providers[i].socket_protocol); - service_dict->SetString("path", layered_providers[i].path); + service_dict->SetString("path", + base::WideToUTF8(layered_providers[i].path)); layered_provider_list->Append(std::move(service_dict)); } @@ -90,7 +94,8 @@ auto namespace_list = std::make_unique<base::ListValue>(); for (size_t i = 0; i < namespace_providers.size(); ++i) { auto namespace_dict = std::make_unique<base::DictionaryValue>(); - namespace_dict->SetString("name", namespace_providers[i].name); + namespace_dict->SetString("name", + base::AsString16(namespace_providers[i].name)); namespace_dict->SetBoolean("active", namespace_providers[i].active); namespace_dict->SetInteger("version", namespace_providers[i].version); namespace_dict->SetInteger("type", namespace_providers[i].type);
diff --git a/chrome/browser/net/service_providers_win.h b/chrome/browser/net/service_providers_win.h index 49994655..dc09d24 100644 --- a/chrome/browser/net/service_providers_win.h +++ b/chrome/browser/net/service_providers_win.h
@@ -5,12 +5,13 @@ #ifndef CHROME_BROWSER_NET_SERVICE_PROVIDERS_WIN_H_ #define CHROME_BROWSER_NET_SERVICE_PROVIDERS_WIN_H_ +#include <string> #include <vector> #include "base/strings/string16.h" struct WinsockNamespaceProvider { - base::string16 name; + std::wstring name; int version; bool active; int type; @@ -22,8 +23,8 @@ WinsockLayeredServiceProvider(const WinsockLayeredServiceProvider& other); ~WinsockLayeredServiceProvider(); - base::string16 name; - base::string16 path; + std::wstring name; + std::wstring path; int version; int chain_length; int socket_type;
diff --git a/chrome/browser/notifications/alert_dispatcher_xpc.mm b/chrome/browser/notifications/alert_dispatcher_xpc.mm index 3d6e606a..fbf9df3 100644 --- a/chrome/browser/notifications/alert_dispatcher_xpc.mm +++ b/chrome/browser/notifications/alert_dispatcher_xpc.mm
@@ -20,9 +20,9 @@ #include "base/metrics/histogram_functions.h" #include "base/strings/sys_string_conversions.h" #include "chrome/browser/notifications/notification_platform_bridge_mac_utils.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" #import "chrome/browser/ui/cocoa/notifications/notification_delivery.h" #include "chrome/browser/ui/cocoa/notifications/xpc_mach_port.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" #include "components/crash/core/app/crashpad.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/notifications/notification_alert_service_bridge.mm b/chrome/browser/notifications/notification_alert_service_bridge.mm index 595a44c..5248693 100644 --- a/chrome/browser/notifications/notification_alert_service_bridge.mm +++ b/chrome/browser/notifications/notification_alert_service_bridge.mm
@@ -12,7 +12,7 @@ #include "base/strings/sys_string_conversions.h" #include "chrome/browser/notifications/notification_platform_bridge_mac_utils.h" #include "chrome/browser/service_sandbox_type.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" #include "content/public/browser/service_process_host.h" #include "content/public/common/content_switches.h" #include "mojo/public/cpp/bindings/receiver.h"
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac.mm b/chrome/browser/notifications/notification_platform_bridge_mac.mm index d91d14ad..e8fc2c2d 100644 --- a/chrome/browser/notifications/notification_platform_bridge_mac.mm +++ b/chrome/browser/notifications/notification_platform_bridge_mac.mm
@@ -30,10 +30,11 @@ #include "chrome/browser/notifications/platform_notification_service_impl.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/cocoa/notifications/notification_builder_mac.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" #import "chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.h" #include "chrome/common/chrome_features.h" #include "chrome/grit/generated_resources.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_utils_mac.h" #include "third_party/blink/public/common/notifications/notification_constants.h" #include "ui/base/l10n/l10n_util_mac.h" #include "ui/message_center/public/cpp/notification.h"
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac_unittest.mm b/chrome/browser/notifications/notification_platform_bridge_mac_unittest.mm index 29418341..11538ec 100644 --- a/chrome/browser/notifications/notification_platform_bridge_mac_unittest.mm +++ b/chrome/browser/notifications/notification_platform_bridge_mac_unittest.mm
@@ -19,9 +19,9 @@ #include "chrome/browser/notifications/stub_alert_dispatcher_mac.h" #include "chrome/browser/notifications/stub_notification_center_mac.h" #include "chrome/browser/ui/cocoa/notifications/notification_builder_mac.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" #include "chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.h" #include "chrome/common/buildflags.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h"
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac_unnotification.mm b/chrome/browser/notifications/notification_platform_bridge_mac_unnotification.mm index 189dc328..b66a437 100644 --- a/chrome/browser/notifications/notification_platform_bridge_mac_unnotification.mm +++ b/chrome/browser/notifications/notification_platform_bridge_mac_unnotification.mm
@@ -23,6 +23,7 @@ #include "chrome/browser/ui/cocoa/notifications/unnotification_builder_mac.h" #import "chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac.h" #include "chrome/grit/generated_resources.h" +#include "chrome/services/mac_notifications/public/cpp/notification_utils_mac.h" #include "content/public/browser/browser_task_traits.h" #include "third_party/blink/public/common/notifications/notification_constants.h" #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac_unnotification_unittest.mm b/chrome/browser/notifications/notification_platform_bridge_mac_unnotification_unittest.mm index 6d8c8230f..d649d41 100644 --- a/chrome/browser/notifications/notification_platform_bridge_mac_unnotification_unittest.mm +++ b/chrome/browser/notifications/notification_platform_bridge_mac_unnotification_unittest.mm
@@ -18,9 +18,10 @@ #include "chrome/browser/notifications/notification_platform_bridge_mac_utils.h" #include "chrome/browser/notifications/stub_alert_dispatcher_mac.h" #include "chrome/browser/notifications/unnotification_metrics.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" #include "chrome/browser/ui/cocoa/notifications/unnotification_builder_mac.h" #include "chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_utils_mac.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h"
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac_utils.h b/chrome/browser/notifications/notification_platform_bridge_mac_utils.h index d248f4b..dcb8cec 100644 --- a/chrome/browser/notifications/notification_platform_bridge_mac_utils.h +++ b/chrome/browser/notifications/notification_platform_bridge_mac_utils.h
@@ -5,8 +5,6 @@ #ifndef CHROME_BROWSER_NOTIFICATIONS_NOTIFICATION_PLATFORM_BRIDGE_MAC_UTILS_H_ #define CHROME_BROWSER_NOTIFICATIONS_NOTIFICATION_PLATFORM_BRIDGE_MAC_UTILS_H_ -#include <string> - #include "base/strings/string16.h" #include "chrome/browser/notifications/notification_common.h" #include "ui/message_center/public/cpp/notification.h" @@ -26,12 +24,6 @@ const message_center::Notification& notification, bool requires_attribution); -// Derives a unique notification identifier to be used by the macOS system -// notification center to uniquely identify a notification. -std::string DeriveMacNotificationId(bool incognito, - const std::string& profile_id, - const std::string& notification_id); - // Validates contents of the |response| dictionary as received from the system // when a notification gets activated. bool VerifyMacNotificationData(NSDictionary* response) WARN_UNUSED_RESULT;
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac_utils.mm b/chrome/browser/notifications/notification_platform_bridge_mac_utils.mm index 5123ea70..e6c14e8 100644 --- a/chrome/browser/notifications/notification_platform_bridge_mac_utils.mm +++ b/chrome/browser/notifications/notification_platform_bridge_mac_utils.mm
@@ -7,15 +7,14 @@ #include "base/feature_list.h" #include "base/i18n/number_formatting.h" #include "base/optional.h" -#include "base/strings/strcat.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/system/sys_info.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/notifications/notification_display_service_impl.h" #include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" #include "chrome/common/chrome_features.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" #include "components/url_formatter/elide_url.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -125,14 +124,6 @@ return etldplusone; } -std::string DeriveMacNotificationId(bool incognito, - const std::string& profile_id, - const std::string& notification_id) { - // i: incognito, r: regular profile - return base::StrCat( - {incognito ? "i" : "r", "|", profile_id, "|", notification_id}); -} - bool VerifyMacNotificationData(NSDictionary* response) { if (![response objectForKey:notification_constants::kNotificationButtonIndex] ||
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac_utils_unittest.mm b/chrome/browser/notifications/notification_platform_bridge_mac_utils_unittest.mm index 00e9de4..2e10dab4c 100644 --- a/chrome/browser/notifications/notification_platform_bridge_mac_utils_unittest.mm +++ b/chrome/browser/notifications/notification_platform_bridge_mac_utils_unittest.mm
@@ -13,8 +13,8 @@ #include "chrome/browser/notifications/notification_platform_bridge.h" #include "chrome/browser/notifications/notification_platform_bridge_mac_utils.h" #include "chrome/browser/ui/cocoa/notifications/notification_builder_mac.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" #include "chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/message_center/public/cpp/notification.h"
diff --git a/chrome/browser/notifications/notification_ui_manager_browsertest.cc b/chrome/browser/notifications/notification_ui_manager_browsertest.cc index ef8e2f6a..398e353 100644 --- a/chrome/browser/notifications/notification_ui_manager_browsertest.cc +++ b/chrome/browser/notifications/notification_ui_manager_browsertest.cc
@@ -13,6 +13,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/notifications/notification_interactive_uitest_support.h" #include "chrome/browser/notifications/notification_ui_manager_impl.h" @@ -185,6 +186,9 @@ delegate2->Release(); } +// On Lacros, notifications don't keep the browser alive. Don't run this test on +// Lacros. +#if !BUILDFLAG(IS_CHROMEOS_LACROS) IN_PROC_BROWSER_TEST_F(NotificationUIManagerBrowserTest, VerifyKeepAlives) { EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsOriginRegistered( KeepAliveOrigin::NOTIFICATION)); @@ -214,3 +218,4 @@ delegate->Release(); delegate2->Release(); } +#endif // !BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/notifications/profile_notification.cc b/chrome/browser/notifications/profile_notification.cc index e6697a60..555f6d0 100644 --- a/chrome/browser/notifications/profile_notification.cc +++ b/chrome/browser/notifications/profile_notification.cc
@@ -44,6 +44,13 @@ notification_.set_profile_id( multi_user_util::GetAccountIdFromProfile(profile).GetUserEmail()); } +#elif BUILDFLAG(IS_CHROMEOS_LACROS) + // TODO(https://crbug.com/2673648): Add a stable identifier to the + // notification that allows Lacros to be launched into the correct profile if + // it is not running. + + // On Lacros notifications should not keep the browser alive, as they are + // persisted by the OS in a hidden tray. #else // These keepalives prevent the browser process from shutting down when // the last browser window is closed and there are open notifications. It's
diff --git a/chrome/browser/notifications/stub_alert_dispatcher_mac.mm b/chrome/browser/notifications/stub_alert_dispatcher_mac.mm index 5fafc45..ef2e6da 100644 --- a/chrome/browser/notifications/stub_alert_dispatcher_mac.mm +++ b/chrome/browser/notifications/stub_alert_dispatcher_mac.mm
@@ -13,7 +13,7 @@ #include "base/containers/flat_set.h" #include "base/mac/scoped_nsobject.h" #include "base/strings/sys_string_conversions.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" @implementation StubAlertDispatcher { base::scoped_nsobject<NSMutableArray> _alerts;
diff --git a/chrome/browser/notifications/stub_notification_center_mac.mm b/chrome/browser/notifications/stub_notification_center_mac.mm index 5e54edcb..3175a63a 100644 --- a/chrome/browser/notifications/stub_notification_center_mac.mm +++ b/chrome/browser/notifications/stub_notification_center_mac.mm
@@ -6,7 +6,7 @@ #include "base/check.h" #include "base/mac/scoped_nsobject.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" @implementation StubNotificationCenter { base::scoped_nsobject<NSMutableArray> _banners;
diff --git a/chrome/browser/notifications/win/notification_launch_id.cc b/chrome/browser/notifications/win/notification_launch_id.cc index cd06be64..384891b 100644 --- a/chrome/browser/notifications/win/notification_launch_id.cc +++ b/chrome/browser/notifications/win/notification_launch_id.cc
@@ -170,8 +170,8 @@ // static std::string NotificationLaunchId::GetProfileIdFromLaunchId( - const base::string16& launch_id_str) { - NotificationLaunchId launch_id(base::UTF16ToUTF8(launch_id_str)); + const std::wstring& launch_id_str) { + NotificationLaunchId launch_id(base::WideToUTF8(launch_id_str)); // The launch_id_invalid failure is logged via HandleActivation(). We don't // re-log it here, which would skew the UMA failure metrics.
diff --git a/chrome/browser/notifications/win/notification_launch_id.h b/chrome/browser/notifications/win/notification_launch_id.h index f6f93da..9227ac7 100644 --- a/chrome/browser/notifications/win/notification_launch_id.h +++ b/chrome/browser/notifications/win/notification_launch_id.h
@@ -5,8 +5,9 @@ #ifndef CHROME_BROWSER_NOTIFICATIONS_WIN_NOTIFICATION_LAUNCH_ID_H_ #define CHROME_BROWSER_NOTIFICATIONS_WIN_NOTIFICATION_LAUNCH_ID_H_ +#include <string> + #include "base/command_line.h" -#include "base/strings/string16.h" #include "chrome/browser/notifications/notification_handler.h" #include "url/gurl.h" @@ -94,7 +95,7 @@ // Extracts the profile ID from |launch_id_str|. static std::string GetProfileIdFromLaunchId( - const base::string16& launch_id_str); + const std::wstring& launch_id_str); // Retrieves the profile ID from the notification launch command line if any static std::string GetNotificationLaunchProfileId(
diff --git a/chrome/browser/notifications/win/notification_template_builder.cc b/chrome/browser/notifications/win/notification_template_builder.cc index 3a55fb95..4b28b33 100644 --- a/chrome/browser/notifications/win/notification_template_builder.cc +++ b/chrome/browser/notifications/win/notification_template_builder.cc
@@ -193,7 +193,7 @@ if (!path.empty()) { xml_writer->StartElement(kImageElement); xml_writer->AddAttribute(kPlacement, placement); - xml_writer->AddAttribute(kSrc, base::UTF16ToUTF8(path.value())); + xml_writer->AddAttribute(kSrc, base::WideToUTF8(path.value())); if (!hint_crop.empty()) xml_writer->AddAttribute(kHintCrop, hint_crop); xml_writer->EndElement();
diff --git a/chrome/browser/password_manager/password_manager_util_win.cc b/chrome/browser/password_manager/password_manager_util_win.cc index 1ca4a796..d10bf42 100644 --- a/chrome/browser/password_manager/password_manager_util_win.cc +++ b/chrome/browser/password_manager/password_manager_util_win.cc
@@ -25,6 +25,7 @@ #include "base/callback_helpers.h" #include "base/metrics/histogram_macros.h" #include "base/stl_util.h" +#include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/task/thread_pool.h" #include "base/threading/hang_watcher.h" @@ -382,8 +383,8 @@ CREDUI_INFO cui; cui.cbSize = sizeof(cui); cui.hwndParent = window->GetHost()->GetAcceleratedWidget(); - cui.pszMessageText = password_prompt.c_str(); - cui.pszCaptionText = product_name.c_str(); + cui.pszMessageText = base::as_wcstr(password_prompt); + cui.pszCaptionText = base::as_wcstr(product_name); cui.hbmBanner = nullptr; // Disable hang watching until the end of the function since the user can take
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc index bcbfc2d..d4fd329 100644 --- a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc +++ b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
@@ -100,7 +100,7 @@ // Determines whether |control| is visible taking into account OverlayWindow's // custom control hiding that includes setting the size to 0x0. bool IsOverlayWindowControlVisible(views::View* control) { - return control->IsDrawn() && !control->size().IsEmpty(); + return control->GetVisible() && !control->size().IsEmpty(); } // An observer used to notify about control visibility changes. @@ -885,11 +885,11 @@ EXPECT_TRUE(window_controller()->GetWindowForTesting()->IsVisible()); EXPECT_TRUE(GetOverlayWindow()->video_layer_for_testing()->visible()); - AssertControlsVisible( + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( {GetOverlayWindow()->previous_track_controls_view_for_testing(), GetOverlayWindow()->play_pause_controls_view_for_testing(), GetOverlayWindow()->next_track_controls_view_for_testing()}, - false); + false)); } // Tests that we can enter Picture-in-Picture when a video is not preloaded, @@ -1704,26 +1704,23 @@ ASSERT_NE(nullptr, GetOverlayWindow()); // Play/Pause button is displayed if video is not a mediastream. - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->play_pause_controls_view_for_testing()}, true); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->play_pause_controls_view_for_testing()}, true)); // Play/Pause button is hidden if video is a mediastream. bool result = false; ASSERT_TRUE(content::ExecuteScriptAndExtractBool( active_web_contents, "changeVideoSrcToMediaStream();", &result)); EXPECT_TRUE(result); - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->play_pause_controls_view_for_testing()}, false); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->play_pause_controls_view_for_testing()}, false)); // Play/Pause button is not hidden anymore when video is not a mediastream. ASSERT_TRUE(content::ExecuteScriptAndExtractBool( active_web_contents, "changeVideoSrc();", &result)); EXPECT_TRUE(result); - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->play_pause_controls_view_for_testing()}, true); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->play_pause_controls_view_for_testing()}, true)); } // Check that page visibility API events are fired when tab is hidden, shown, @@ -1856,44 +1853,34 @@ browser(), base::FilePath(kPictureInPictureWindowSizePage)); ASSERT_NE(GetOverlayWindow(), nullptr); - // Skip Ad button is not displayed initially when mouse is hovering over the - // window. - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->skip_ad_controls_view_for_testing()}, false); + // Skip Ad button is not displayed initially. + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->skip_ad_controls_view_for_testing()}, false)); content::WebContents* active_web_contents = browser()->tab_strip_model()->GetActiveWebContents(); - // Skip Ad button is not displayed if video is not playing even if mouse is - // hovering over the window and media session action handler has been set. + // Skip Ad button is not displayed if video is not playing even if media + // session action handler has been set. ASSERT_TRUE(content::ExecuteScript( active_web_contents, "setMediaSessionActionHandler('skipad');")); - MoveMouseOverOverlayWindow(); - // Wait for the controls to show if necessary, then verify the Skip Ad button - // is not among those shown. - AssertControlsVisible( - {GetOverlayWindow()->back_to_tab_controls_for_testing()}, true); - EXPECT_FALSE(IsOverlayWindowControlVisible( - GetOverlayWindow()->skip_ad_controls_view_for_testing())); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->skip_ad_controls_view_for_testing()}, false)); - // Play video and check that Skip Ad button is now displayed when - // video plays and mouse is hovering over the window. + // Play video and check that Skip Ad button is now displayed when video plays. bool result = false; ASSERT_TRUE(content::ExecuteScriptAndExtractBool( active_web_contents, "ensureVideoIsPlaying();", &result)); ASSERT_TRUE(result); - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->skip_ad_controls_view_for_testing()}, true); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->skip_ad_controls_view_for_testing()}, true)); // Unset action handler and check that Skip Ad button is not displayed when - // video plays and mouse is hovering over the window. + // video plays. ASSERT_TRUE(content::ExecuteScript( active_web_contents, "unsetMediaSessionActionHandler('skipad');")); - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->skip_ad_controls_view_for_testing()}, false); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->skip_ad_controls_view_for_testing()}, false)); } // Tests that the Play/Plause button is displayed in the Picture-in-Picture @@ -1909,179 +1896,128 @@ content::WebContents* active_web_contents = browser()->tab_strip_model()->GetActiveWebContents(); - // Play/Pause button is hidden if playing video is a mediastream and mouse is - // hovering over the window. + // Play/Pause button is hidden if playing video is a mediastream. bool result = false; ASSERT_TRUE(content::ExecuteScriptAndExtractBool( active_web_contents, "changeVideoSrcToMediaStream();", &result)); EXPECT_TRUE(result); - MoveMouseOverOverlayWindow(); - // Wait for the controls to show if necessary, then verify the Play/Pause - // button is not among those shown. - AssertControlsVisible( - {GetOverlayWindow()->back_to_tab_controls_for_testing()}, true); - EXPECT_FALSE(IsOverlayWindowControlVisible( - GetOverlayWindow()->play_pause_controls_view_for_testing())); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->play_pause_controls_view_for_testing()}, false)); // Play second video (non-muted) so that Media Session becomes active. ASSERT_TRUE( content::ExecuteScript(active_web_contents, "secondVideo.play();")); // Set Media Session action "play" handler and check that Play/Pause button - // is still hidden when mouse is hovering over the window. + // is still hidden. ASSERT_TRUE(content::ExecuteScript(active_web_contents, "setMediaSessionActionHandler('play');")); - MoveMouseOverOverlayWindow(); - // Wait for the controls to show if necessary, then verify the Play/Pause - // button is not among those shown. - AssertControlsVisible( - {GetOverlayWindow()->back_to_tab_controls_for_testing()}, true); - EXPECT_FALSE(IsOverlayWindowControlVisible( - GetOverlayWindow()->play_pause_controls_view_for_testing())); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->play_pause_controls_view_for_testing()}, false)); // Set Media Session action "pause" handler and check that Play/Pause button - // is now displayed when mouse is hovering over the window. + // is now displayed. ASSERT_TRUE(content::ExecuteScript(active_web_contents, "setMediaSessionActionHandler('pause');")); - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->play_pause_controls_view_for_testing()}, true); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->play_pause_controls_view_for_testing()}, true)); // Unset Media Session action "pause" handler and check that Play/Pause button - // is hidden when mouse is hovering over the window. + // is hidden. ASSERT_TRUE(content::ExecuteScript( active_web_contents, "unsetMediaSessionActionHandler('pause');")); - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->play_pause_controls_view_for_testing()}, false); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->play_pause_controls_view_for_testing()}, false)); ASSERT_TRUE( content::ExecuteScript(active_web_contents, "exitPictureInPicture();")); - // Reset Media Session action "pause" handler and check that Play/Pause button - // is now displayed when mouse is hovering over the window when it enters - // Picture-in-Picture again. + // Reset Media Session action "pause" handler and check that Play/Pause + // button is now displayed Picture-in-Picture is entered again. ASSERT_TRUE(content::ExecuteScript(active_web_contents, "setMediaSessionActionHandler('pause');")); ASSERT_TRUE(content::ExecuteScriptAndExtractBool( active_web_contents, "enterPictureInPicture();", &result)); EXPECT_TRUE(result); - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->play_pause_controls_view_for_testing()}, true); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->play_pause_controls_view_for_testing()}, true)); } // Tests that a Next Track button is displayed in the Picture-in-Picture window // when Media Session Action "nexttrack" is handled by the website. -// TODO(crbug.com/1167236): Flaky on Linux. -// TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is -// complete. -#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_NextTrackButtonVisibility DISABLED_NextTrackButtonVisibility -#else -#define MAYBE_NextTrackButtonVisibility NextTrackButtonVisibility -#endif IN_PROC_BROWSER_TEST_F(MediaSessionPictureInPictureWindowControllerBrowserTest, - MAYBE_NextTrackButtonVisibility) { + NextTrackButtonVisibility) { LoadTabAndEnterPictureInPicture( browser(), base::FilePath(kPictureInPictureWindowSizePage)); ASSERT_NE(GetOverlayWindow(), nullptr); - // Next Track button is not displayed initially when mouse is hovering over - // the window. - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->next_track_controls_view_for_testing()}, false); + // Next Track button is not displayed initially. + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->next_track_controls_view_for_testing()}, false)); content::WebContents* active_web_contents = browser()->tab_strip_model()->GetActiveWebContents(); - // Next Track button is not displayed if video is not playing even if mouse - // is hovering over the window and media session action handler has been set. + // Next Track button is not displayed if video is not playing even if media + // session action handler has been set. ASSERT_TRUE(content::ExecuteScript( active_web_contents, "setMediaSessionActionHandler('nexttrack');")); - MoveMouseOverOverlayWindow(); - // Wait for the controls to show if necessary, then verify the Next Track - // button is not among those shown. - AssertControlsVisible( - {GetOverlayWindow()->back_to_tab_controls_for_testing()}, true); - EXPECT_FALSE(IsOverlayWindowControlVisible( - GetOverlayWindow()->next_track_controls_view_for_testing())); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->next_track_controls_view_for_testing()}, false)); // Play video and check that Next Track button is now displayed when video - // plays and mouse is hovering over the window. + // plays. bool result = false; ASSERT_TRUE(content::ExecuteScriptAndExtractBool( active_web_contents, "ensureVideoIsPlaying();", &result)); ASSERT_TRUE(result); - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->next_track_controls_view_for_testing()}, true); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->next_track_controls_view_for_testing()}, true)); // Unset action handler and check that Next Track button is not displayed - // when video plays and mouse is hovering over the window. + // when video plays. ASSERT_TRUE(content::ExecuteScript( active_web_contents, "unsetMediaSessionActionHandler('nexttrack');")); - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->next_track_controls_view_for_testing()}, false); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->next_track_controls_view_for_testing()}, false)); } // Tests that a Previous Track button is displayed in the Picture-in-Picture // window when Media Session Action "previoustrack" is handled by the website. -// Flaky on Linux, see crbug.com/985303. -// TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is -// complete. -#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_PreviousTrackButtonVisibility \ - DISABLED_PreviousTrackButtonVisibility -#else -#define MAYBE_PreviousTrackButtonVisibility PreviousTrackButtonVisibility -#endif IN_PROC_BROWSER_TEST_F(MediaSessionPictureInPictureWindowControllerBrowserTest, - MAYBE_PreviousTrackButtonVisibility) { + PreviousTrackButtonVisibility) { LoadTabAndEnterPictureInPicture( browser(), base::FilePath(kPictureInPictureWindowSizePage)); - // Previous Track button is not displayed initially when mouse is hovering - // over the window. - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->previous_track_controls_view_for_testing()}, false); + // Previous Track button is not displayed initially. + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->previous_track_controls_view_for_testing()}, false)); content::WebContents* active_web_contents = browser()->tab_strip_model()->GetActiveWebContents(); // Previous Track button is not displayed if video is not playing even if - // mouse is hovering over the window and media session action handler has been - // set. + // media session action handler has been set. ASSERT_TRUE(content::ExecuteScript( active_web_contents, "setMediaSessionActionHandler('previoustrack');")); - MoveMouseOverOverlayWindow(); - // Wait for the controls to show if necessary, then verify the Previous Track - // button is not among those shown. - AssertControlsVisible( - {GetOverlayWindow()->back_to_tab_controls_for_testing()}, true); - EXPECT_FALSE(IsOverlayWindowControlVisible( - GetOverlayWindow()->previous_track_controls_view_for_testing())); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->previous_track_controls_view_for_testing()}, false)); // Play video and check that Previous Track button is now displayed when - // video plays and mouse is hovering over the window. + // video plays. bool result = false; ASSERT_TRUE(content::ExecuteScriptAndExtractBool( active_web_contents, "ensureVideoIsPlaying();", &result)); ASSERT_TRUE(result); - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->previous_track_controls_view_for_testing()}, true); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->previous_track_controls_view_for_testing()}, true)); // Unset action handler and check that Previous Track button is not displayed - // when video plays and mouse is hovering over the window. + // when video plays. ASSERT_TRUE(content::ExecuteScript( active_web_contents, "unsetMediaSessionActionHandler('previoustrack');")); - MoveMouseOverOverlayWindow(); - AssertControlsVisible( - {GetOverlayWindow()->previous_track_controls_view_for_testing()}, false); + EXPECT_NO_FATAL_FAILURE(AssertControlsVisible( + {GetOverlayWindow()->previous_track_controls_view_for_testing()}, false)); } // Tests that clicking the Skip Ad button in the Picture-in-Picture window
diff --git a/chrome/browser/policy/browser_dm_token_storage_win.cc b/chrome/browser/policy/browser_dm_token_storage_win.cc index acad68c..6b58681d 100644 --- a/chrome/browser/policy/browser_dm_token_storage_win.cc +++ b/chrome/browser/policy/browser_dm_token_storage_win.cc
@@ -142,7 +142,7 @@ if (status != ERROR_SUCCESS) return std::string(); - base::string16 value; + std::wstring value; status = key.ReadValue(L"MachineGuid", &value); if (status != ERROR_SUCCESS) return std::string(); @@ -165,7 +165,7 @@ constexpr size_t kInitialDMTokenSize = 512; base::win::RegKey key; - base::string16 dm_token_value_name; + std::wstring dm_token_value_name; std::vector<char> raw_value(kInitialDMTokenSize); // Prefer the app-neutral location over the browser's to match Google Update's
diff --git a/chrome/browser/policy/local_sync_policy_handler.cc b/chrome/browser/policy/local_sync_policy_handler.cc index e962be6..b6cc949 100644 --- a/chrome/browser/policy/local_sync_policy_handler.cc +++ b/chrome/browser/policy/local_sync_policy_handler.cc
@@ -7,7 +7,9 @@ #include <memory> #include "base/files/file_path.h" +#include "base/strings/utf_string_conversions.h" #include "base/values.h" +#include "build/build_config.h" #include "chrome/browser/policy/policy_path_parser.h" #include "components/policy/core/common/policy_map.h" #include "components/policy/policy_constants.h" @@ -25,12 +27,18 @@ void LocalSyncPolicyHandler::ApplyPolicySettings(const PolicyMap& policies, PrefValueMap* prefs) { const base::Value* value = policies.GetValue(policy_name()); - base::FilePath::StringType string_value; + std::string string_value; if (value && value->GetAsString(&string_value)) { base::FilePath::StringType expanded_value = +#if defined(OS_WIN) + policy::path_parser::ExpandPathVariables( + base::UTF8ToWide(string_value)); +#else policy::path_parser::ExpandPathVariables(string_value); +#endif + base::FilePath expanded_path(expanded_value); prefs->SetValue(syncer::prefs::kLocalSyncBackendDir, - base::Value(expanded_value)); + base::Value(expanded_path.AsUTF8Unsafe())); } }
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc index 83a30c4..405a01f 100644 --- a/chrome/browser/policy/policy_browsertest.cc +++ b/chrome/browser/policy/policy_browsertest.cc
@@ -175,9 +175,9 @@ #include "ash/public/cpp/ash_pref_names.h" #include "ash/public/cpp/ash_switches.h" #include "ash/shell.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" #include "chrome/browser/chromeos/login/test/js_checker.h" #include "chrome/browser/chromeos/note_taking_helper.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" #include "chrome/browser/ui/ash/chrome_screenshot_grabber.h" #include "chrome/browser/ui/ash/chrome_screenshot_grabber_test_observer.h" #include "chromeos/cryptohome/cryptohome_parameters.h"
diff --git a/chrome/browser/policy/policy_path_parser_win.cc b/chrome/browser/policy/policy_path_parser_win.cc index 392b066b..e2556b58 100644 --- a/chrome/browser/policy/policy_path_parser_win.cc +++ b/chrome/browser/policy/policy_path_parser_win.cc
@@ -23,8 +23,8 @@ bool LoadUserDataDirPolicyFromRegistry(HKEY hive, const char* key_name_str, base::FilePath* dir) { - base::string16 value; - base::string16 key_name(base::ASCIIToUTF16(key_name_str)); + std::wstring value; + std::wstring key_name(base::ASCIIToWide(key_name_str)); base::win::RegKey key(hive, policy::kRegistryChromePolicyKey, KEY_READ); if (key.ReadValue(key_name.c_str(), &value) == ERROR_SUCCESS) { *dir = base::FilePath(policy::path_parser::ExpandPathVariables(value));
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index ee40dc6e..a47827b 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -232,7 +232,7 @@ #include "chrome/browser/gcm/gcm_product_util.h" #include "chrome/browser/intranet_redirect_detector.h" #include "chrome/browser/media/unified_autoplay_config.h" -#include "chrome/browser/metrics/tab_stats_tracker.h" +#include "chrome/browser/metrics/tab_stats/tab_stats_tracker.h" #include "chrome/browser/nearby_sharing/common/nearby_share_prefs.h" #include "chrome/browser/search/instant_service.h" #include "chrome/browser/search/promos/promo_service.h" @@ -277,6 +277,8 @@ #include "chrome/browser/chromeos/extensions/printing/printing_api_handler.h" #endif #include "chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller.h" +#include "chrome/browser/ash/system/automatic_reboot_manager.h" +#include "chrome/browser/ash/system/input_device_settings.h" #include "chrome/browser/chromeos/borealis/borealis_prefs.h" #include "chrome/browser/chromeos/child_accounts/secondary_account_consent_logger.h" #include "chrome/browser/chromeos/file_system_provider/registry.h" @@ -325,8 +327,6 @@ #include "chrome/browser/chromeos/printing/enterprise_printers_provider.h" #include "chrome/browser/chromeos/release_notes/release_notes_storage.h" #include "chrome/browser/chromeos/settings/device_settings_cache.h" -#include "chrome/browser/chromeos/system/automatic_reboot_manager.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" #include "chrome/browser/device_identity/chromeos/device_oauth2_token_store_chromeos.h" #include "chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h" #include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
diff --git a/chrome/browser/prefs/profile_pref_store_manager.cc b/chrome/browser/prefs/profile_pref_store_manager.cc index 059a33db..355cec0 100644 --- a/chrome/browser/prefs/profile_pref_store_manager.cc +++ b/chrome/browser/prefs/profile_pref_store_manager.cc
@@ -31,8 +31,7 @@ #if defined(OS_WIN) // Forces a different registry key to be used for storing preference validation // MACs. See |SetPreferenceValidationRegistryPathForTesting|. -const base::string16* g_preference_validation_registry_path_for_testing = - nullptr; +const std::wstring* g_preference_validation_registry_path_for_testing = nullptr; #endif // OS_WIN } // namespace @@ -75,7 +74,7 @@ #if defined(OS_WIN) // static void ProfilePrefStoreManager::SetPreferenceValidationRegistryPathForTesting( - const base::string16* path) { + const std::wstring* path) { DCHECK(!path->empty()); g_preference_validation_registry_path_for_testing = path; }
diff --git a/chrome/browser/prefs/profile_pref_store_manager.h b/chrome/browser/prefs/profile_pref_store_manager.h index 9d47a526..9f9cd93 100644 --- a/chrome/browser/prefs/profile_pref_store_manager.h +++ b/chrome/browser/prefs/profile_pref_store_manager.h
@@ -71,7 +71,7 @@ // storing and validating tracked preference MACs. Callers are responsible // for ensuring that the key is deleted on shutdown. For testing only. static void SetPreferenceValidationRegistryPathForTesting( - const base::string16* path); + const std::wstring* path); #endif // Creates a PersistentPrefStore providing access to the user preferences of
diff --git a/chrome/browser/prefs/tracked/pref_hash_browsertest.cc b/chrome/browser/prefs/tracked/pref_hash_browsertest.cc index 332059f3..12ffec0b 100644 --- a/chrome/browser/prefs/tracked/pref_hash_browsertest.cc +++ b/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
@@ -70,7 +70,7 @@ }; #if defined(OS_WIN) -base::string16 GetRegistryPathForTestProfile() { +std::wstring GetRegistryPathForTestProfile() { // Cleanup follow-up to http://crbug.com/721245 for the previous location of // this test key which had similar problems (to a lesser extent). It's // redundant but harmless to have multiple callers hit this on the same @@ -312,7 +312,7 @@ #if defined(OS_WIN) // When done, delete the Registry key to avoid polluting the registry. if (!content::IsPreTest()) { - base::string16 registry_key = GetRegistryPathForTestProfile(); + std::wstring registry_key = GetRegistryPathForTestProfile(); base::win::RegKey key; if (key.Open(HKEY_CURRENT_USER, registry_key.c_str(), KEY_SET_VALUE | KEY_WOW64_32KEY) == ERROR_SUCCESS) { @@ -428,7 +428,7 @@ int num_tracked_prefs_; #if defined(OS_WIN) - base::string16 registry_key_for_external_validation_; + std::wstring registry_key_for_external_validation_; #endif }; @@ -1116,7 +1116,7 @@ void AttackPreferencesOnDisk( base::DictionaryValue* unprotected_preferences, base::DictionaryValue* protected_preferences) override { - base::string16 registry_key = + std::wstring registry_key = GetRegistryPathForTestProfile() + L"\\PreferenceMACs\\Default"; base::win::RegKey key; ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, registry_key.c_str(),
diff --git a/chrome/browser/privacy_sandbox/android/BUILD.gn b/chrome/browser/privacy_sandbox/android/BUILD.gn index fcb571c..f86a72c 100644 --- a/chrome/browser/privacy_sandbox/android/BUILD.gn +++ b/chrome/browser/privacy_sandbox/android/BUILD.gn
@@ -23,6 +23,7 @@ ":java_resources", "//base:base_java", "//base:jni_java", + "//chrome/browser/settings:java", "//chrome/browser/ui/messages/android:java", "//components/browser_ui/settings/android:java", "//third_party/android_deps:androidx_fragment_fragment_java",
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSettingsFragment.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSettingsFragment.java index 19af45e7..ceca5a3 100644 --- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSettingsFragment.java +++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSettingsFragment.java
@@ -15,6 +15,7 @@ import androidx.preference.PreferenceFragmentCompat; import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate; import org.chromium.components.browser_ui.settings.ChromeSwitchPreference; import org.chromium.components.browser_ui.settings.SettingsUtils; import org.chromium.ui.text.SpanApplier; @@ -53,6 +54,7 @@ ChromeSwitchPreference privacySandboxToggle = (ChromeSwitchPreference) findPreference(TOGGLE_PREFERENCE); privacySandboxToggle.setOnPreferenceChangeListener(this); + privacySandboxToggle.setManagedPreferenceDelegate(createManagedPreferenceDelegate()); privacySandboxToggle.setChecked(PrivacySandboxBridge.isPrivacySandboxEnabled()); } @@ -78,4 +80,11 @@ view.addView(headerView, 0); return view; } + + private ChromeManagedPreferenceDelegate createManagedPreferenceDelegate() { + return preference -> { + if (!TOGGLE_PREFERENCE.equals(preference.getKey())) return false; + return PrivacySandboxBridge.isPrivacySandboxManaged(); + }; + } }
diff --git a/chrome/browser/profile_resetter/profile_resetter.h b/chrome/browser/profile_resetter/profile_resetter.h index 79a7e995..d3f600d 100644 --- a/chrome/browser/profile_resetter/profile_resetter.h +++ b/chrome/browser/profile_resetter/profile_resetter.h
@@ -127,7 +127,7 @@ }; // Path to shortcut and command line arguments. -typedef std::pair<base::FilePath, base::string16> ShortcutCommand; +typedef std::pair<base::FilePath, std::wstring> ShortcutCommand; typedef base::RefCountedData<base::AtomicFlag> SharedCancellationFlag;
diff --git a/chrome/browser/profile_resetter/resettable_settings_snapshot.cc b/chrome/browser/profile_resetter/resettable_settings_snapshot.cc index 46ce94f..61af028 100644 --- a/chrome/browser/profile_resetter/resettable_settings_snapshot.cc +++ b/chrome/browser/profile_resetter/resettable_settings_snapshot.cc
@@ -212,7 +212,7 @@ if (field_mask & ResettableSettingsSnapshot::SHORTCUTS) { for (const auto& shortcut_command : snapshot.shortcuts()) - report->add_shortcuts(base::UTF16ToUTF8(shortcut_command.second)); + report->add_shortcuts(base::WideToUTF8(shortcut_command.second)); } report->set_guid(snapshot.guid()); @@ -318,7 +318,7 @@ if (!shortcut_targets.empty()) shortcut_targets += base::ASCIIToUTF16("\n"); shortcut_targets += base::ASCIIToUTF16("chrome.exe "); - shortcut_targets += i->second; + shortcut_targets += base::WideToUTF16(i->second); } if (!shortcut_targets.empty()) { AddPair(list.get(),
diff --git a/chrome/browser/profile_resetter/triggered_profile_resetter_win.cc b/chrome/browser/profile_resetter/triggered_profile_resetter_win.cc index 15bb6fc..c6e30e48 100644 --- a/chrome/browser/profile_resetter/triggered_profile_resetter_win.cc +++ b/chrome/browser/profile_resetter/triggered_profile_resetter_win.cc
@@ -7,6 +7,7 @@ #include "base/logging.h" #include "base/metrics/field_trial.h" #include "base/metrics/histogram_macros.h" +#include "base/strings/string_util.h" #include "base/win/registry.h" #include "build/branding_buildflags.h" #include "chrome/browser/profile_resetter/triggered_profile_resetter.h" @@ -81,12 +82,14 @@ has_reset_trigger_ = true; - if (reset_reg_key.ReadValue(kTriggeredResetToolName, &tool_name_) != + std::wstring tool_name; + if (reset_reg_key.ReadValue(kTriggeredResetToolName, &tool_name) != ERROR_SUCCESS) { DVLOG(1) << "Failed to read triggered profile reset tool name."; - } else if (tool_name_.length() > kMaxToolNameLength) { - tool_name_.resize(kMaxToolNameLength); + } else if (tool_name.length() > kMaxToolNameLength) { + tool_name.resize(kMaxToolNameLength); } + tool_name_ = base::AsString16(tool_name); pref_service->SetInt64(prefs::kLastProfileResetTimestamp, timestamp); }
diff --git a/chrome/browser/profiles/android/java/src/org/chromium/chrome/browser/profiles/OTRProfileID.java b/chrome/browser/profiles/android/java/src/org/chromium/chrome/browser/profiles/OTRProfileID.java index 33de82d..ab28ad1 100644 --- a/chrome/browser/profiles/android/java/src/org/chromium/chrome/browser/profiles/OTRProfileID.java +++ b/chrome/browser/profiles/android/java/src/org/chromium/chrome/browser/profiles/OTRProfileID.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.profiles; +import android.text.TextUtils; + import androidx.annotation.Nullable; import org.chromium.base.annotations.CalledByNative; @@ -57,7 +59,7 @@ */ public static OTRProfileID deserialize(String value) { // The value might be null, if it represents the regular profile. - if (value == null || value.isEmpty()) return null; + if (TextUtils.isEmpty(value)) return null; // Check if the format is align with |OTRProfileID#toString| function. assert value.startsWith("OTRProfileID{") && value.endsWith("}"); @@ -103,7 +105,7 @@ /** * Checks whether the given OTRProfileIDs belong to the same profile. * @param otrProfileID1 The first OTRProfileID - * @param otrProfileID2 The first OTRProfileID + * @param otrProfileID2 The second OTRProfileID * @return Whether the given OTRProfileIDs are equals. */ public static boolean areEqual( @@ -114,6 +116,21 @@ return otrProfileID1.equals(otrProfileID2); } + /** + * Checks whether the given OTRProfileID strings belong to the same profile. + * @param otrProfileID1 The string of first OTRProfileID + * @param otrProfileID2 The string of second OTRProfileID + * @return Whether the given OTRProfileIDs are equals. + */ + public static boolean areEqual(@Nullable String otrProfileID1, @Nullable String otrProfileID2) { + // If both OTRProfileIDs null, then both belong to the regular profile. + if (TextUtils.isEmpty(otrProfileID1)) { + return TextUtils.isEmpty(otrProfileID2); + } + + return otrProfileID1.equals(otrProfileID2); + } + @Override public String toString() { return String.format("OTRProfileID{%s}", mProfileID);
diff --git a/chrome/browser/profiles/off_the_record_profile_impl.cc b/chrome/browser/profiles/off_the_record_profile_impl.cc index 901a613..6a9d6e15 100644 --- a/chrome/browser/profiles/off_the_record_profile_impl.cc +++ b/chrome/browser/profiles/off_the_record_profile_impl.cc
@@ -505,23 +505,6 @@ return decode_history; } -void OffTheRecordProfileImpl::SetCorsOriginAccessListForOrigin( - const url::Origin& source_origin, - std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, - std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, - base::OnceClosure closure) { - // Forward the request to the real profile (which will refresh the access - // patterns for both the main and the incognito profiles). - profile_->SetCorsOriginAccessListForOrigin( - source_origin, std::move(allow_patterns), std::move(block_patterns), - std::move(closure)); -} - -content::SharedCorsOriginAccessList* -OffTheRecordProfileImpl::GetSharedCorsOriginAccessList() { - return profile_->GetSharedCorsOriginAccessList(); -} - content::FileSystemAccessPermissionContext* OffTheRecordProfileImpl::GetFileSystemAccessPermissionContext() { return FileSystemAccessPermissionContextFactory::GetForProfile(this);
diff --git a/chrome/browser/profiles/off_the_record_profile_impl.h b/chrome/browser/profiles/off_the_record_profile_impl.h index b0d3c31..a58514a 100644 --- a/chrome/browser/profiles/off_the_record_profile_impl.h +++ b/chrome/browser/profiles/off_the_record_profile_impl.h
@@ -126,12 +126,6 @@ content::BrowsingDataRemoverDelegate* GetBrowsingDataRemoverDelegate() override; media::VideoDecodePerfHistory* GetVideoDecodePerfHistory() override; - void SetCorsOriginAccessListForOrigin( - const url::Origin& source_origin, - std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, - std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, - base::OnceClosure closure) override; - content::SharedCorsOriginAccessList* GetSharedCorsOriginAccessList() override; content::FileSystemAccessPermissionContext* GetFileSystemAccessPermissionContext() override; void RecordMainFrameNavigation() override;
diff --git a/chrome/browser/profiles/profile.cc b/chrome/browser/profiles/profile.cc index 2b40a23..8e8a7ab 100644 --- a/chrome/browser/profiles/profile.cc +++ b/chrome/browser/profiles/profile.cc
@@ -25,6 +25,8 @@ #include "components/variations/variations.mojom.h" #include "components/variations/variations_client.h" #include "components/variations/variations_ids_provider.h" +#include "content/public/browser/cors_origin_pattern_setter.h" +#include "content/public/browser/shared_cors_origin_access_list.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" @@ -167,7 +169,9 @@ } #endif -Profile::Profile() { +Profile::Profile() + : shared_cors_origin_access_list_( + content::SharedCorsOriginAccessList::Create()) { #if DCHECK_IS_ON() base::AutoLock lock(g_profile_instances_lock.Get()); g_profile_instances.Get().insert(this); @@ -498,3 +502,65 @@ chrome_variations_client_ = std::make_unique<ChromeVariationsClient>(this); return chrome_variations_client_.get(); } + +content::SharedCorsOriginAccessList* Profile::GetSharedCorsOriginAccessList() { + return shared_cors_origin_access_list_.get(); +} + +void Profile::SetCorsOriginAccessListForOrigin( + TargetBrowserContexts target_mode, + const url::Origin& source_origin, + std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, + std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, + base::OnceClosure closure) { + using content::CorsOriginPatternSetter; + switch (target_mode) { + case content::BrowserContext::TargetBrowserContexts::kSingleContext: { + SetCorsOriginAccessListForThisContextOnly( + source_origin, std::move(allow_patterns), std::move(block_patterns), + std::move(closure)); + break; + } + + case content::BrowserContext::TargetBrowserContexts::kAllRelatedContexts: { + Profile* regular_profile = GetOriginalProfile(); + std::vector<Profile*> otr_profiles = GetAllOffTheRecordProfiles(); + // We need one callback for modifying the `regular_profile`, and one for + // each off-the-record profile. + auto barrier_closure = + BarrierClosure(1 + otr_profiles.size(), std::move(closure)); + regular_profile->SetCorsOriginAccessListForThisContextOnly( + source_origin, CorsOriginPatternSetter::ClonePatterns(allow_patterns), + CorsOriginPatternSetter::ClonePatterns(block_patterns), + barrier_closure); + for (Profile* otr : otr_profiles) { + otr->SetCorsOriginAccessListForThisContextOnly( + source_origin, + CorsOriginPatternSetter::ClonePatterns(allow_patterns), + CorsOriginPatternSetter::ClonePatterns(block_patterns), + barrier_closure); + } + break; + } + } +} + +void Profile::SetCorsOriginAccessListForThisContextOnly( + const url::Origin& source_origin, + std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, + std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, + base::OnceClosure closure) { + using content::CorsOriginPatternSetter; + auto barrier_closure = BarrierClosure(2, std::move(closure)); + base::MakeRefCounted<CorsOriginPatternSetter>( + source_origin, CorsOriginPatternSetter::ClonePatterns(allow_patterns), + CorsOriginPatternSetter::ClonePatterns(block_patterns), barrier_closure) + ->ApplyToEachStoragePartition(this); + + // Keep the per-profile access list up to date so that we can use this to + // restore NetworkContext settings at anytime, e.g. on restarting the + // network service. + shared_cors_origin_access_list_->SetForOrigin( + source_origin, std::move(allow_patterns), std::move(block_patterns), + barrier_closure); +}
diff --git a/chrome/browser/profiles/profile.h b/chrome/browser/profiles/profile.h index 6d197f46..37416edf 100644 --- a/chrome/browser/profiles/profile.h +++ b/chrome/browser/profiles/profile.h
@@ -221,6 +221,7 @@ virtual const OTRProfileID& GetOTRProfileID() const = 0; variations::VariationsClient* GetVariationsClient() override; + content::SharedCorsOriginAccessList* GetSharedCorsOriginAccessList() override; // Returns the creation time of this profile. This will either be the creation // time of the profile directory or, for ephemeral off-the-record profiles, @@ -515,6 +516,13 @@ virtual void RecordMainFrameNavigation() = 0; + void SetCorsOriginAccessListForOrigin( + TargetBrowserContexts target_mode, + const url::Origin& source_origin, + std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, + std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, + base::OnceClosure closure) override; + protected: void set_is_guest_profile(bool is_guest_profile) { is_guest_profile_ = is_guest_profile; @@ -541,6 +549,13 @@ // Returns whether the user has signed in this profile to an account. virtual bool IsSignedIn() = 0; + // TODO(lukasza): Move this method to the //content layer. + void SetCorsOriginAccessListForThisContextOnly( + const url::Origin& source_origin, + std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, + std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, + base::OnceClosure closure); + private: bool restored_last_session_ = false; @@ -563,6 +578,10 @@ class ChromeVariationsClient; std::unique_ptr<variations::VariationsClient> chrome_variations_client_; + + // TODO(lukasza): Move this field to the //content layer. + scoped_refptr<content::SharedCorsOriginAccessList> + shared_cors_origin_access_list_; }; // The comparator for profile pointers as key in a map.
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc index 33d6d57..d8a5d3f5 100644 --- a/chrome/browser/profiles/profile_impl.cc +++ b/chrome/browser/profiles/profile_impl.cc
@@ -148,13 +148,11 @@ #include "components/version_info/channel.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/cors_origin_pattern_setter.h" #include "content/public/browser/dom_storage_context.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/permission_controller.h" #include "content/public/browser/permission_type.h" #include "content/public/browser/render_process_host.h" -#include "content/public/browser/shared_cors_origin_access_list.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/url_data_source.h" #include "content/public/common/content_constants.h" @@ -243,7 +241,6 @@ using base::TimeDelta; using bookmarks::BookmarkModel; using content::BrowserThread; -using content::CorsOriginPatternSetter; using content::DownloadManagerDelegate; namespace { @@ -473,9 +470,7 @@ io_data_(this), last_session_exit_type_(EXIT_NORMAL), start_time_(base::Time::Now()), - delegate_(delegate), - shared_cors_origin_access_list_( - content::SharedCorsOriginAccessList::Create()) { + delegate_(delegate) { TRACE_EVENT0("browser,startup", "ProfileImpl::ctor"); DCHECK(!path.empty()) << "Using an empty path will attempt to write " << "profile files to the root directory!"; @@ -1338,50 +1333,6 @@ return ContentIndexProviderFactory::GetForProfile(this); } -void ProfileImpl::SetCorsOriginAccessListForOrigin( - const url::Origin& source_origin, - std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, - std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, - base::OnceClosure closure) { - std::vector<Profile*> otr_profiles = GetAllOffTheRecordProfiles(); - // We need two callbacks for the regular profile and shared cors origin access - // list, and one for each off-the-record profile. - auto barrier_closure = - BarrierClosure(2 + otr_profiles.size(), std::move(closure)); - - // Keep profile storage partitions' NetworkContexts synchronized. - auto profile_setter = base::MakeRefCounted<CorsOriginPatternSetter>( - source_origin, CorsOriginPatternSetter::ClonePatterns(allow_patterns), - CorsOriginPatternSetter::ClonePatterns(block_patterns), barrier_closure); - ForEachStoragePartition( - this, base::BindRepeating(&CorsOriginPatternSetter::SetLists, - base::RetainedRef(profile_setter.get()))); - - // Keep off-the-record storage partitions' NetworkContexts synchronized. - for (Profile* otr : otr_profiles) { - auto off_the_record_setter = base::MakeRefCounted<CorsOriginPatternSetter>( - source_origin, CorsOriginPatternSetter::ClonePatterns(allow_patterns), - CorsOriginPatternSetter::ClonePatterns(block_patterns), - barrier_closure); - ForEachStoragePartition( - otr, - base::BindRepeating(&CorsOriginPatternSetter::SetLists, - base::RetainedRef(off_the_record_setter.get()))); - } - - // Keep the per-profile access list up to date so that we can use this to - // restore NetworkContext settings at anytime, e.g. on restarting the - // network service. - shared_cors_origin_access_list_->SetForOrigin( - source_origin, std::move(allow_patterns), std::move(block_patterns), - barrier_closure); -} - -content::SharedCorsOriginAccessList* -ProfileImpl::GetSharedCorsOriginAccessList() { - return shared_cors_origin_access_list_.get(); -} - std::string ProfileImpl::GetMediaDeviceIDSalt() { return media_device_id_salt_->GetSalt(); }
diff --git a/chrome/browser/profiles/profile_impl.h b/chrome/browser/profiles/profile_impl.h index 4ed35d9..d21cd79 100644 --- a/chrome/browser/profiles/profile_impl.h +++ b/chrome/browser/profiles/profile_impl.h
@@ -94,12 +94,6 @@ override; content::BackgroundFetchDelegate* GetBackgroundFetchDelegate() override; content::BackgroundSyncController* GetBackgroundSyncController() override; - void SetCorsOriginAccessListForOrigin( - const url::Origin& source_origin, - std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, - std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, - base::OnceClosure closure) override; - content::SharedCorsOriginAccessList* GetSharedCorsOriginAccessList() override; std::string GetMediaDeviceIDSalt() override; download::InProgressDownloadManager* RetriveInProgressDownloadManager() override; @@ -334,9 +328,6 @@ // components/keyed_service/content/browser_context_keyed_service_factory.* Profile::Delegate* delegate_; - - scoped_refptr<content::SharedCorsOriginAccessList> - shared_cors_origin_access_list_; }; #endif // CHROME_BROWSER_PROFILES_PROFILE_IMPL_H_
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index e3de5620..7a9fe5e 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -861,7 +861,7 @@ profile_name.append(base::NumberToString(next_directory)); base::FilePath new_path = profile_manager->user_data_dir(); #if defined(OS_WIN) - new_path = new_path.Append(base::ASCIIToUTF16(profile_name)); + new_path = new_path.Append(base::ASCIIToWide(profile_name)); #else new_path = new_path.Append(profile_name); #endif @@ -899,7 +899,7 @@ profile_name.append(base::NumberToString(next_directory)); base::FilePath new_path = user_data_dir_; #if defined(OS_WIN) - new_path = new_path.Append(base::ASCIIToUTF16(profile_name)); + new_path = new_path.Append(base::ASCIIToWide(profile_name)); #else new_path = new_path.Append(profile_name); #endif
diff --git a/chrome/browser/profiles/profile_window.cc b/chrome/browser/profiles/profile_window.cc index a8eb25c..af35acc 100644 --- a/chrome/browser/profiles/profile_window.cc +++ b/chrome/browser/profiles/profile_window.cc
@@ -300,18 +300,6 @@ #endif // !BUILDFLAG(IS_CHROMEOS_ASH) } -void CloseGuestProfileWindows() { - ProfileManager* profile_manager = g_browser_process->profile_manager(); - Profile* profile = profile_manager->GetProfileByPath( - ProfileManager::GetGuestProfilePath()); - - if (profile) { - BrowserList::CloseAllBrowsersWithProfile( - profile, base::BindRepeating(&ProfileBrowserCloseSuccess), - BrowserList::CloseCallback(), false); - } -} - void LockBrowserCloseSuccess(const base::FilePath& profile_path) { ProfileManager* profile_manager = g_browser_process->profile_manager(); ProfileAttributesEntry* entry = @@ -378,9 +366,9 @@ void CloseProfileWindows(Profile* profile) { DCHECK(profile); - BrowserList::CloseAllBrowsersWithProfile( - profile, base::BindRepeating(&ProfileBrowserCloseSuccess), - BrowserList::CloseCallback(), false); + BrowserList::CloseAllBrowsersWithProfile(profile, + BrowserList::CloseCallback(), + BrowserList::CloseCallback(), false); } void CreateSystemProfileForUserManager(
diff --git a/chrome/browser/profiles/profile_window.h b/chrome/browser/profiles/profile_window.h index cdbef8a..f5565e1 100644 --- a/chrome/browser/profiles/profile_window.h +++ b/chrome/browser/profiles/profile_window.h
@@ -92,15 +92,11 @@ // one and the current window is a guest window. bool HasProfileSwitchTargets(Profile* profile); -// Closes all browser windows that belong to the guest profile and opens the -// user manager. -void CloseGuestProfileWindows(); - // Closes and locks all the browser windows for |profile| and opens the user // manager. void LockProfile(Profile* profile); -// Close all the browser windows for |profile| and opens the user manager. +// Close all the browser windows for |profile|. void CloseProfileWindows(Profile* profile); // Returns whether lock is available to this profile.
diff --git a/chrome/browser/profiles/reporting_util.cc b/chrome/browser/profiles/reporting_util.cc index 403cf8c..8a64db7 100644 --- a/chrome/browser/profiles/reporting_util.cc +++ b/chrome/browser/profiles/reporting_util.cc
@@ -126,7 +126,8 @@ context.SetStringPath("profile.gaiaEmail", entry->GetUserName()); } - context.SetStringPath("profile.profilePath", profile->GetPath().value()); + context.SetStringPath("profile.profilePath", + profile->GetPath().AsUTF8Unsafe()); const enterprise_management::PolicyData* policy = GetPolicyData(profile);
diff --git a/chrome/browser/resources/bluetooth_internals/main.js b/chrome/browser/resources/bluetooth_internals/main.js index 8c463a14..c16a633 100644 --- a/chrome/browser/resources/bluetooth_internals/main.js +++ b/chrome/browser/resources/bluetooth_internals/main.js
@@ -3,18 +3,12 @@ // found in the LICENSE file. import {initializeViews} from './bluetooth_internals.js'; +import {loadTestModule} from './test_loader_util.js'; document.addEventListener('DOMContentLoaded', () => { - // Using a query of "test" provides a hook for the test suite to perform + // Using a query of "module" provides a hook for the test suite to perform // setup actions. - const params = new URLSearchParams(window.location.search); - const test = params.get('test'); - if (test) { - const script = document.createElement('script'); - script.type = 'module'; - script.src = `chrome://test/bluetooth_internals/${test}`; - document.body.appendChild(script); - } else { + if (!loadTestModule()) { initializeViews(); } });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options.js b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options.js index 780c9eb5..f613f19 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options.js
@@ -22,6 +22,12 @@ goog.require('ChromeVoxPrefs'); goog.require('ExtensionBridge'); +/** @const {string} */ +const GOOGLE_TTS_EXTENSION_ID = 'gjjabgpgjpampikjhjpfhneeoapjbjaf'; + +/** @const {string} */ +const ESPEAK_TTS_EXTENSION_ID = 'dakbfdmgjiabojdgbiljlhgjbokobjpg'; + /** * Class to manage the options page. */ @@ -278,7 +284,24 @@ voice.voiceName = voice.voiceName || ''; }); voices.sort(function(a, b) { - return a.voiceName.localeCompare(b.voiceName); + // Prefer Google tts voices over all others. + if (a.extensionId === GOOGLE_TTS_EXTENSION_ID && + b.extensionId !== GOOGLE_TTS_EXTENSION_ID) { + return -1; + } + + // Next, prefer Espeak tts voices. + if (a.extensionId === ESPEAK_TTS_EXTENSION_ID && + b.extensionId !== ESPEAK_TTS_EXTENSION_ID) { + return -1; + } + + // Finally, prefer local over remote voices. + if (!a['remote'] && b['remote']) { + return -1; + } + + return 0; }); addVoiceOption(Msgs.getMsg('system_voice'), constants.SYSTEM_VOICE); voices.forEach((voice) => {
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gu.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gu.xtb index d39693b..419daf3 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gu.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gu.xtb
@@ -807,7 +807,7 @@ <translation id="7039555289296502784">રાખોડી ઓલિવ</translation> <translation id="7041173719775863268">પસંદગી સમાપ્ત કરો</translation> <translation id="7043850226734279132">ઘેરો ખાખી</translation> -<translation id="7051308646573997571">પરવાળું</translation> +<translation id="7051308646573997571">Coral</translation> <translation id="7062635574500127092">મોરપીંછ</translation> <translation id="7086377898680121060">તેજસ્વીતા વધારો</translation> <translation id="7088743565397416204">જે ફોકસ કરેલું હોય તેને સક્રિય કરવા માટે બે વાર ટૅપ કરો</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_or.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_or.xtb index e7dcdc4..8b0e2f2 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_or.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_or.xtb
@@ -807,7 +807,7 @@ <translation id="7039555289296502784">ଫିକା ଅଲିଭ୍</translation> <translation id="7041173719775863268">ଚୟନ ସମାପ୍ତ କରନ୍ତୁ</translation> <translation id="7043850226734279132">ଗାଢ଼ ଖାକି</translation> -<translation id="7051308646573997571">କୋରାଲ୍</translation> +<translation id="7051308646573997571">Coral</translation> <translation id="7062635574500127092">ଟିଲ୍</translation> <translation id="7086377898680121060">ଉଜ୍ଜ୍ୱଳତା ବଢ଼ାନ୍ତୁ</translation> <translation id="7088743565397416204">ଯାହା ଫୋକସ୍ କରାଯାଇଛି ତାହାକୁ ସକ୍ରିୟ କରିବାକୁ ଦୁଇଥର-ଟାପ୍ କରନ୍ତୁ</translation>
diff --git a/chrome/browser/resources/chromeos/add_supervision/DIR_METADATA b/chrome/browser/resources/chromeos/add_supervision/DIR_METADATA new file mode 100644 index 0000000..c0ebf85 --- /dev/null +++ b/chrome/browser/resources/chromeos/add_supervision/DIR_METADATA
@@ -0,0 +1,3 @@ +monorail { + component: "FamilyExperiences" +} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/add_supervision/OWNERS b/chrome/browser/resources/chromeos/add_supervision/OWNERS new file mode 100644 index 0000000..4de7c161 --- /dev/null +++ b/chrome/browser/resources/chromeos/add_supervision/OWNERS
@@ -0,0 +1 @@ +danan@chromium.org \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/DIR_METADATA b/chrome/browser/resources/chromeos/edu_coexistence/DIR_METADATA new file mode 100644 index 0000000..c0ebf85 --- /dev/null +++ b/chrome/browser/resources/chromeos/edu_coexistence/DIR_METADATA
@@ -0,0 +1,3 @@ +monorail { + component: "FamilyExperiences" +} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/OWNERS b/chrome/browser/resources/chromeos/edu_coexistence/OWNERS new file mode 100644 index 0000000..5bfa5595 --- /dev/null +++ b/chrome/browser/resources/chromeos/edu_coexistence/OWNERS
@@ -0,0 +1,3 @@ +agawronska@chromium.org +danan@chromium.org +yilkal@chromium.org \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.js b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.js index da470e3..b3f94b4 100644 --- a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.js +++ b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.js
@@ -81,9 +81,6 @@ this.webview_.addEventListener('contentload', () => { this.loading_ = false; - }); - - this.webview_.addEventListener('loadcommit', (e) => { this.configureUiForGaiaFlow(); }); },
diff --git a/chrome/browser/resources/chromeos/edu_login/DIR_METADATA b/chrome/browser/resources/chromeos/edu_login/DIR_METADATA new file mode 100644 index 0000000..c0ebf85 --- /dev/null +++ b/chrome/browser/resources/chromeos/edu_login/DIR_METADATA
@@ -0,0 +1,3 @@ +monorail { + component: "FamilyExperiences" +} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/emoji_picker/constants.js b/chrome/browser/resources/chromeos/emoji_picker/constants.js index 49b375e..1ad1a19 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/constants.js +++ b/chrome/browser/resources/chromeos/emoji_picker/constants.js
@@ -3,10 +3,10 @@ // found in the LICENSE file. // height and width should match the dialog size in EmojiPickerDialog. -export const EMOJI_PICKER_HEIGHT = 343; -export const EMOJI_PICKER_WIDTH = 280; +export const EMOJI_PICKER_HEIGHT = 390; +export const EMOJI_PICKER_WIDTH = 340; export const EMOJI_SIZE = 32; -export const EMOJI_PER_ROW = 7; +export const EMOJI_PER_ROW = 9; export const EMOJI_PICKER_HEIGHT_PX = `${EMOJI_PICKER_HEIGHT}px`; export const EMOJI_PICKER_WIDTH_PX = `${EMOJI_PICKER_WIDTH}px`;
diff --git a/chrome/browser/resources/invalidations/about_invalidations.html b/chrome/browser/resources/invalidations/about_invalidations.html index 2a5918d..12e7133c4 100644 --- a/chrome/browser/resources/invalidations/about_invalidations.html +++ b/chrome/browser/resources/invalidations/about_invalidations.html
@@ -3,10 +3,6 @@ <head> <meta charset="utf-8"> <title>Invalidations</title> - <script src="chrome://resources/js/cr.js"></script> - <script src="chrome://resources/js/assert.js"></script> - <script src="chrome://resources/js/util.js"></script> - <script src="chrome://invalidations/about_invalidations.js"></script> <link rel="stylesheet" href="chrome://resources/css/text_defaults.css"> <link rel="stylesheet" href="about_invalidations.css"> </head> @@ -64,6 +60,6 @@ <textarea id="internal-display" rows="10" cols="120" readonly></textarea> </div> </div> - <script src="chrome://resources/js/jstemplate_compiled.js"></script> + <script type="module" src="about_invalidations.js"></script> </body> </html>
diff --git a/chrome/browser/resources/invalidations/about_invalidations.js b/chrome/browser/resources/invalidations/about_invalidations.js index 8ef2c75..099e35c 100644 --- a/chrome/browser/resources/invalidations/about_invalidations.js +++ b/chrome/browser/resources/invalidations/about_invalidations.js
@@ -2,211 +2,218 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -cr.define('chrome.invalidations', function() { - /** - * Local variable where we maintain a count of the invalidations received - * and of every ObjectId that has ever been updated (note that this doesn't - * log any invalidations ocurred prior to opening the about:invalidation - * page). - */ - const tableObjects = {}; +import 'chrome://resources/js/jstemplate_compiled.js'; +import {addWebUIListener} from 'chrome://resources/js/cr.m.js'; +import {$} from 'chrome://resources/js/util.m.js'; +import {loadTestModule} from './test_loader_util.js'; - /** - * Local variable that contains the detailed information in an object form. - * This was done this way as to allow multiple calls to updateDetailedStatus - * to keep adding new items. - */ - let cachedDetails = {}; +/** + * Local variable where we maintain a count of the invalidations received + * and of every ObjectId that has ever been updated (note that this doesn't + * log any invalidations occurred prior to opening the about:invalidation + * page). + */ +const tableObjects = {}; - function quote(str) { - return '\"' + str + '\"'; +/** + * Local variable that contains the detailed information in an object form. + * This was done this way as to allow multiple calls to updateDetailedStatus + * to keep adding new items. + */ +let cachedDetails = {}; + +function quote(str) { + return '\"' + str + '\"'; +} + +function nowTimeString() { + return '[' + new Date().getTime() + '] '; +} + +/** + * Appends a string to a textarea log. + * @param {string} logMessage The string to be appended. + */ +function appendToLog(logMessage) { + const invalidationsLog = $('invalidations-log'); + invalidationsLog.value += logMessage + '\n'; +} +/** + * Updates the jstemplate with the latest ObjectIds, ordered by registrar. + */ +function repaintTable() { + const keys = []; + for (const key in tableObjects) { + keys.push(key); } - - function nowTimeString() { - return '[' + new Date().getTime() + '] '; + keys.sort(); + const sortedInvalidations = []; + for (let i = 0; i < keys.length; i++) { + sortedInvalidations.push(tableObjects[keys[i]]); } + const wrapped = {objectsidtable: sortedInvalidations}; + jstProcess(new JsEvalContext(wrapped), $('objectsid-table-div')); +} - /** - * Appends a string to a textarea log. - * @param {string} logMessage The string to be appended. - */ - function appendToLog(logMessage) { - const invalidationsLog = $('invalidations-log'); - invalidationsLog.value += logMessage + '\n'; - } - /** - * Updates the jstemplate with the latest ObjectIds, ordered by registrar. - */ - function repaintTable() { - const keys = []; - for (const key in tableObjects) { - keys.push(key); - } - keys.sort(); - const sortedInvalidations = []; - for (let i = 0; i < keys.length; i++) { - sortedInvalidations.push(tableObjects[keys[i]]); - } - const wrapped = {objectsidtable: sortedInvalidations}; - jstProcess(new JsEvalContext(wrapped), $('objectsid-table-div')); - } +/** + * Shows the current state of the InvalidatorService. + * @param {string} newState The string to be displayed and logged. + * @param {number} lastChangedTime The time in epoch when the state was last + * changed. + */ +function updateInvalidatorState(newState, lastChangedTime) { + const logMessage = nowTimeString() + + 'Invalidations service state changed to ' + quote(newState); - /** - * Shows the current state of the InvalidatorService. - * @param {string} newState The string to be displayed and logged. - * @param {number} lastChangedTime The time in epoch when the state was last - * changed. - */ - function updateInvalidatorState(newState, lastChangedTime) { - const logMessage = nowTimeString() + - 'Invalidations service state changed to ' + quote(newState); + appendToLog(logMessage); + $('invalidations-state').textContent = + newState + ' (since ' + new Date(lastChangedTime) + ')'; +} - appendToLog(logMessage); - $('invalidations-state').textContent = - newState + ' (since ' + new Date(lastChangedTime) + ')'; - } +/** + * Adds to the log the latest invalidations received + * @param {!Array<!Object>} allInvalidations The array of ObjectId + * that contains the invalidations received by the InvalidatorService. + */ +function logInvalidations(allInvalidations) { + for (let i = 0; i < allInvalidations.length; i++) { + const inv = allInvalidations[i]; + if (inv.hasOwnProperty('objectId')) { + const logMessage = nowTimeString() + 'Received Invalidation with type ' + + quote(inv.objectId.name) + ' version ' + + quote((inv.isUnknownVersion ? 'Unknown' : inv.version)) + + ' with payload ' + quote(inv.payload); - /** - * Adds to the log the latest invalidations received - * @param {!Array<!Object>} allInvalidations The array of ObjectId - * that contains the invalidations received by the InvalidatorService. - */ - function logInvalidations(allInvalidations) { - for (let i = 0; i < allInvalidations.length; i++) { - const inv = allInvalidations[i]; - if (inv.hasOwnProperty('objectId')) { - const logMessage = nowTimeString() + - 'Received Invalidation with type ' + quote(inv.objectId.name) + - ' version ' + - quote((inv.isUnknownVersion ? 'Unknown' : inv.version)) + - ' with payload ' + quote(inv.payload); - - appendToLog(logMessage); - const isInvalidation = true; - logToTable(inv, isInvalidation); - } - } - repaintTable(); - } - - /** - * Marks a change in the table whether a new invalidation has arrived - * or a new ObjectId is currently being added or updated. - * @param {!Object} oId The ObjectId being added or updated. - * @param {!boolean} isInvaldation A flag that says that an invalidation - * for this ObjectId has arrived or we just need to add it to the table - * as it was just updated its state. - */ - function logToTable(oId, isInvalidation) { - const registrar = oId.registrar; - const name = oId.objectId.name; - const source = oId.objectId.source; - const totalCount = oId.objectId.totalCount || 0; - const key = source + '-' + name; - const time = new Date(); - const version = oId.isUnknownVersion ? '?' : oId.version; - let payload = ''; - if (oId.hasOwnProperty('payload')) { - payload = oId.payload; - } - if (!(key in tableObjects)) { - tableObjects[key] = { - name: name, - source: source, - totalCount: totalCount, - sessionCount: 0, - registrar: registrar, - time: '', - version: '', - payload: '', - type: 'content' - }; - } - // Refresh the type to be a content because it might have been - // greyed out. - tableObjects[key].type = 'content'; - if (isInvalidation) { - tableObjects[key].totalCount = tableObjects[key].totalCount + 1; - tableObjects[key].sessionCount = tableObjects[key].sessionCount + 1; - tableObjects[key].time = time.toTimeString(); - tableObjects[key].version = version; - tableObjects[key].payload = payload; + appendToLog(logMessage); + const isInvalidation = true; + logToTable(inv, isInvalidation); } } + repaintTable(); +} - /** - * Shows the handlers that are currently registered for invalidations - * (but might not have objects ids registered yet). - * @param {!Array<string>} allHandlers An array of Strings that are - * the names of all the handlers currently registered in the - * InvalidatorService. - */ - function updateHandlers(allHandlers) { - const allHandlersFormatted = allHandlers.join(', '); - $('registered-handlers').textContent = allHandlersFormatted; - const logMessage = nowTimeString() + - 'InvalidatorHandlers currently registered: ' + allHandlersFormatted; - appendToLog(logMessage); +/** + * Marks a change in the table whether a new invalidation has arrived + * or a new ObjectId is currently being added or updated. + * @param {!Object} oId The ObjectId being added or updated. + * @param {!boolean} isInvaldation A flag that says that an invalidation + * for this ObjectId has arrived or we just need to add it to the table + * as it was just updated its state. + */ +function logToTable(oId, isInvalidation) { + const registrar = oId.registrar; + const name = oId.objectId.name; + const source = oId.objectId.source; + const totalCount = oId.objectId.totalCount || 0; + const key = source + '-' + name; + const time = new Date(); + const version = oId.isUnknownVersion ? '?' : oId.version; + let payload = ''; + if (oId.hasOwnProperty('payload')) { + payload = oId.payload; } - - /** - * Updates the table with the objects ids registered for invalidations - * @param {string} registrar The name of the owner of the InvalidationHandler - * that is registered for invalidations - * @param {Array of Object} allIds An array of ObjectsIds that are currently - * registered for invalidations. It is not differential (as in, whatever - * is not registered now but was before, it mean it was taken out the - * registered objects) - */ - function updateIds(registrar, allIds) { - // Grey out every datatype assigned to this registrar - // (and reenable them later in case they are still registered). - for (const key in tableObjects) { - if (tableObjects[key]['registrar'] === registrar) { - tableObjects[key].type = 'greyed'; - } - } - // Reenable those ObjectsIds still registered with this registrar. - for (let i = 0; i < allIds.length; i++) { - const oId = {objectId: allIds[i], registrar: registrar}; - const isInvalidation = false; - logToTable(oId, isInvalidation); - } - repaintTable(); - } - - /** - * Update the internal status display, merging new detailed information. - * @param {!Object} newDetails The dictionary containing assorted debugging - * details (e.g. Network Channel information). - */ - function updateDetailedStatus(newDetails) { - for (const key in newDetails) { - cachedDetails[key] = newDetails[key]; - } - $('internal-display').value = JSON.stringify(cachedDetails, null, 2); - } - - /** - * Function that notifies the InvalidationsMessageHandler that the UI is - * ready to receive real-time notifications. - */ - function onLoadWork() { - $('request-detailed-status').onclick = function() { - cachedDetails = {}; - chrome.send('requestDetailedStatus'); + if (!(key in tableObjects)) { + tableObjects[key] = { + name: name, + source: source, + totalCount: totalCount, + sessionCount: 0, + registrar: registrar, + time: '', + version: '', + payload: '', + type: 'content' }; - chrome.send('doneLoading'); } + // Refresh the type to be a content because it might have been + // greyed out. + tableObjects[key].type = 'content'; + if (isInvalidation) { + tableObjects[key].totalCount = tableObjects[key].totalCount + 1; + tableObjects[key].sessionCount = tableObjects[key].sessionCount + 1; + tableObjects[key].time = time.toTimeString(); + tableObjects[key].version = version; + tableObjects[key].payload = payload; + } +} - return { - logInvalidations: logInvalidations, - onLoadWork: onLoadWork, - updateDetailedStatus: updateDetailedStatus, - updateHandlers: updateHandlers, - updateIds: updateIds, - updateInvalidatorState: updateInvalidatorState, +/** + * Shows the handlers that are currently registered for invalidations + * (but might not have objects ids registered yet). + * @param {!Array<string>} allHandlers An array of Strings that are + * the names of all the handlers currently registered in the + * InvalidatorService. + */ +function updateHandlers(allHandlers) { + const allHandlersFormatted = allHandlers.join(', '); + $('registered-handlers').textContent = allHandlersFormatted; + const logMessage = nowTimeString() + + 'InvalidatorHandlers currently registered: ' + allHandlersFormatted; + appendToLog(logMessage); +} + +/** + * Updates the table with the objects ids registered for invalidations + * @param {string} registrar The name of the owner of the InvalidationHandler + * that is registered for invalidations + * @param {Array of Object} allIds An array of ObjectsIds that are currently + * registered for invalidations. It is not differential (as in, whatever + * is not registered now but was before, it mean it was taken out the + * registered objects) + */ +function updateIds(registrar, allIds) { + // Grey out every datatype assigned to this registrar + // (and reenable them later in case they are still registered). + for (const key in tableObjects) { + if (tableObjects[key]['registrar'] === registrar) { + tableObjects[key].type = 'greyed'; + } + } + // Reenable those ObjectsIds still registered with this registrar. + for (let i = 0; i < allIds.length; i++) { + const oId = {objectId: allIds[i], registrar: registrar}; + const isInvalidation = false; + logToTable(oId, isInvalidation); + } + repaintTable(); +} + +/** + * Update the internal status display, merging new detailed information. + * @param {!Object} newDetails The dictionary containing assorted debugging + * details (e.g. Network Channel information). + */ +function updateDetailedStatus(newDetails) { + for (const key in newDetails) { + cachedDetails[key] = newDetails[key]; + } + $('internal-display').value = JSON.stringify(cachedDetails, null, 2); +} + +/** + * Function that notifies the InvalidationsMessageHandler that the UI is + * ready to receive real-time notifications. + */ +function onLoadWork() { + addWebUIListener('handlers-updated', handlers => updateHandlers(handlers)); + addWebUIListener( + 'state-updated', + (state, lastChanged) => updateInvalidatorState(state, lastChanged)); + addWebUIListener( + 'ids-updated', (registrar, ids) => updateIds(registrar, ids)); + addWebUIListener( + 'log-invalidations', invalidations => logInvalidations(invalidations)); + addWebUIListener( + 'detailed-status-updated', + networkDetails => updateDetailedStatus(networkDetails)); + $('request-detailed-status').onclick = function() { + cachedDetails = {}; + chrome.send('requestDetailedStatus'); }; -}); + if (loadTestModule()) { + return; + } + chrome.send('doneLoading'); +} -document.addEventListener('DOMContentLoaded', chrome.invalidations.onLoadWork); +document.addEventListener('DOMContentLoaded', onLoadWork);
diff --git a/chrome/browser/resources/net_internals/index.js b/chrome/browser/resources/net_internals/index.js index 54ec02e..ecbf615 100644 --- a/chrome/browser/resources/net_internals/index.js +++ b/chrome/browser/resources/net_internals/index.js
@@ -3,15 +3,9 @@ // found in the LICENSE file. import {MainView} from './main.js'; +import {loadTestModule} from './test_loader_util.js'; document.addEventListener('DOMContentLoaded', function() { MainView.getInstance(); // from main.js - const params = new URLSearchParams(window.location.search); - const test = params.get('test'); - if (test) { - const script = document.createElement('script'); - script.type = 'module'; - script.src = `chrome://test/net_internals/${test}`; - document.body.appendChild(script); - } + loadTestModule(); });
diff --git a/chrome/browser/resources/tab_search/app.js b/chrome/browser/resources/tab_search/app.js index 502117d..461c65fd 100644 --- a/chrome/browser/resources/tab_search/app.js +++ b/chrome/browser/resources/tab_search/app.js
@@ -20,7 +20,7 @@ import {fuzzySearch} from './fuzzy_search.js'; import {InfiniteList, NO_SELECTION, selectorNavigationKeys} from './infinite_list.js'; import {TabData} from './tab_data.js'; -import {Tab, WindowTabs} from './tab_search.mojom-webui.js'; +import {Tab, Window} from './tab_search.mojom-webui.js'; import {TabSearchApiProxy, TabSearchApiProxyImpl} from './tab_search_api_proxy.js'; export class TabSearchAppElement extends PolymerElement { @@ -130,7 +130,7 @@ const callbackRouter = this.apiProxy_.getCallbackRouter(); this.listenerIds_.push( callbackRouter.tabsChanged.addListener( - profileTabs => this.openTabsChanged_(profileTabs.windows)), + profileData => this.openTabsChanged_(profileData.windows)), callbackRouter.tabUpdated.addListener(tab => this.onTabUpdated_(tab)), callbackRouter.tabsRemoved.addListener( tabIds => this.onTabsRemoved_(tabIds))); @@ -162,12 +162,12 @@ /** @private */ updateTabs_() { const getTabsStartTimestamp = Date.now(); - this.apiProxy_.getProfileTabs().then(({profileTabs}) => { + this.apiProxy_.getProfileData().then(({profileData}) => { chrome.metricsPrivate.recordTime( 'Tabs.TabSearch.WebUI.TabListDataReceived', Math.round(Date.now() - getTabsStartTimestamp)); - this.openTabsChanged_(profileTabs.windows); + this.openTabsChanged_(profileData.windows); }); } @@ -303,12 +303,12 @@ } /** - * @param {!Array<!WindowTabs>} newOpenWindowTabs + * @param {!Array<!Window>} newOpenWindows * @private */ - openTabsChanged_(newOpenWindowTabs) { + openTabsChanged_(newOpenWindows) { this.openTabs_ = []; - newOpenWindowTabs.forEach(({active, tabs}) => { + newOpenWindows.forEach(({active, tabs}) => { tabs.forEach(tab => { this.openTabs_.push(this.tabData_(tab, active)); });
diff --git a/chrome/browser/resources/tab_search/tab_search.js b/chrome/browser/resources/tab_search/tab_search.js index 01b83e2..bca0a2e 100644 --- a/chrome/browser/resources/tab_search/tab_search.js +++ b/chrome/browser/resources/tab_search/tab_search.js
@@ -8,7 +8,7 @@ export {fuzzySearch} from './fuzzy_search.js'; export {InfiniteList} from './infinite_list.js'; export {TabData} from './tab_data.js'; -export {PageCallbackRouter, PageRemote, ProfileTabs, Tab} from './tab_search.mojom-webui.js'; +export {PageCallbackRouter, PageRemote, ProfileData, Tab} from './tab_search.mojom-webui.js'; export {TabSearchApiProxy, TabSearchApiProxyImpl} from './tab_search_api_proxy.js'; export {TabSearchItem} from './tab_search_item.js'; export {TabSearchSearchField} from './tab_search_search_field.js';
diff --git a/chrome/browser/resources/tab_search/tab_search_api_proxy.js b/chrome/browser/resources/tab_search/tab_search_api_proxy.js index e3bd2d1..5136eec 100644 --- a/chrome/browser/resources/tab_search/tab_search_api_proxy.js +++ b/chrome/browser/resources/tab_search/tab_search_api_proxy.js
@@ -4,7 +4,7 @@ import {addSingletonGetter} from 'chrome://resources/js/cr.m.js'; -import {PageCallbackRouter, PageHandlerFactory, PageHandlerRemote, ProfileTabs, SwitchToTabInfo} from './tab_search.mojom-webui.js'; +import {PageCallbackRouter, PageHandlerFactory, PageHandlerRemote, ProfileData, SwitchToTabInfo} from './tab_search.mojom-webui.js'; /** * These values are persisted to logs and should not be renumbered or re-used. @@ -25,8 +25,8 @@ */ closeTab(tabId, withSearch, closedTabIndex) {} - /** @return {Promise<{profileTabs: ProfileTabs}>} */ - getProfileTabs() {} + /** @return {Promise<{profileData: ProfileData}>} */ + getProfileData() {} showFeedbackPage() {} @@ -70,8 +70,8 @@ } /** @override */ - getProfileTabs() { - return this.handler.getProfileTabs(); + getProfileData() { + return this.handler.getProfileData(); } /** @override */
diff --git a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win.cc b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win.cc index 204f236..90de78e4 100644 --- a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win.cc +++ b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win.cc
@@ -69,7 +69,7 @@ } // Helper function to convert HKEYs to strings. -base::string16 HKEYToString(HKEY key) { +std::wstring HKEYToString(HKEY key) { DCHECK_EQ(HKEY_CURRENT_USER, key); return L"HKEY_CURRENT_USER"; } @@ -196,7 +196,7 @@ ClientIncidentReport_EnvironmentData_Process_Dll* dll = process->add_dll(); dll->set_path( - base::WideToUTF8(base::i18n::ToLower(sanitized_path.value()))); + base::UTF16ToUTF8(base::i18n::ToLower(sanitized_path.AsUTF16Unsafe()))); dll->set_base_address(module.base_address); dll->set_length(module.size); // TODO(grt): Consider skipping this for valid system modules. @@ -222,7 +222,8 @@ for (size_t i = 0; i < lsp_list.size(); ++i) { base::FilePath lsp_path(ExpandEnvironmentVariables(lsp_list[i].path)); path_sanitizer.StripHomeDirectory(&lsp_path); - lsp_paths.insert(base::i18n::ToLower(lsp_path.value())); + lsp_paths.insert( + base::UTF16ToWide(base::i18n::ToLower(lsp_path.AsUTF16Unsafe()))); } // Look for a match between LSPs and loaded dlls.
diff --git a/chrome/browser/safe_browsing/incident_reporting/platform_state_store_win.cc b/chrome/browser/safe_browsing/incident_reporting/platform_state_store_win.cc index cba03a0..51bfc0f 100644 --- a/chrome/browser/safe_browsing/incident_reporting/platform_state_store_win.cc +++ b/chrome/browser/safe_browsing/incident_reporting/platform_state_store_win.cc
@@ -22,12 +22,12 @@ namespace { // Returns the path to the registry key holding profile-specific state values. -base::string16 GetStateStoreKeyName() { +std::wstring GetStateStoreKeyName() { return install_static::GetRegistryPath().append(L"\\IncidentsSent"); } // Returns the name of the registry value for |profile|'s state. -base::string16 GetValueNameForProfile(Profile* profile) { +std::wstring GetValueNameForProfile(Profile* profile) { return profile->GetPath().BaseName().value(); } @@ -38,7 +38,7 @@ if (key.Open(HKEY_CURRENT_USER, GetStateStoreKeyName().c_str(), KEY_QUERY_VALUE | KEY_SET_VALUE | KEY_WOW64_32KEY) == ERROR_SUCCESS) { - base::string16 value_name(GetValueNameForProfile(profile)); + std::wstring value_name(GetValueNameForProfile(profile)); if (key.HasValue(value_name.c_str())) { if (key.DeleteValue(value_name.c_str()) == ERROR_SUCCESS) return PlatformStateStoreLoadResult::CLEARED_DATA; @@ -58,7 +58,7 @@ return ClearStoreData(profile); } - base::string16 value_name(GetValueNameForProfile(profile)); + std::wstring value_name(GetValueNameForProfile(profile)); base::win::RegKey key; if (key.Open(HKEY_CURRENT_USER, GetStateStoreKeyName().c_str(), KEY_QUERY_VALUE | KEY_WOW64_32KEY) == ERROR_SUCCESS) {
diff --git a/chrome/browser/sharesheet/sharesheet_service.cc b/chrome/browser/sharesheet/sharesheet_service.cc index 6b2ed32a..7c3bc62 100644 --- a/chrome/browser/sharesheet/sharesheet_service.cc +++ b/chrome/browser/sharesheet/sharesheet_service.cc
@@ -4,9 +4,11 @@ #include "chrome/browser/sharesheet/sharesheet_service.h" +#include <algorithm> #include <utility> #include "base/bind.h" +#include "base/no_destructor.h" #include "base/optional.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -31,6 +33,16 @@ namespace sharesheet { +namespace { + +base::string16& GetSelectedApp() { + static base::NoDestructor<base::string16> selected_app; + + return *selected_app; +} + +} // namespace + SharesheetService::SharesheetService(Profile* profile) : profile_(profile), sharesheet_action_cache_(std::make_unique<SharesheetActionCache>()), @@ -95,14 +107,7 @@ delegate->OnActionLaunched(); share_action->LaunchAction(delegate, share_action_view, std::move(intent)); } else if (type == TargetType::kApp) { - auto launch_source = apps::mojom::LaunchSource::kFromSharesheet; - app_service_proxy_->LaunchAppWithIntent( - base::UTF16ToUTF8(target_name), - apps::GetEventFlags( - apps::mojom::LaunchContainer::kLaunchContainerWindow, - WindowOpenDisposition::NEW_WINDOW, - /*prefer_container=*/true), - std::move(intent), launch_source, display::kDefaultDisplayId); + LaunchApp(target_name, std::move(intent)); delegate->CloseSharesheet(); } } @@ -150,6 +155,12 @@ return sharesheet_action_cache_->GetVectorIconFromName(display_name); } +// static +void SharesheetService::SetSelectedAppForTesting( + const base::string16& target_name) { + GetSelectedApp() = target_name; +} + void SharesheetService::LoadAppIcons( std::vector<apps::IntentLaunchInfo> intent_launch_info, std::vector<TargetInfo> targets, @@ -175,6 +186,17 @@ std::move(targets), index, std::move(callback))); } +void SharesheetService::LaunchApp(const base::string16& target_name, + apps::mojom::IntentPtr intent) { + auto launch_source = apps::mojom::LaunchSource::kFromSharesheet; + app_service_proxy_->LaunchAppWithIntent( + base::UTF16ToUTF8(target_name), + apps::GetEventFlags(apps::mojom::LaunchContainer::kLaunchContainerWindow, + WindowOpenDisposition::NEW_WINDOW, + /*prefer_container=*/true), + std::move(intent), launch_source, display::kDefaultDisplayId); +} + void SharesheetService::OnIconLoaded( std::vector<apps::IntentLaunchInfo> intent_launch_info, std::vector<TargetInfo> targets, @@ -200,6 +222,25 @@ apps::mojom::IntentPtr intent, CloseCallback close_callback, std::vector<TargetInfo> targets) { + // If SetSelectedAppForTesting() has been called, immediately launch the app. + const base::string16 selected_app = GetSelectedApp(); + if (!selected_app.empty()) { + SharesheetResult result = SharesheetResult::kCancel; + auto iter = std::find_if(targets.begin(), targets.end(), + [selected_app](const auto& target) { + return target.type == TargetType::kApp && + target.launch_name == selected_app; + }); + if (iter != targets.end()) { + LaunchApp(selected_app, std::move(intent)); + result = SharesheetResult::kSuccess; + } + + std::move(close_callback).Run(result); + delegate->OnBubbleClosed(/*active_action=*/base::string16()); + return; + } + delegate->ShowBubble(std::move(targets), std::move(intent), std::move(close_callback)); }
diff --git a/chrome/browser/sharesheet/sharesheet_service.h b/chrome/browser/sharesheet/sharesheet_service.h index 61af69e..512277d 100644 --- a/chrome/browser/sharesheet/sharesheet_service.h +++ b/chrome/browser/sharesheet/sharesheet_service.h
@@ -79,6 +79,8 @@ Profile* GetProfile(); const gfx::VectorIcon* GetVectorIcon(const base::string16& display_name); + static void SetSelectedAppForTesting(const base::string16& target_name); + private: using SharesheetServiceIconLoaderCallback = base::OnceCallback<void(std::vector<TargetInfo> targets)>; @@ -88,6 +90,9 @@ size_t index, SharesheetServiceIconLoaderCallback callback); + void LaunchApp(const base::string16& target_name, + apps::mojom::IntentPtr intent); + void OnIconLoaded(std::vector<apps::IntentLaunchInfo> intent_launch_info, std::vector<TargetInfo> targets, size_t index,
diff --git a/chrome/browser/shell_integration_win.cc b/chrome/browser/shell_integration_win.cc index 3eff4e2..1a3a32b 100644 --- a/chrome/browser/shell_integration_win.cc +++ b/chrome/browser/shell_integration_win.cc
@@ -66,10 +66,10 @@ // Helper function for GetAppId to generates profile id // from profile path. "profile_id" is composed of sanitized basenames of // user data dir and profile dir joined by a ".". -base::string16 GetProfileIdFromPath(const base::FilePath& profile_path) { +std::wstring GetProfileIdFromPath(const base::FilePath& profile_path) { // Return empty string if profile_path is empty if (profile_path.empty()) - return base::string16(); + return std::wstring(); base::FilePath default_user_data_dir; // Return empty string if profile_path is in default user data @@ -77,15 +77,15 @@ if (chrome::GetDefaultUserDataDirectory(&default_user_data_dir) && profile_path.DirName() == default_user_data_dir && profile_path.BaseName().value() == - base::ASCIIToUTF16(chrome::kInitialProfile)) { - return base::string16(); + base::ASCIIToWide(chrome::kInitialProfile)) { + return std::wstring(); } // Get joined basenames of user data dir and profile. - base::string16 basenames = profile_path.DirName().BaseName().value() + - L"." + profile_path.BaseName().value(); + std::wstring basenames = profile_path.DirName().BaseName().value() + L"." + + profile_path.BaseName().value(); - base::string16 profile_id; + std::wstring profile_id; profile_id.reserve(basenames.size()); // Generate profile_id from sanitized basenames. @@ -99,14 +99,14 @@ return profile_id; } -base::string16 GetAppUserModelIdImpl(const base::string16& prefix, - const base::string16& app_name, - const base::FilePath& profile_path) { - std::vector<base::string16> components; +std::wstring GetAppUserModelIdImpl(const std::wstring& prefix, + const std::wstring& app_name, + const base::FilePath& profile_path) { + std::vector<std::wstring> components; if (!prefix.empty()) components.push_back(prefix); components.push_back(app_name); - const base::string16 profile_id(GetProfileIdFromPath(profile_path)); + const std::wstring profile_id(GetProfileIdFromPath(profile_path)); if (!profile_id.empty()) components.push_back(profile_id); return ShellUtil::BuildAppUserModelId(components); @@ -114,8 +114,8 @@ // Gets expected app id for given Chrome (based on |command_line| and // |is_per_user_install|). -base::string16 GetExpectedAppId(const base::CommandLine& command_line, - bool is_per_user_install) { +std::wstring GetExpectedAppId(const base::CommandLine& command_line, + bool is_per_user_install) { base::FilePath user_data_dir; if (command_line.HasSwitch(switches::kUserDataDir)) user_data_dir = command_line.GetSwitchValuePath(switches::kUserDataDir); @@ -130,20 +130,19 @@ profile_subdir = command_line.GetSwitchValuePath(switches::kProfileDirectory); } else { - profile_subdir = - base::FilePath(base::ASCIIToUTF16(chrome::kInitialProfile)); + profile_subdir = base::FilePath(base::ASCIIToWide(chrome::kInitialProfile)); } DCHECK(!profile_subdir.empty()); base::FilePath profile_path = user_data_dir.Append(profile_subdir); - base::string16 prefix; - base::string16 app_name; + std::wstring prefix; + std::wstring app_name; if (command_line.HasSwitch(switches::kApp)) { - app_name = base::UTF8ToUTF16(web_app::GenerateApplicationNameFromURL( + app_name = base::UTF8ToWide(web_app::GenerateApplicationNameFromURL( GURL(command_line.GetSwitchValueASCII(switches::kApp)))); prefix = install_static::GetBaseAppId(); } else if (command_line.HasSwitch(switches::kAppId)) { - app_name = base::UTF8ToUTF16(web_app::GenerateApplicationNameFromAppId( + app_name = base::UTF8ToWide(web_app::GenerateApplicationNameFromAppId( command_line.GetSwitchValueASCII(switches::kAppId))); prefix = install_static::GetBaseAppId(); } else { @@ -157,7 +156,7 @@ // Windows treats a given scheme as an Internet scheme only if its registry // entry has a "URL Protocol" key. Check this, otherwise we allow ProgIDs to be // used as custom protocols which leads to security bugs. -bool IsValidCustomProtocol(const base::string16& scheme) { +bool IsValidCustomProtocol(const std::wstring& scheme) { if (scheme.empty()) return false; base::win::RegKey cmd_key(HKEY_CLASSES_ROOT, scheme.c_str(), KEY_QUERY_VALUE); @@ -168,7 +167,7 @@ // be retrieved in the HKCR registry subkey method implemented below. We call // AssocQueryString with the new Win8-only flag ASSOCF_IS_PROTOCOL instead. base::string16 GetAppForProtocolUsingAssocQuery(const GURL& url) { - const base::string16 url_scheme = base::ASCIIToUTF16(url.scheme()); + const std::wstring url_scheme = base::ASCIIToWide(url.scheme()); if (!IsValidCustomProtocol(url_scheme)) return base::string16(); @@ -185,32 +184,32 @@ DLOG(WARNING) << "AssocQueryString failed!"; return base::string16(); } - return base::string16(out_buffer); + return base::AsString16(std::wstring(out_buffer)); } base::string16 GetAppForProtocolUsingRegistry(const GURL& url) { - const base::string16 url_scheme = base::ASCIIToUTF16(url.scheme()); + const std::wstring url_scheme = base::ASCIIToWide(url.scheme()); if (!IsValidCustomProtocol(url_scheme)) return base::string16(); // First, try and extract the application's display name. - base::string16 command_to_launch; + std::wstring command_to_launch; base::win::RegKey cmd_key_name(HKEY_CLASSES_ROOT, url_scheme.c_str(), KEY_READ); if (cmd_key_name.ReadValue(NULL, &command_to_launch) == ERROR_SUCCESS && !command_to_launch.empty()) { - return command_to_launch; + return base::AsString16(command_to_launch); } // Otherwise, parse the command line in the registry, and return the basename // of the program path if it exists. - const base::string16 cmd_key_path = url_scheme + L"\\shell\\open\\command"; + const std::wstring cmd_key_path = url_scheme + L"\\shell\\open\\command"; base::win::RegKey cmd_key_exe(HKEY_CLASSES_ROOT, cmd_key_path.c_str(), KEY_READ); if (cmd_key_exe.ReadValue(NULL, &command_to_launch) == ERROR_SUCCESS) { base::CommandLine command_line( base::CommandLine::FromString(command_to_launch)); - return command_line.GetProgram().BaseName().value(); + return command_line.GetProgram().BaseName().AsUTF16Unsafe(); } return base::string16(); @@ -262,7 +261,7 @@ base::UserMetricsAction("SettingsAppMonitor.ChooserInvoked")); } - void OnBrowserChosen(const base::string16& browser_name) override { + void OnBrowserChosen(const std::wstring& browser_name) override { if (browser_name == InstallUtil::GetDisplayName()) { base::RecordAction( base::UserMetricsAction("SettingsAppMonitor.ChromeBrowserChosen")); @@ -523,8 +522,8 @@ win::MigrateShortcutsInPathInternal(chrome_proxy_path, shortcut_path); } -base::string16 GetHttpProtocolUserChoiceProgId() { - base::string16 prog_id; +std::wstring GetHttpProtocolUserChoiceProgId() { + std::wstring prog_id; base::win::RegKey key(HKEY_CURRENT_USER, ShellUtil::kRegVistaUrlPrefs, KEY_QUERY_VALUE); if (key.Valid()) @@ -568,7 +567,7 @@ return false; } - base::string16 wprotocol(base::UTF8ToUTF16(protocol)); + std::wstring wprotocol(base::UTF8ToWide(protocol)); if (!ShellUtil::MakeChromeDefaultProtocolClient(chrome_exe, wprotocol)) { LOG(ERROR) << "Chrome could not be set as default handler for " << protocol << "."; @@ -618,8 +617,8 @@ } std::string GetFirefoxProgIdSuffix() { - const base::string16 app_cmd = GetHttpProtocolUserChoiceProgId(); - static constexpr base::StringPiece16 kFirefoxProgIdPrefix(L"FirefoxURL-"); + const std::wstring app_cmd = GetHttpProtocolUserChoiceProgId(); + static constexpr base::WStringPiece kFirefoxProgIdPrefix(L"FirefoxURL-"); if (base::StartsWith(app_cmd, kFirefoxProgIdPrefix, base::CompareCase::SENSITIVE)) { // Returns the id that appears after the prefix "FirefoxURL-". @@ -636,7 +635,7 @@ DefaultWebClientState IsDefaultProtocolClient(const std::string& protocol) { return GetDefaultWebClientStateFromShellUtilDefaultState( ShellUtil::GetChromeDefaultProtocolClientState( - base::UTF8ToUTF16(protocol))); + base::UTF8ToWide(protocol))); } namespace win { @@ -696,7 +695,7 @@ return false; } - base::string16 wprotocol(base::UTF8ToUTF16(protocol)); + std::wstring wprotocol(base::UTF8ToWide(protocol)); if (!ShellUtil::ShowMakeChromeDefaultProtocolClientSystemUI(chrome_exe, wprotocol)) { LOG(ERROR) << "Failed to launch the set-default-client Windows UI."; @@ -718,22 +717,22 @@ } // The helper manages its own lifetime. - base::string16 wprotocol(base::UTF8ToUTF16(protocol)); + std::wstring wprotocol(base::UTF8ToWide(protocol)); const wchar_t* const kProtocols[] = {wprotocol.c_str(), nullptr}; OpenSystemSettingsHelper::Begin(kProtocols, std::move(on_finished_callback)); ShellUtil::ShowMakeChromeDefaultProtocolClientSystemUI(chrome_exe, wprotocol); } -base::string16 GetAppUserModelIdForApp(const base::string16& app_name, - const base::FilePath& profile_path) { +std::wstring GetAppUserModelIdForApp(const std::wstring& app_name, + const base::FilePath& profile_path) { return GetAppUserModelIdImpl(install_static::GetBaseAppId(), app_name, profile_path); } -base::string16 GetAppUserModelIdForBrowser(const base::FilePath& profile_path) { +std::wstring GetAppUserModelIdForBrowser(const base::FilePath& profile_path) { return GetAppUserModelIdImpl( - base::string16(), + std::wstring(), ShellUtil::GetBrowserModelId(InstallUtil::IsPerUserInstall()), profile_path); } @@ -812,7 +811,7 @@ int shortcuts_migrated = 0; base::FilePath target_path; - base::string16 arguments; + std::wstring arguments; base::win::ScopedPropVariant propvariant; for (base::FilePath shortcut = shortcuts_enum.Next(); !shortcut.empty(); shortcut = shortcuts_enum.Next()) { @@ -828,7 +827,7 @@ L"\"%ls\" %ls", target_path.value().c_str(), arguments.c_str()))); // Get the expected AppId for this Chrome shortcut. - base::string16 expected_app_id( + std::wstring expected_app_id( GetExpectedAppId(command_line, is_per_user_install)); if (expected_app_id.empty()) continue; @@ -865,7 +864,7 @@ updated_properties.set_app_id(expected_app_id); break; case VT_LPWSTR: - if (expected_app_id != base::string16(propvariant.get().pwszVal)) + if (expected_app_id != std::wstring(propvariant.get().pwszVal)) updated_properties.set_app_id(expected_app_id); break; default: @@ -877,7 +876,7 @@ // Clear dual_mode property from any shortcuts that previously had it (it // was only ever installed on shortcuts with the // |default_chromium_model_id|). - base::string16 default_chromium_model_id( + std::wstring default_chromium_model_id( ShellUtil::GetBrowserModelId(is_per_user_install)); if (expected_app_id == default_chromium_model_id) { propvariant.Reset();
diff --git a/chrome/browser/shell_integration_win.h b/chrome/browser/shell_integration_win.h index 35c851c9..ee0060ed 100644 --- a/chrome/browser/shell_integration_win.h +++ b/chrome/browser/shell_integration_win.h
@@ -10,7 +10,6 @@ #include "base/callback_forward.h" #include "base/files/file_path.h" -#include "base/strings/string16.h" namespace shell_integration { namespace win { @@ -62,8 +61,8 @@ // app name and profile path. The returned app id format is // "<install_static::GetBaseAppId()>.|app_name|[.<profile_id>]". // |profile_id| is only appended when it's not the default profile. -base::string16 GetAppUserModelIdForApp(const base::string16& app_name, - const base::FilePath& profile_path); +std::wstring GetAppUserModelIdForApp(const std::wstring& app_name, + const base::FilePath& profile_path); // Generates an application user model ID (AppUserModelId) for Chromium by // calling GetAppUserModelIdImpl() with ShellUtil::GetBrowserModelId() as @@ -73,7 +72,7 @@ // browser_suffix is only appended to the BaseAppId if the installer // has set the kRegisterChromeBrowserSuffix command line switch, e.g., // on user-level installs. -base::string16 GetAppUserModelIdForBrowser(const base::FilePath& profile_path); +std::wstring GetAppUserModelIdForBrowser(const base::FilePath& profile_path); // Returns the taskbar pin state of Chrome via the IsPinnedToTaskbarCallback. // The first bool is true if the state could be calculated, and the second bool
diff --git a/chrome/browser/sync/test/integration/passwords_helper.cc b/chrome/browser/sync/test/integration/passwords_helper.cc index 20cbbc9..73ae91ce 100644 --- a/chrome/browser/sync/test/integration/passwords_helper.cc +++ b/chrome/browser/sync/test/integration/passwords_helper.cc
@@ -21,7 +21,7 @@ #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/sync_datatype_helper.h" -#include "components/password_manager/core/browser/compromised_credentials_consumer.h" +#include "components/password_manager/core/browser/insecure_credentials_consumer.h" #include "components/password_manager/core/browser/password_manager_test_utils.h" #include "components/password_manager/core/browser/password_store.h" #include "components/password_manager/core/browser/password_store_consumer.h" @@ -31,7 +31,7 @@ #include "net/base/escape.h" #include "url/gurl.h" -using password_manager::CompromisedCredentials; +using password_manager::InsecureCredential; using password_manager::PasswordForm; using password_manager::PasswordStore; using sync_datatype_helper::test; @@ -73,26 +73,27 @@ DISALLOW_COPY_AND_ASSIGN(PasswordStoreConsumerHelper); }; +// TODO(crbug.com/1175743) Rename Compromised to Insecure. class CompromisedCredentialsConsumerHelper - : public password_manager::CompromisedCredentialsConsumer { + : public password_manager::InsecureCredentialsConsumer { public: CompromisedCredentialsConsumerHelper() = default; - void OnGetCompromisedCredentials( - std::vector<CompromisedCredentials> compromised_credentials) override { - compromised_credentials_ = std::move(compromised_credentials); + void OnGetInsecureCredentials( + std::vector<InsecureCredential> insecure_credentials) override { + insecure_credentials_ = std::move(insecure_credentials); run_loop_.Quit(); } - std::vector<CompromisedCredentials> WaitForResult() { + std::vector<InsecureCredential> WaitForResult() { DCHECK(!run_loop_.running()); content::RunThisRunLoop(&run_loop_); - return compromised_credentials_; + return insecure_credentials_; } private: base::RunLoop run_loop_; - std::vector<CompromisedCredentials> compromised_credentials_; + std::vector<InsecureCredential> insecure_credentials_; DISALLOW_COPY_AND_ASSIGN(CompromisedCredentialsConsumerHelper); }; @@ -177,7 +178,7 @@ } void AddCompromisedCredentials(PasswordStore* store, - const CompromisedCredentials& issue) { + const InsecureCredential& issue) { ASSERT_TRUE(store); base::WaitableEvent wait_event( base::WaitableEvent::ResetPolicy::MANUAL, @@ -225,7 +226,7 @@ return consumer.WaitForResult(); } -std::vector<CompromisedCredentials> GetAllCompromisedCredentials( +std::vector<InsecureCredential> GetAllCompromisedCredentials( PasswordStore* store) { DCHECK(store); CompromisedCredentialsConsumerHelper consumer; @@ -251,7 +252,7 @@ } void RemoveCompromisedCredentials(PasswordStore* store, - const CompromisedCredentials& credential) { + const InsecureCredential& credential) { ASSERT_TRUE(store); base::WaitableEvent wait_event( base::WaitableEvent::ResetPolicy::MANUAL, @@ -380,10 +381,10 @@ return form; } -CompromisedCredentials CreateCompromisedCredentials( +InsecureCredential CreateCompromisedCredentials( int index, password_manager::InsecureType type) { - CompromisedCredentials issue; + InsecureCredential issue; issue.signon_realm = kFakeSignonRealm; // This should stay compatible with the implementation of // CreateTestPasswordForm() and use the same username format.
diff --git a/chrome/browser/tab/BUILD.gn b/chrome/browser/tab/BUILD.gn index acc176ab..443a1c10 100644 --- a/chrome/browser/tab/BUILD.gn +++ b/chrome/browser/tab/BUILD.gn
@@ -18,6 +18,7 @@ "java/src/org/chromium/chrome/browser/tab/TabHidingType.java", "java/src/org/chromium/chrome/browser/tab/TabLifecycle.java", "java/src/org/chromium/chrome/browser/tab/TabObserver.java", + "java/src/org/chromium/chrome/browser/tab/TabResolver.java", "java/src/org/chromium/chrome/browser/tab/TabState.java", "java/src/org/chromium/chrome/browser/tab/TabViewManager.java", "java/src/org/chromium/chrome/browser/tab/TabViewProvider.java",
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabResolver.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabResolver.java new file mode 100644 index 0000000..6d8a2219 --- /dev/null +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabResolver.java
@@ -0,0 +1,16 @@ +// 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. + +package org.chromium.chrome.browser.tab; + +/** + * Resolves a tab, given a Tab ID. + */ +@FunctionalInterface +public interface TabResolver { + /** + * @return {@link} Tab corresponding to a tab id + */ + Tab resolve(int id); +}
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage.java index 52e279b..5bd90b1 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage.java
@@ -16,6 +16,7 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.StreamUtil; +import org.chromium.base.StrictModeContext; import org.chromium.base.ThreadUtils; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.task.AsyncTask; @@ -117,8 +118,12 @@ processNextItemOnQueue(); } - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - protected File getFile(int tabId, String dataId) { + /** + * @return {@link File} serialized {@link CriticalPersistedTabData} is stored in + * @param tabId tab identifier + * @param dataId type of data stored for the {@link Tab} + */ + protected static File getFile(int tabId, String dataId) { return new File(getOrCreateBaseStorageDirectory(), String.format(Locale.ENGLISH, "%d%s", tabId, dataId)); } @@ -142,7 +147,7 @@ StorageRequest(int tabId, String dataId) { mTabId = tabId; mDataId = dataId; - mFile = getFile(tabId, dataId); + mFile = FilePersistedTabDataStorage.getFile(tabId, dataId); } /** @@ -396,4 +401,32 @@ public String getUmaTag() { return "File"; } + + /** + * Determines if a {@link Tab} is incognito or not based on the existence of the + * corresponding {@link CriticalPersistedTabData} file. This involves a disk access + * and will be slow. This method can be called from the UI thread. + * @param tabId identifier for the {@link Tab} + * @return true/false if the {@link Tab} is incognito based on the existence of the + * CriticalPersistedTabData file and null if it is not known if the + * {@link Tab} is incognito or not. + */ + public static Boolean isIncognito(int tabId) { + try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) { + String regularId = + PersistedTabDataConfiguration.get(CriticalPersistedTabData.class, false) + .getId(); + File regularFile = FilePersistedTabDataStorage.getFile(tabId, regularId); + if (regularFile.exists()) { + return false; + } + String incognitoId = + PersistedTabDataConfiguration.get(CriticalPersistedTabData.class, true).getId(); + File incognitoFile = FilePersistedTabDataStorage.getFile(tabId, incognitoId); + if (incognitoFile.exists()) { + return true; + } + return null; + } + } }
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreator.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreator.java index 5fec0e7..dcf2756 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreator.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreator.java
@@ -43,12 +43,13 @@ * On restore, allows us to create a frozen version of a tab using saved tab state we read * from disk. * @param state The tab state that the tab can be restored from. - * @param id The id to give the new tab. * @param criticalPersistedTabData serialized {@link CriticalPersistedTabData} + * @param id The id to give the new tab. + * @param isIncognito if the {@link Tab} is incognito or not * @param index The index for where to place the tab. */ - public abstract Tab createFrozenTab( - TabState state, byte[] serializedCriticalPersistedTabData, int id, int index); + public abstract Tab createFrozenTab(TabState state, byte[] serializedCriticalPersistedTabData, + int id, boolean isIncognito, int index); /** * Creates a new tab and loads the specified URL in it. This is a convenience method for
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 30a169c5..2eaa2857 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -401,6 +401,7 @@ "//components/account_id", "//components/autofill/content/browser:risk_proto", "//components/autofill/core/browser", + "//components/autofill_assistant/browser/public:public", "//components/blocked_content", "//components/bookmarks/browser", "//components/bookmarks/managed", @@ -2231,10 +2232,10 @@ "webui/chromeos/drive_internals_ui.h", "webui/chromeos/edu_account_login_handler_chromeos.cc", "webui/chromeos/edu_account_login_handler_chromeos.h", - "webui/chromeos/edu_coexistence_login_handler_chromeos.cc", - "webui/chromeos/edu_coexistence_login_handler_chromeos.h", - "webui/chromeos/edu_coexistence_state_tracker.cc", - "webui/chromeos/edu_coexistence_state_tracker.h", + "webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc", + "webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h", + "webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.cc", + "webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h", "webui/chromeos/emoji/emoji_dialog.cc", "webui/chromeos/emoji/emoji_dialog.h", "webui/chromeos/emoji/emoji_handler.cc", @@ -3531,6 +3532,8 @@ "views/bookmarks/bookmark_menu_delegate.h", "views/browser_commands_views.cc", "views/browser_dialogs_views.cc", + "views/bubble/bubble_contents_wrapper.cc", + "views/bubble/bubble_contents_wrapper.h", "views/bubble/webui_bubble_dialog_view.cc", "views/bubble/webui_bubble_dialog_view.h", "views/bubble/webui_bubble_manager.cc",
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index aeb349d..95fa6007 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2929,6 +2929,9 @@ <message name="IDS_MENU_FOLLOW" desc="Menu item allowing users to follow the current website. [CHAR-LIMIT=27]"> Follow </message> + <message name="IDS_MENU_FOLLOWING" desc="Menu item indicating the current website is followed, allowing users to unfollow the current website. [CHAR-LIMIT=27]"> + Following + </message> <message name="IDS_MENU_PAINT_PREVIEW_SHOW" desc="Menu item allowing users to capture and show a paint preview of a page. [CHAR-LIMIT=27]" translateable="false"> Show Paint Preview </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_FOLLOWING.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_FOLLOWING.png.sha1 new file mode 100644 index 0000000..c6d995c --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_FOLLOWING.png.sha1
@@ -0,0 +1 @@ +d955ba45cf4074477d5dd8b792b6fdc044894dc0 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb index 45fef2d..cfc1b906 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Druk uit</translation> <translation id="1450753235335490080">Kan nie <ph name="CONTENT_TYPE" /> deel nie</translation> <translation id="1477626028522505441">Kon <ph name="FILE_NAME" /> weens bedienerkwessies nie aflaai nie.</translation> +<translation id="1497470209855416291">Proeflopie is gedeaktiveer</translation> <translation id="1506061864768559482">Soekenjin</translation> <translation id="1513352483775369820">Boekmerke en webgeskiedenis</translation> <translation id="1513858653616922153">Vee wagwoord uit</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Kyk volgende video</translation> <translation id="2074143993849053708">Assistent-stemsoektog se instemming-UI is toegemaak</translation> <translation id="2082238445998314030">Resultaat <ph name="RESULT_NUMBER" /> van <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Proeflopie is geaktiveer</translation> <translation id="2096012225669085171">Sinkroniseer en personaliseer oor toestelle heen</translation> <translation id="2100273922101894616">Outomatiese aanmelding</translation> <translation id="2100314319871056947">Probeer die teks in kleiner stukkies deel</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Outovoltooi soektogte en URL'e</translation> <translation id="7707922173985738739">Gebruik mobiele data</translation> <translation id="7725024127233776428">Bladsye wat jy boekmerk, verskyn hier</translation> -<translation id="7735637452482172701">Ontsluit met skermslot</translation> <translation id="7746457520633464754">Chrome stuur URL'e van sommige bladsye wat jy besoek, beperkte stelselinligting en sekere bladinhoud aan Google om gevaarlike programme en werwe te bespeur</translation> <translation id="7757787379047923882">Teks gedeel vanaf <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Kies datum en tyd</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index 4ded6bc..e87a6c8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">አትም</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> ን ማጋራት አይቻልም</translation> <translation id="1477626028522505441">በአገልጋይ ችግሮች ምክንያት <ph name="FILE_NAME" />ን ማውረድ አልተሳካም።</translation> +<translation id="1497470209855416291">ሙከራ ተሰናክሏል</translation> <translation id="1506061864768559482">የፍለጋ ፕሮግራም</translation> <translation id="1513352483775369820">ዕልባቶች እና የድር ታሪክ</translation> <translation id="1513858653616922153">የይለፍ ቃል ሰርዝ</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">የሚቀጥለውን ቪዲዮ ይመልከቱ</translation> <translation id="2074143993849053708">የረዳት ድምፅ ፍለጋ ስምምነት ዩአይ ተዘግቷል</translation> <translation id="2082238445998314030">ውጤት <ph name="RESULT_NUMBER" /> ከ<ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">ሙከራ ነቅቷል</translation> <translation id="2096012225669085171">በመላ መሣሪያዎች ላይ ያመሳስሉ እና ግላዊነት ያላብሱ</translation> <translation id="2100273922101894616">በራስ-ግባ</translation> <translation id="2100314319871056947">በትናንሽ ክፍሎች ጽሑፉን ለማጋራት ይሞክሩ</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">ፍለጋዎችን እና ዩአርኤልዎችን በራስ-አጠናቅቅ</translation> <translation id="7707922173985738739">የተንቀሳቃሽ ስልክ ውሂብ</translation> <translation id="7725024127233776428">እርስዎ ዕልባት ያደረጉባቸው ገጾች እዚህ ላይ ብቅ ይላሉ</translation> -<translation id="7735637452482172701">በማያ ገጽ መቆለፊያ አማካኝነት ክፈት</translation> <translation id="7746457520633464754">አደገኛ መተግበሪያዎችን እና ጣቢያዎችን ፈልጎ ለማግኘት፣ Chrome እርስዎ የጎበኟቸውን አንዳንድ ገጾች ዩአርኤሎች፣ የተወሰነ የሥርዓት መረጃ እና አንዳንድ የገጽ ይዘት ወደ Google ይልካል</translation> <translation id="7757787379047923882">ከ<ph name="DEVICE_NAME" /> የተጋራ ጽሑፍ</translation> <translation id="7761849928583394409">ቀን እና ሰዓት ይምረጡ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb index d40ab19..7e285318 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">طباعة</translation> <translation id="1450753235335490080">تعذَّرت مشاركة <ph name="CONTENT_TYPE" />.</translation> <translation id="1477626028522505441">تعذّر تنزيل الملف <ph name="FILE_NAME" /> بسبب مشاكل بالخادم.</translation> +<translation id="1497470209855416291">الفترة التجريبية غير مفعّلة لاستخدام Privacy Sandbox</translation> <translation id="1506061864768559482">محرك البحث</translation> <translation id="1513352483775369820">الإشارات المرجعية وسجلّ الويب</translation> <translation id="1513858653616922153">حذف كلمة المرور</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">مشاهدة الفيديو التالي</translation> <translation id="2074143993849053708">تم إغلاق واجهة المستخدم الخاصة بالموافقة على استخدام ميزة "البحث الصوتي" في "مساعد Google".</translation> <translation id="2082238445998314030">النتيجة <ph name="RESULT_NUMBER" /> من <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">الفترة التجريبية مفعّلة لاستخدام Privacy Sandbox</translation> <translation id="2096012225669085171">المزامنة والتخصيص على الأجهزة</translation> <translation id="2100273922101894616">تسجيل الدخول تلقائيًا</translation> <translation id="2100314319871056947">يُرجى تجربة مشاركة النص في مجموعات أصغر.</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">الإكمال التلقائي لعناوين URL وعمليات البحث</translation> <translation id="7707922173985738739">استخدام بيانات الجوّال</translation> <translation id="7725024127233776428">يتم عرض الصفحات التي يتم وضع إشارة عليها هنا.</translation> -<translation id="7735637452482172701">فتح القفل باستخدام قفل الشاشة</translation> <translation id="7746457520633464754">لرصد التطبيقات ومواقع الويب الضارة، يُرسل Chrome عناوين URL لبعض الصفحات التي زرتها ومعلومات محدودة للنظام وبعض أنواع محتوى الصفحات إلى Google.</translation> <translation id="7757787379047923882">تمت مشاركة النص من <ph name="DEVICE_NAME" />.</translation> <translation id="7761849928583394409">اختيار التاريخ والوقت</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index f8987ed8..41ed833 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -963,7 +963,6 @@ <translation id="7704317875155739195">স্বয়ংক্রিয়ভাৱে সম্পূৰ্ণ হোৱা সন্ধান আৰু URL</translation> <translation id="7707922173985738739">ম’বাইল ডেটা ব্যৱহাৰ কৰক</translation> <translation id="7725024127233776428">আপুনি বুকমাৰ্ক কৰি ৰখা পৃষ্ঠাবোৰ ইয়াত দেখা যাব</translation> -<translation id="7735637452482172701">স্ক্রীন লকৰ জৰিয়তে আনলক কৰক</translation> <translation id="7746457520633464754">বিপজ্জনক এপ্ আৰু ছাইটসমূহ চিনাক্ত কৰিবলৈ Chromeএ আপুনি চোৱা পৃষ্ঠাৰ URLসমূহ, ছিষ্টেমৰ সীমিত তথ্য আৰু পৃষ্ঠাৰ কিছু সমল Googleলৈ পঠিয়ায়</translation> <translation id="7757787379047923882">পাঠ <ph name="DEVICE_NAME" />ৰ পৰা শ্বেয়াৰ কৰা হৈছে</translation> <translation id="7761849928583394409">তাৰিখ আৰু সময় বাছক</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index 943d5c9f..c7d3d9db 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -591,6 +591,7 @@ <translation id="5222676887888702881">Hesabdan çıxın</translation> <translation id="5230560987958996918"><ph name="SITE" /> yaxınlıqdakı Bluetooth cihazlarını axtarmaq istəyir. Aşağıdakı cihazlar tapıldı:</translation> <translation id="5233638681132016545">Yeni panel</translation> +<translation id="5250483651202458397">Skrinşot. Bağlamaq üçün toxunun.</translation> <translation id="526421993248218238">Bu səhifəni yükləmək mümkün deyil</translation> <translation id="5271967389191913893">Endirilməli olan kontenti cihaz aça bilmir.</translation> <translation id="5292796745632149097">Kimə</translation> @@ -834,6 +835,7 @@ <translation id="6767294960381293877">Yarı hündürlükdə açılan tabı paylaşa biləcəyiniz cihazların siyahısı.</translation> <translation id="6783942555455976443">Bu səhifəyə daha sonra baxmaq üçün yadda saxlayın və xatırladıcı qəbul edin</translation> <translation id="6811034713472274749">Səhifəyə baxa bilərsiniz</translation> +<translation id="6813446258015311409">Chrome'a giriş açılıb.</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" /> tabı seçilib</translation> <translation id="6833996806551876956">Privacy Sandbox sınağı</translation> @@ -962,7 +964,6 @@ <translation id="7704317875155739195">Axtarış və linkləri avtomatik tamamlayın</translation> <translation id="7707922173985738739">Mobil data istifadə edin</translation> <translation id="7725024127233776428">Seçdiyiniz səhifələr burada görünəcək</translation> -<translation id="7735637452482172701">Ekran Kilidi ilə kiliddən çıxarın</translation> <translation id="7746457520633464754">Təhlükəli tətbiq və saytları aşkarlamaq üçün Chrome daxil olduğunuz səhifələrin linkləri, məhdud sistem məlumatı və bəzi səhifə kontentini Google'a göndərir</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> cihazından paylaşılan mətn</translation> <translation id="7761849928583394409">Tarix və vaxt seçin</translation> @@ -1095,6 +1096,7 @@ <translation id="8583805026567836021">Hesab datası silinir</translation> <translation id="8587585930972369234">Axtarış üçün toxunub saxlayın</translation> <translation id="860043288473659153">Kart sahibinin adı</translation> +<translation id="8602358303461588329">Chrome'a giriş bağlıdır.</translation> <translation id="860282621117673749">Qiymət endirimi siqnalları</translation> <translation id="8616006591992756292"><ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> linkində Google Hesabına məxsus axtarış tarixçəsinin başqa formaları ola bilər.</translation> <translation id="8617240290563765734">Endirilmiş kontentdə təklif edilən link açılsın?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index 8d374fe..b06be2dd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Друк</translation> <translation id="1450753235335490080">Не ўдалося абагуліць наступнае змесціва: <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Збой спампоўкі файла "<ph name="FILE_NAME" />" з-за праблем на серверы.</translation> +<translation id="1497470209855416291">Пробная версія выключана</translation> <translation id="1506061864768559482">Пошукавая сістэма</translation> <translation id="1513352483775369820">Закладкі і гісторыя вэб-пошуку</translation> <translation id="1513858653616922153">Выдаліць пароль</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Глядзець наступнае відэа</translation> <translation id="2074143993849053708">Дыялогавае акно для дачы згоды на выкарыстанне Памочніка для галасавога пошуку закрыта</translation> <translation id="2082238445998314030">Вынік <ph name="RESULT_NUMBER" /> з <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Пробная версія ўключана</translation> <translation id="2096012225669085171">Сінхранізацыя і персаналізацыя на ўсіх прыладах</translation> <translation id="2100273922101894616">Аўтаматычны ўваход</translation> <translation id="2100314319871056947">Паспрабуйце абагуліць тэкст меншымі кавалкамі</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Аўтаматычна дапісваць пошукавыя запыты і URL-адрасы</translation> <translation id="7707922173985738739">Выкарыстоўваць мабільную перадачу даных</translation> <translation id="7725024127233776428">Тут будуць паказвацца старонкі, якія вы дадалі ў закладкі</translation> -<translation id="7735637452482172701">Разблакіраваць праз функцыю блакіроўкі экрана</translation> <translation id="7746457520633464754">Каб выявіць небяспечныя праграмы і сайты, Chrome адпраўляе URL-адрасы некаторых наведаных вамі старонак, пэўную сістэмную інфармацыю і змесціва старонак у Google</translation> <translation id="7757787379047923882">Тэкст абагулены з прылады "<ph name="DEVICE_NAME" />"</translation> <translation id="7761849928583394409">Выберыце дату і час</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index 38caa29f..6ca7ee7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Печат</translation> <translation id="1450753235335490080">Споделянето на <ph name="CONTENT_TYPE" /> не е възможно</translation> <translation id="1477626028522505441">Изтеглянето на „<ph name="FILE_NAME" />“ не бе успешно поради проблеми в сървъра.</translation> +<translation id="1497470209855416291">Пробният период е деактивиран</translation> <translation id="1506061864768559482">Търсеща машина</translation> <translation id="1513352483775369820">Отметки и посетени сайтове</translation> <translation id="1513858653616922153">Изтриване на паролата</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Гледане на следващия видеоклип</translation> <translation id="2074143993849053708">Потребителският интерфейс за даване на съгласие за ползване на Асистент при гласови търсения е затворен</translation> <translation id="2082238445998314030">Резултат <ph name="RESULT_NUMBER" /> от <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Пробният период е активиран</translation> <translation id="2096012225669085171">Синхронизиране и персонализиране на всички устройства</translation> <translation id="2100273922101894616">Автоматичен вход</translation> <translation id="2100314319871056947">Опитайте да споделите текста на по-малки части</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Автоматично довършване на заявки за търсене и URL адреси</translation> <translation id="7707922173985738739">Използване на мобилни данни</translation> <translation id="7725024127233776428">Запазените от вас отметки към страници се показват тук</translation> -<translation id="7735637452482172701">Отключване със Screen Lock</translation> <translation id="7746457520633464754">За да открива опасни приложения и сайтове, Chrome изпраща до Google URL адресите на някои от страниците, които посещавате, ограничена системна информация и част от съдържанието на страниците</translation> <translation id="7757787379047923882">Текст, споделен от <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Избиране на дата и час</translation>
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 331c14e..8f99bcd 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
@@ -593,6 +593,7 @@ <translation id="5222676887888702881">সাইন-আউট করুন</translation> <translation id="5230560987958996918">কাছাকাছি থাকা ব্লুটুথ ডিভাইসগুলিকে <ph name="SITE" /> স্ক্যান করতে চায়, এই ডিভাইসগুলি পাওয়া গেছে:</translation> <translation id="5233638681132016545">নতুন ট্যাব</translation> +<translation id="5250483651202458397">স্ক্রিনশট। বন্ধ করতে ট্যাপ করুন।</translation> <translation id="526421993248218238">পৃষ্ঠাটি লোড করা যাচ্ছে না</translation> <translation id="5271967389191913893">ডাউনলোড করা কন্টেন্ট ডিভাইস খুলতে পারবে না৷</translation> <translation id="5292796745632149097">এতে পাঠান:</translation> @@ -838,6 +839,7 @@ <translation id="6767294960381293877">ট্যাব শেয়ার করা যাবে এমন ডিভাইসের সূচি অর্ধেক স্ক্রিন জুড়ে খোলা হয়েছে।</translation> <translation id="6783942555455976443">পরে দেখার জন্য এই পৃষ্ঠা সেভ করে রাখুন ও রিমাইন্ডার পান</translation> <translation id="6811034713472274749">পৃষ্ঠাটি এখন দেখতে পাবেন</translation> +<translation id="6813446258015311409">Chrome-এ সাইন-ইন করার পৃষ্ঠা খোলা আছে।</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, ট্যাব বেছে নেওয়া হয়েছে</translation> <translation id="6833996806551876956">গোপনীয়তা স্যান্ডবক্স ট্রায়াল</translation> @@ -966,7 +968,6 @@ <translation id="7704317875155739195">সার্চ এবং ইউআরএলগুলি নিজে থেকে সম্পূর্ণ হতে দিন</translation> <translation id="7707922173985738739">মোবাইল ডেটা ব্যবহার করুন</translation> <translation id="7725024127233776428">আপনার বুকমার্ক করা পৃষ্ঠা এখানে দেখানো হয়</translation> -<translation id="7735637452482172701">স্ক্রিন লকের সাহায্যে আনলক করুন</translation> <translation id="7746457520633464754">বিপজ্জনক অ্যাপ ও সাইট শনাক্ত করতে Chrome আপনার দেখা পৃষ্ঠাগুলির ইউআরএল, সিস্টেমের কিছু তথ্য ও কিছু পৃষ্ঠার কন্টেন্ট Google-কে পাঠায়</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> থেকে টেক্সট শেয়ার করা হয়েছে</translation> <translation id="7761849928583394409">তারিখ ও সময় বেছে নিন</translation> @@ -1099,6 +1100,7 @@ <translation id="8583805026567836021">অ্যাকাউন্টের ডেটা সাফ করা হচ্ছে</translation> <translation id="8587585930972369234">সার্চ করতে টাচ করে ধরে থাকুন</translation> <translation id="860043288473659153">কার্ডধারকের নাম</translation> +<translation id="8602358303461588329">Chrome-এ সাইন-ইন করার পৃষ্ঠা বন্ধ করা আছে।</translation> <translation id="860282621117673749">দাম কমার বিজ্ঞপ্তি</translation> <translation id="8616006591992756292"><ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />-এ আপনার Google অ্যাকাউন্টের অন্যান্য ধরনের ব্রাউজিংয়ের ইতিহাস থাকতে পারে।</translation> <translation id="8617240290563765734">ডাউনলোড হওয়া কন্টেন্টতে নির্দিষ্ট করা প্রস্তাবিত URLটি খুলবেন?</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 b2302693..911140f 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Štampaj</translation> <translation id="1450753235335490080">Nije moguće podijeliti sadržaj <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Preuzimanje fajla <ph name="FILE_NAME" /> nije uspjelo zbog problema sa serverom.</translation> +<translation id="1497470209855416291">Probni period je onemogućen</translation> <translation id="1506061864768559482">Pretraživač</translation> <translation id="1513352483775369820">Oznake i web historija</translation> <translation id="1513858653616922153">Izbriši lozinku</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Gledajte sljedeći videozapis</translation> <translation id="2074143993849053708">Korisnički interfejs za pristanak na glasovno pretraživanje putem Asistenta je zatvoren</translation> <translation id="2082238445998314030">Rezultat <ph name="RESULT_NUMBER" /> od <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Probni period je omogućen</translation> <translation id="2096012225669085171">Sinhronizirajte i personalizirajte na svim uređajima</translation> <translation id="2100273922101894616">Automatsko prijavljivanje</translation> <translation id="2100314319871056947">Pokušajte dijeliti tekst u manjim segmentima</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Automatsko dovršavanje pretraživanja i URL-ova</translation> <translation id="7707922173985738739">Koristi prijenos podataka na mobilnoj mreži</translation> <translation id="7725024127233776428">Stranice koje označite će se pojaviti ovdje</translation> -<translation id="7735637452482172701">Otključaj pomoću zaključavanja ekrana</translation> <translation id="7746457520633464754">Radi otkrivanja opasnih aplikacija i web-lokacija Chrome šalje Googleu URL-ove nekih stranica koje posjećujete, ograničene podatke o sustavu i dio sadržaja web-stranica</translation> <translation id="7757787379047923882">Tekst je podijeljen s uređaja <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Odaberite datum i vrijeme</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index 7521d9a..04f910e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Imprimeix</translation> <translation id="1450753235335490080">No es pot compartir <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">No s'ha pogut baixar <ph name="FILE_NAME" /> a causa de problemes amb el servidor.</translation> +<translation id="1497470209855416291">La prova està desactivada</translation> <translation id="1506061864768559482">Motor de cerca</translation> <translation id="1513352483775369820">Adreces interès i historial web</translation> <translation id="1513858653616922153">Suprimeix la contrasenya</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Mira el vídeo següent</translation> <translation id="2074143993849053708">La IU de consentiment de la cerca per veu de l'Assistent s'ha tancat</translation> <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">La prova està activada</translation> <translation id="2096012225669085171">Sincronitza i personalitza el contingut en tots els dispositius</translation> <translation id="2100273922101894616">Inici de sessió automàtic</translation> <translation id="2100314319871056947">Prova de compartir el text en fragments més petits</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Completa automàticament les cerques i els URL</translation> <translation id="7707922173985738739">Utilitza dades mòbils</translation> <translation id="7725024127233776428">Les pàgines que afegeixis a les adreces d'interès es mostraran aquí</translation> -<translation id="7735637452482172701">Desbloqueja amb el bloqueig de pantalla</translation> <translation id="7746457520633464754">Per detectar aplicacions i llocs web perillosos, Chrome envia a Google els URL d'algunes de les pàgines que visites, informació limitada del sistema i part del contingut de les pàgines</translation> <translation id="7757787379047923882">Text compartit des del dispositiu <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Tria la data i l'hora</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index a094c5f8..ee591fa 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Tisk</translation> <translation id="1450753235335490080">Sdílení obsahu typu <ph name="CONTENT_TYPE" /> se nezdařilo</translation> <translation id="1477626028522505441">Stažení souboru <ph name="FILE_NAME" /> se nezdařilo z důvodu problémů se serverem.</translation> +<translation id="1497470209855416291">Zkušební období není aktivní</translation> <translation id="1506061864768559482">Vyhledávač</translation> <translation id="1513352483775369820">Záložky a webová historie</translation> <translation id="1513858653616922153">Vymazat heslo</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Přehrát další video</translation> <translation id="2074143993849053708">Uživatelské rozhraní souhlasu s hlasovým vyhledáváním pomocí Asistenta bylo zavřeno</translation> <translation id="2082238445998314030">Výsledek <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Zkušební období je aktivní</translation> <translation id="2096012225669085171">Synchronizovat a přizpůsobit na různých zařízeních</translation> <translation id="2100273922101894616">Přihlásit se automaticky</translation> <translation id="2100314319871056947">Zkuste text sdílet po menších částech</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Automaticky doplňovat vyhledávací dotazy a adresy URL</translation> <translation id="7707922173985738739">Používat mobilní data</translation> <translation id="7725024127233776428">Zde se zobrazují stránky přidané do záložek</translation> -<translation id="7735637452482172701">Odemknout pomocí zámku obrazovky</translation> <translation id="7746457520633464754">Kvůli detekci nebezpečných aplikací a webů odesílá Chrome do Googlu adresy URL některých navštívených stránek, omezené informace o systému a část obsahu stránek</translation> <translation id="7757787379047923882">Text sdílený ze zařízení <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Vybrat datum a čas</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 559ab07..02a5bf78 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Udskriv</translation> <translation id="1450753235335490080">Delingen af <ph name="CONTENT_TYPE" /> mislykkedes</translation> <translation id="1477626028522505441">Download af <ph name="FILE_NAME" /> mislykkedes på grund af serverproblemer.</translation> +<translation id="1497470209855416291">Prøveversion er deaktiveret</translation> <translation id="1506061864768559482">Søgemaskine</translation> <translation id="1513352483775369820">Bogmærker og webhistorik</translation> <translation id="1513858653616922153">Slet adgangskoden</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Se næste video</translation> <translation id="2074143993849053708">Brugerfladen for samtykke i forbindelse med stemmesøgning i Assistent er lukket</translation> <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> af <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Prøveversion af aktiveret</translation> <translation id="2096012225669085171">Synkroniser og tilpas på flere enheder</translation> <translation id="2100273922101894616">Automatisk login</translation> <translation id="2100314319871056947">Prøv at opdele teksten i mindre stykker</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Autofuldfør søgninger og webadresser</translation> <translation id="7707922173985738739">Brug mobildata</translation> <translation id="7725024127233776428">De sider, du føjer et bogmærke til, vises her</translation> -<translation id="7735637452482172701">Lås op med skærmlås</translation> <translation id="7746457520633464754">Chrome sender webadresser på nogle sider, du besøger, begrænsede systemoplysninger og noget sideindhold til Google med henblik på at registrere farlige apps og websites.</translation> <translation id="7757787379047923882">Tekst, der deles fra <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Vælg dato og tidspunkt</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index b45b2c2..2eb3c67 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Drucken</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> kann nicht geteilt werden</translation> <translation id="1477626028522505441"><ph name="FILE_NAME" /> konnte aufgrund von Serverproblemen nicht heruntergeladen werden.</translation> +<translation id="1497470209855416291">Testversion ist deaktiviert</translation> <translation id="1506061864768559482">Suchmaschine</translation> <translation id="1513352483775369820">Lesezeichen und Webprotokoll</translation> <translation id="1513858653616922153">Passwort löschen</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Nächstes Video ansehen</translation> <translation id="2074143993849053708">Benutzeroberfläche für die Einwilligung in die Sprachsuche von Assistant geschlossen</translation> <translation id="2082238445998314030">Ergebnis <ph name="RESULT_NUMBER" /> von <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Testversion ist aktiviert</translation> <translation id="2096012225669085171">Geräteübergreifend synchronisieren und personalisieren</translation> <translation id="2100273922101894616">Automatisch anmelden</translation> <translation id="2100314319871056947">Teilen Sie den Text am besten in mehreren Abschnitten</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Suchanfragen und URLs automatisch vervollständigen</translation> <translation id="7707922173985738739">Mobile Daten verwenden</translation> <translation id="7725024127233776428">Seiten, die Sie als Lesezeichen speichern, werden hier angezeigt.</translation> -<translation id="7735637452482172701">Mit Displaysperre entsperren</translation> <translation id="7746457520633464754">Chrome sendet die URLs einiger von Ihnen besuchter Seiten, bestimmte Systeminformationen und einige Seiteninhalte an Google, um gefährliche Apps und Websites zu erkennen</translation> <translation id="7757787379047923882">Text geteilt von <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Datum & Zeit auswählen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index 41e0b48..3fc887c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Εκτύπωση</translation> <translation id="1450753235335490080">Δεν είναι δυνατή η κοινοποίηση <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Η λήψη του αρχείου <ph name="FILE_NAME" /> απέτυχε λόγω προβλημάτων στον διακομιστή.</translation> +<translation id="1497470209855416291">Η δοκιμή είναι ανενεργή</translation> <translation id="1506061864768559482">Μηχανή αναζήτησης</translation> <translation id="1513352483775369820">Σελιδοδείκτες και ιστορικό ιστού</translation> <translation id="1513858653616922153">Διαγραφή κωδικού πρόσβασης</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Παρακολούθηση επόμενου βίντεο</translation> <translation id="2074143993849053708">Κλειστή διεπαφή χρήστη για παροχή συναίνεσης σχετικά με τη φωνητική αναζήτηση μέσω του Βοηθού</translation> <translation id="2082238445998314030">Αποτέλεσμα <ph name="RESULT_NUMBER" /> από <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Η δοκιμή είναι ενεργή</translation> <translation id="2096012225669085171">Συγχρονισμός και εξατομίκευση σε όλες τις συσκευές</translation> <translation id="2100273922101894616">Αυτόματη σύνδεση</translation> <translation id="2100314319871056947">Δοκιμάστε να κοινοποιήσετε το κείμενο σε μικρότερα τμήματα.</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Αυτόματη συμπλήρωση αναζητήσεων και URL</translation> <translation id="7707922173985738739">Χρήση δεδομένων κινητής τηλεφωνίας</translation> <translation id="7725024127233776428">Εδώ εμφανίζονται οι σελίδες στις οποίες προσθέτετε σελιδοδείκτη</translation> -<translation id="7735637452482172701">Ξεκλείδωμα με τη λειτουργία κλειδώματος οθόνης</translation> <translation id="7746457520633464754">Για τον εντοπισμό επικίνδυνων εφαρμογών και ιστοτόπων, το Chrome στέλνει URL ορισμένων ιστοτόπων που επισκέπτεστε, περιορισμένες πληροφορίες συστήματος και ένα μέρος του περιεχομένου σελίδας στο Google</translation> <translation id="7757787379047923882">Το κείμενο κοινοποιήθηκε από τη συσκευή <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Επιλογή ημερομηνίας και ώρας</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index 1ae452d..8bfeb0c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -964,7 +964,6 @@ <translation id="7704317875155739195">Auto-complete searches and URLs</translation> <translation id="7707922173985738739">Use mobile data</translation> <translation id="7725024127233776428">Pages that you bookmark appear here</translation> -<translation id="7735637452482172701">Unlock with screen lock</translation> <translation id="7746457520633464754">To detect dangerous apps and sites, Chrome sends URLs of some pages that you visit, limited system information and some page content to Google</translation> <translation id="7757787379047923882">Text shared from <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Select date and time</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index 1f486684..774ad3b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Imprimir</translation> <translation id="1450753235335490080">No se puede compartir <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441"><ph name="FILE_NAME" /> no se pudo descargar debido a problemas del servidor.</translation> +<translation id="1497470209855416291">La prueba está inhabilitada</translation> <translation id="1506061864768559482">Motor de búsqueda</translation> <translation id="1513352483775369820">Favoritos e historial web</translation> <translation id="1513858653616922153">Borrar contraseña</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Mirar el próximo video</translation> <translation id="2074143993849053708">La IU de consentimiento de la búsqueda por voz de Asistente está cerrada</translation> <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">La prueba está habilitada</translation> <translation id="2096012225669085171">Sincroniza y personaliza contenido en diferentes dispositivos</translation> <translation id="2100273922101894616">Acceso automático</translation> <translation id="2100314319871056947">Intenta compartir el texto en fragmentos más pequeños</translation> @@ -591,6 +593,7 @@ <translation id="5222676887888702881">Salir</translation> <translation id="5230560987958996918"><ph name="SITE" /> quiere detectar dispositivos Bluetooth cercanos. Se encontraron los siguientes dispositivos:</translation> <translation id="5233638681132016545">Nueva pestaña</translation> +<translation id="5250483651202458397">Captura de pantalla. Presionar para cerrar.</translation> <translation id="526421993248218238">No se puede cargar esta página</translation> <translation id="5271967389191913893">El dispositivo no puede abrir el contenido que se descargará.</translation> <translation id="5292796745632149097">Enviar a</translation> @@ -836,6 +839,7 @@ <translation id="6767294960381293877">La lista de dispositivos con los que se puede compartir una pestaña está abierta a media altura.</translation> <translation id="6783942555455976443">Guarda esta página para verla más tarde y establece un recordatorio.</translation> <translation id="6811034713472274749">Ya puedes ver la página</translation> +<translation id="6813446258015311409">Acceder a Chrome, abierto.</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, pestaña, seleccionada</translation> <translation id="6833996806551876956">Prueba de Privacy Sandbox</translation> @@ -964,7 +968,6 @@ <translation id="7704317875155739195">Autocompletar búsquedas y URL</translation> <translation id="7707922173985738739">Usa los datos móviles.</translation> <translation id="7725024127233776428">Las páginas que agregues a favoritos aparecerán aquí</translation> -<translation id="7735637452482172701">Desbloquear con el bloqueo de pantalla</translation> <translation id="7746457520633464754">Para detectar apps y sitios peligrosos, Chrome envía a Google URL de algunas páginas que visitas, información limitada sobre el sistema y contenido de algunas páginas</translation> <translation id="7757787379047923882">Texto compartido de <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Elegir fecha y hora</translation> @@ -1097,6 +1100,7 @@ <translation id="8583805026567836021">Borrando datos de cuenta</translation> <translation id="8587585930972369234">Mantén presionado para buscar</translation> <translation id="860043288473659153">Nombre del titular de la tarjeta</translation> +<translation id="8602358303461588329">Acceder a Chrome, cerrado.</translation> <translation id="860282621117673749">Alertas de descuentos</translation> <translation id="8616006591992756292">Es posible que tu cuenta de Google tenga otros formularios del historial de navegación en <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="8617240290563765734">¿Quieres abrir la URL sugerida que se especifica en el contenido descargado?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index 8713904..2398a1d5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Imprimir</translation> <translation id="1450753235335490080">No se ha podido compartir: <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">No se ha podido descargar <ph name="FILE_NAME" /> debido a problemas con el servidor.</translation> +<translation id="1497470209855416291">Demostración inhabilitada</translation> <translation id="1506061864768559482">Buscador</translation> <translation id="1513352483775369820">Historial web y marcadores</translation> <translation id="1513858653616922153">Eliminar contraseña</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Ver el siguiente vídeo</translation> <translation id="2074143993849053708">Interfaz de consentimiento de la búsqueda por voz del Asistente cerrada</translation> <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Demostración habilitada</translation> <translation id="2096012225669085171">Sincroniza y personaliza todos tus dispositivos</translation> <translation id="2100273922101894616">Iniciar sesión automáticamente</translation> <translation id="2100314319871056947">Prueba a compartir el texto dividiéndolo en partes más pequeñas</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Autocompletar búsquedas y URLs</translation> <translation id="7707922173985738739">Se utilizarán datos móviles</translation> <translation id="7725024127233776428">Las páginas que añadas a marcadores aparecerán aquí</translation> -<translation id="7735637452482172701">Desbloquear con bloqueo de pantalla</translation> <translation id="7746457520633464754">Para detectar aplicaciones y sitios peligrosos, Chrome envía a Google las URL de algunas de las páginas que visitas, información limitada del sistema y parte del contenido de las páginas.</translation> <translation id="7757787379047923882">Texto compartido desde <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Elegir fecha y hora</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index 1b357d2..25797f2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Printimine</translation> <translation id="1450753235335490080">Üksust <ph name="CONTENT_TYPE" /> ei saa jagada</translation> <translation id="1477626028522505441">Faili <ph name="FILE_NAME" /> allalaadimine ebaõnnestus serveriprobleemide tõttu.</translation> +<translation id="1497470209855416291">Prooviperiood on keelatud</translation> <translation id="1506061864768559482">Otsingumootor</translation> <translation id="1513352483775369820">Järjehoidjad ja veebiajalugu</translation> <translation id="1513858653616922153">Kustuta parool</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Vaadake järgmist videot</translation> <translation id="2074143993849053708">Assistendi häälotsingu sisu kasutajaliides on suletud</translation> <translation id="2082238445998314030">Tulemus <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Prooviperiood on lubatud</translation> <translation id="2096012225669085171">Seadmete vahel sünkroonimine ja isikupärastamine</translation> <translation id="2100273922101894616">Automaatne sisselogimine</translation> <translation id="2100314319871056947">Proovige teksti jagada väiksemate lõikudena</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Otsingute ja URL-ide automaatne täitmine</translation> <translation id="7707922173985738739">Kasuta mobiilset andmesidet</translation> <translation id="7725024127233776428">Järjehoidjatesse lisatud lehed kuvatakse siin</translation> -<translation id="7735637452482172701">Ava ekraanilukuga</translation> <translation id="7746457520633464754">Ohtlike rakenduste ja saitide tuvastamiseks saadab Chrome mõnede teie külastatud lehtede URL-id, piiratud süsteemiteabe ja mõne lehe sisu Google'ile</translation> <translation id="7757787379047923882">Teksti jagati seadmest <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Kuupäeva ja kellaaja valimine</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index d4ace27c..7bf70a2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -10,7 +10,7 @@ <translation id="1047303875618851375">Chrome-k ezin izan du egiaztatu zure informazioa</translation> <translation id="1049743911850919806">Ezkutuko modua</translation> <translation id="10614374240317010">Sekula gorde gabeak</translation> -<translation id="1067922213147265141">Beste Google-ren zerbitzu batzuk</translation> +<translation id="1067922213147265141">Google-ren beste zerbitzu batzuk</translation> <translation id="107147699690128016">Fitxategi-luzapena aldatzen baduzu, baliteke fitxategia beste aplikazio batean irekitzea eta zure gailuan kalteak eragitea.</translation> <translation id="1100066534610197918">Ireki beste fitxa bat taldean</translation> <translation id="1105960400813249514">Pantaila-argazkia</translation> @@ -72,6 +72,7 @@ <translation id="1430915738399379752">Inprimatu</translation> <translation id="1450753235335490080">Ezin da partekatu <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Ezin izan da deskargatu <ph name="FILE_NAME" />, zerbitzariarekin arazoak daudelako.</translation> +<translation id="1497470209855416291">Probaldia desgaituta dago</translation> <translation id="1506061864768559482">Bilatzailea</translation> <translation id="1513352483775369820">Laster-markak eta web-historia</translation> <translation id="1513858653616922153">Ezabatu pasahitza</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Ikusi hurrengo bideoa</translation> <translation id="2074143993849053708">Itxi egin da ahozko bilaketa egite aldera Laguntzailea eginbideari baimena emateko erabiltzaile-interfazea</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /> emaitza</translation> +<translation id="2083113399121613785">Probaldia gaituta dago</translation> <translation id="2096012225669085171">Sinkronizatu eta pertsonalizatu gailu guztiak</translation> <translation id="2100273922101894616">Saio-hasiera automatikoa</translation> <translation id="2100314319871056947">Saiatu testua zati txikiagotan partekatzen</translation> @@ -265,7 +267,7 @@ <translation id="2888126860611144412">Chrome-ri buruz</translation> <translation id="2891154217021530873">Utzi orriak kargatzeari</translation> <translation id="2892647708214602204">Fitxategia prest dagoenean, jakinarazpen bat jasoko duzu</translation> -<translation id="2893180576842394309">Baliteke Google-k historia erabiltzea Bilaketa eta beste Google-ren zerbitzu batzuk pertsonalizatzeko</translation> +<translation id="2893180576842394309">Baliteke Google-k historia erabiltzea Bilaketa eta Google-ren beste zerbitzu batzuk pertsonalizatzeko</translation> <translation id="2900528713135656174">Sortu gertaera</translation> <translation id="2901411048554510387">Webgune honekin erlazionatutako iradokizunak daude ikusgai: <ph name="WEBSITE_TITLE" /></translation> <translation id="2904414404539560095">Fitxa partekatzeko hautatutako gailuen zerrenda irekita dago, eta altuera osoa hartzen du.</translation> @@ -479,7 +481,7 @@ <translation id="451872707440238414">Bilatu laster-marketan</translation> <translation id="4521489764227272523">Kendu dira hautatutako datuak Chrome-tik eta sinkronizatutako gailuetatik. -Baliteke Google-ko kontuak arakatze-historiako bestelako datu batzuk (adibidez, bilaketak eta beste Google-ren zerbitzu batzuetako jarduerak) edukitzea <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> webgunean.</translation> +Baliteke Google-ko kontuak arakatze-historiako bestelako datu batzuk (adibidez, bilaketak eta Google-ren beste zerbitzu batzuetako jarduerak) edukitzea <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> webgunean.</translation> <translation id="4532845899244822526">Aukeratu karpeta</translation> <translation id="4538018662093857852">Aktibatu oinarrizko modua</translation> <translation id="4550003330909367850">Pasahitza hemen ikusteko edo kopiatzeko, ezarri pantaila-blokeoa gailu honetan.</translation> @@ -672,7 +674,7 @@ <translation id="5776970333778123608">Garrantzirik gabeko datuak</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> / <ph name="SPACE_AVAILABLE" /> erabilita</translation> <translation id="5795872532621730126">Bilatu eta arakatu</translation> -<translation id="5797070761912323120">Baliteke Google-k historia erabiltzea Bilaketa, iragarkiak eta beste Google-ren zerbitzu batzuk pertsonalizatzeko</translation> +<translation id="5797070761912323120">Baliteke Google-k historia erabiltzea Bilaketa, iragarkiak eta Google-ren beste zerbitzu batzuk pertsonalizatzeko</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Duela # ordu}other{Duela # ordu}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Eskubide guztiak erreserbatuta.</translation> <translation id="5810864297166300463">Sareko laguntza</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Bete automatikoki bilaketak eta URLak</translation> <translation id="7707922173985738739">Erabili datu-konexioa</translation> <translation id="7725024127233776428">Hemen agertuko dira laster-marka egin diezun orriak</translation> -<translation id="7735637452482172701">Desblokeatu pantailaren blokeoarekin</translation> <translation id="7746457520633464754">Aplikazio eta webgune arriskutsuak hautemateko, ireki dituzun orrietako batzuen URLak, sistemari buruzko informazio mugatua eta orrietako edukiaren zati bat bidaltzen dizkio Chrome-k Google-ri.</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> gailutik partekatutako testua</translation> <translation id="7761849928583394409">Aukeratu data eta ordua</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index 63dba32..8246b5b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">چاپ</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> همرسانی نشد</translation> <translation id="1477626028522505441">بهدلیل مشکلاتی در سرور، بارگیری <ph name="FILE_NAME" /> انجام نشد.</translation> +<translation id="1497470209855416291">دوره آزمایشی غیرفعال است</translation> <translation id="1506061864768559482">موتور جستجو</translation> <translation id="1513352483775369820">نشانکها و سابقه وب</translation> <translation id="1513858653616922153">حذف گذرواژه</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">تماشای ویدیوی بعدی</translation> <translation id="2074143993849053708">رابط کاربری رضایت برای جستجوی گفتاری «دستیار» بسته شد</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" /> نتیجه از <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">دوره آزمایشی فعال است</translation> <translation id="2096012225669085171">همگامسازی و شخصیسازی در همه دستگاهها</translation> <translation id="2100273922101894616">ورود به سیستم خودکار</translation> <translation id="2100314319871056947">بخشهای کوچکتری از نوشتار را به اشتراک بگذارید</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">تکمیل خودکار جستجوها و نشانیهای وب</translation> <translation id="7707922173985738739">استفاده از داده تلفن همراه</translation> <translation id="7725024127233776428">صفحاتی را که نشانکگذاری میکنید، در اینجا نشان داده میشوند</translation> -<translation id="7735637452482172701">باز کردن قفل بااستفاده از «قفل صفحه»</translation> <translation id="7746457520633464754">برای حذف برنامهها و سایتهای خطرناک، Chrome نشانیهای وب برخی از صفحههایی را که بازدید میکنید، اطلاعات سیستم محدود و برخی از محتوای صفحه را به Google میفرستد.</translation> <translation id="7757787379047923882">نوشتار همرسانیشده از <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">انتخاب تاریخ و زمان</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index 8363ab2..6ca0a2c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Tulosta</translation> <translation id="1450753235335490080">Jakaminen ei onnistu: <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Tiedoston <ph name="FILE_NAME" /> lataus epäonnistui palvelinongelman vuoksi.</translation> +<translation id="1497470209855416291">Kokeilu ei ole käytössä</translation> <translation id="1506061864768559482">Hakukone</translation> <translation id="1513352483775369820">Kirjanmerkit ja verkkohistoria</translation> <translation id="1513858653616922153">Poista salasana</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Katso seuraava video</translation> <translation id="2074143993849053708">Assistantin puhehaun suostumus-UI suljettu</translation> <translation id="2082238445998314030">Tulos <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Kokeilu on käytössä</translation> <translation id="2096012225669085171">Synkronoi ja yksilöi kaikilla laitteilla</translation> <translation id="2100273922101894616">Automaattinen kirjautuminen</translation> <translation id="2100314319871056947">Kokeile jakaa teksti pienempinä pätkinä</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Täydennä automaattisesti hakuja ja URL-osoitteita</translation> <translation id="7707922173985738739">Käytä mobiilidataa</translation> <translation id="7725024127233776428">Kirjanmerkeiksi lisätyt sivut näkyvät tässä</translation> -<translation id="7735637452482172701">Avaa näytön lukitustavalla</translation> <translation id="7746457520633464754">Vaarallisia sovelluksia ja sivustoja löytääkseen Chrome lähettää joidenkin avattujen sivujen URL-osoitteita, rajallisia järjestelmätietoja ja osia sivujen sisällöstä Googlelle</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> jakoi tekstin</translation> <translation id="7761849928583394409">Valitse päivä ja aika</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 7337af9..4dc8ded 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">I-print</translation> <translation id="1450753235335490080">Hindi maibahagi ang <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Hindi na-download ang <ph name="FILE_NAME" /> dahil sa mga isyu sa server.</translation> +<translation id="1497470209855416291">Naka-disable ang trial</translation> <translation id="1506061864768559482">Search engine</translation> <translation id="1513352483775369820">Bookmark at history ng web</translation> <translation id="1513858653616922153">I-delete ang password</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Panoorin ang susunod na video</translation> <translation id="2074143993849053708">Nakasara ang ui ng pahintulot ng paghahanap gamit ang boses ng Assistant</translation> <translation id="2082238445998314030">Resulta <ph name="RESULT_NUMBER" /> sa <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Naka-enable ang trial</translation> <translation id="2096012225669085171">Mag-sync at mag-personalize sa lahat ng device</translation> <translation id="2100273922101894616">Awtomatikong Mag-sign in</translation> <translation id="2100314319871056947">Subukang ibahagi ang text sa mas maliliit na bahagi</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Awtomatikong kumpletuhin ang mga paghahanap at URL</translation> <translation id="7707922173985738739">Gumamit ng mobile data</translation> <translation id="7725024127233776428">Lalabas dito ang mga page na iyong.na-bookmark</translation> -<translation id="7735637452482172701">I-unlock gamit ang Lock ng Screen</translation> <translation id="7746457520633464754">Para matukoy ang mapapanganib na app at site, nagpapadala ang Chrome ng mga URL ng ilang page na binibisita mo, limitadong impormasyon ng system, at ilang content ng page sa Google</translation> <translation id="7757787379047923882">Ibinahagi ang text mula sa <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Pumili ng petsa at oras</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index 6f373cb..05fd76b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Imprimer</translation> <translation id="1450753235335490080">Impossible de partager l'élément suivant : <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Échec du téléchargement de <ph name="FILE_NAME" /> en raison de problèmes au niveau du serveur.</translation> +<translation id="1497470209855416291">L'essai est désactivé</translation> <translation id="1506061864768559482">Moteur de recherche</translation> <translation id="1513352483775369820">Favoris et historique Web</translation> <translation id="1513858653616922153">Supprimer le mot de passe</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Regarder la vidéo suivante</translation> <translation id="2074143993849053708">Fenêtre d'IU de consentement pour la recherche vocale avec l'Assistant, fermée</translation> <translation id="2082238445998314030">Résultat <ph name="RESULT_NUMBER" /> sur <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">L'essai est activé</translation> <translation id="2096012225669085171">Profitez de la synchronisation et d'une expérience personnalisée sur tous vos appareils</translation> <translation id="2100273922101894616">Connexion automatique</translation> <translation id="2100314319871056947">Essayez de partager le texte en plusieurs parties plus petites</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Saisie semi-automatique des recherches et des URL</translation> <translation id="7707922173985738739">Utiliser les données mobiles</translation> <translation id="7725024127233776428">Les pages que vous ajoutez aux favoris s'affichent ici</translation> -<translation id="7735637452482172701">Déverrouiller à l'aide du verrouillage de l'écran</translation> <translation id="7746457520633464754">Pour détecter les applications et les sites dangereux, Chrome envoie à Google l'URL de certaines pages que vous visitez, certaines données système et du contenu partiel des pages en question</translation> <translation id="7757787379047923882">Texte partagé à partir de <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Sélectionner une date et une heure</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index 444364a..25d86f92 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Imprimer</translation> <translation id="1450753235335490080">Impossible de partager le contenu suivant : <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Échec du téléchargement du fichier "<ph name="FILE_NAME" />" en raison de problèmes liés au serveur.</translation> +<translation id="1497470209855416291">L'essai est désactivé</translation> <translation id="1506061864768559482">Moteur de recherche</translation> <translation id="1513352483775369820">Favoris et historique Web</translation> <translation id="1513858653616922153">Supprimer le mot de passe</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Regarder la vidéo suivante</translation> <translation id="2074143993849053708">Interface d'autorisation pour la recherche vocale de l'Assistant fermée</translation> <translation id="2082238445998314030">Résultat <ph name="RESULT_NUMBER" /> sur <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">L'essai est activé</translation> <translation id="2096012225669085171">Synchroniser et personnaliser les données sur tous les appareils</translation> <translation id="2100273922101894616">Connexion automatique</translation> <translation id="2100314319871056947">Essayez de scinder le texte pour le partager en plusieurs fois</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Saisir semi-automatiquement les recherches et les URL</translation> <translation id="7707922173985738739">Utilisera les données mobiles</translation> <translation id="7725024127233776428">Les pages que vous ajoutez aux favoris sont répertoriées ici</translation> -<translation id="7735637452482172701">Déverrouiller avec le verrouillage de l'écran</translation> <translation id="7746457520633464754">Pour détecter les applications et sites dangereux, Chrome envoie à Google l'URL de certaines pages que vous consultez, ainsi que des informations système limitées et une partie du contenu de certaines pages.</translation> <translation id="7757787379047923882">Texte partagé par <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Sélectionner une date et une heure</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index b6376c0..53724761 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Imprimir</translation> <translation id="1450753235335490080">Non se puido compartir este contido: <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Produciuse un erro ao descargar <ph name="FILE_NAME" /> debido a problemas co servidor.</translation> +<translation id="1497470209855416291">A proba está desactivada</translation> <translation id="1506061864768559482">Motor de busca</translation> <translation id="1513352483775369820">Marcadores e historial web</translation> <translation id="1513858653616922153">Eliminar contrasinal</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Ver vídeo seguinte</translation> <translation id="2074143993849053708">A interface de consentimento para a busca por voz a través do Asistente está pechada</translation> <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">A proba está activada</translation> <translation id="2096012225669085171">Sincroniza e personaliza o contido en todos os dispositivos</translation> <translation id="2100273922101894616">Inicio de sesión automático</translation> <translation id="2100314319871056947">Proba a compartir o texto dividíndoo en fragmentos máis pequenos</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Completar buscas e URL automaticamente</translation> <translation id="7707922173985738739">Utilizaranse datos móbiles</translation> <translation id="7725024127233776428">As páxinas que engadas aos marcadores aparecerán aquí</translation> -<translation id="7735637452482172701">Desbloquear con bloqueo de pantalla</translation> <translation id="7746457520633464754">Para detectar aplicacións e sitios perigosos, Chrome envíalle a Google os URL dalgunhas das páxinas que visitas, parte da información do sistema e parte do contido das páxinas</translation> <translation id="7757787379047923882">O texto compartiuse desde <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Seleccionar data e hora</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index b43b004..3780b4b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -964,7 +964,6 @@ <translation id="7704317875155739195">શોધ અને URLsને ઑટોમૅટિક રીતે પૂર્ણ કરો</translation> <translation id="7707922173985738739">મોબાઇલ ડેટાનો ઉપયોગ કરો</translation> <translation id="7725024127233776428">બુકમાર્ક કરેલા પેજ અહીં દેખાય છે</translation> -<translation id="7735637452482172701">સ્ક્રીન લૉક વડે અનલૉક કરો</translation> <translation id="7746457520633464754">જોખમી ઍપ અને સાઇટ શોધી કાઢવા માટે, Chrome તમે મુલાકાત લો તે કેટલાક પેજના URLs, સિસ્ટમ વિશેની સીમિત માહિતી અને પેજનું કેટલુંક કન્ટેન્ટ Googleને મોકલે છે</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" />માંથી ટેક્સ્ટ શેર કરી</translation> <translation id="7761849928583394409">તારીખ અને સમય પસંદ કરો</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index 0057f59..fac7a8a3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">प्रिंट करें</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> शेयर नहीं किया जा सकता</translation> <translation id="1477626028522505441">सर्वर संबधी समस्याओं के कारण <ph name="FILE_NAME" /> डाउनलोड विफल रहा.</translation> +<translation id="1497470209855416291">ट्रायल बंद है</translation> <translation id="1506061864768559482">सर्च इंजन</translation> <translation id="1513352483775369820">बुकमार्क और वेब इतिहास</translation> <translation id="1513858653616922153">पासवर्ड मिटाएं</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">अगला वीडियो देखें</translation> <translation id="2074143993849053708">यूज़र इंटरफ़ेस (यूआई) पर वॉइस सर्च के लिए, Assistant का इस्तेमाल करने की सहमति अब नहीं है</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> में से <ph name="RESULT_NUMBER" /> परिणाम</translation> +<translation id="2083113399121613785">ट्रायल चालू है</translation> <translation id="2096012225669085171">सभी डिवाइस में सिंक करना और मनमुताबिक बनाना</translation> <translation id="2100273922101894616">अपने आप साइन इन करने की सुविधा</translation> <translation id="2100314319871056947">टेक्स्ट को छोटे-छोटे हिस्सों में शेयर करने की कोशिश करें</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">खोजों और यूआरएल को अपने आप पूरा करें</translation> <translation id="7707922173985738739">मोबाइल डेटा का उपयोग करें</translation> <translation id="7725024127233776428">आप जो पेज बुकमार्क करते हैं वे यहां दिखाई देंगे</translation> -<translation id="7735637452482172701">स्क्रीन लॉक की मदद से अनलॉक करें</translation> <translation id="7746457520633464754">खतरनाक ऐप्लिकेशन और साइटों का पता लगाने के लिए, Chrome ऐसे कुछ पेज का यूआरएल Google को भेजता है जिन पर आप जाते हैं. साथ ही, वह सिस्टम की सीमित जानकारी और पेज की कुछ सामग्री भी Google को भेजता है</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> से टेक्स्ट शेयर किया गया</translation> <translation id="7761849928583394409">तारीख और समय चुनें</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 31ef347..acbda6e 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Ispis</translation> <translation id="1450753235335490080">Nije moguće dijeliti <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Preuzimanje datoteke <ph name="FILE_NAME" /> nije uspjelo zbog poteškoća s poslužiteljem.</translation> +<translation id="1497470209855416291">Proba je onemogućena</translation> <translation id="1506061864768559482">Tražilica</translation> <translation id="1513352483775369820">Oznake i Google povijest</translation> <translation id="1513858653616922153">Izbriši zaporku</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Pogledaj sljedeći videozapis</translation> <translation id="2074143993849053708">Korisničko sučelje pristanka za glasovno pretraživanje putem Asistenta je zatvoreno</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" /> od <ph name="TOTAL_RESULTS" /> rezultata</translation> +<translation id="2083113399121613785">Proba je omogućena</translation> <translation id="2096012225669085171">Sinkronizacija i prilagodba na svim uređajima</translation> <translation id="2100273922101894616">Automatska prijava</translation> <translation id="2100314319871056947">Pokušajte podijeliti tekst u manjim dijelovima</translation> @@ -963,7 +965,6 @@ <translation id="7704317875155739195">Samodovršavanje pretraživanja i URL-ova</translation> <translation id="7707922173985738739">Upotreba mobilnih podataka</translation> <translation id="7725024127233776428">Ovdje se prikazuju stranice koje označite</translation> -<translation id="7735637452482172701">Otključajte pomoću značajke zaključavanja zaslona</translation> <translation id="7746457520633464754">Radi otkrivanja opasnih aplikacija i web-lokacija Chrome šalje Googleu URL-ove nekih stranica koje posjećujete, ograničene podatke o sustavu i dio sadržaja web-stranica</translation> <translation id="7757787379047923882">Tekst dijeljen s uređaja <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Odaberite datum i vrijeme</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index bf63530a..92587909 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Nyomtatás</translation> <translation id="1450753235335490080">Nem sikerült a(z) <ph name="CONTENT_TYPE" /> megosztása</translation> <translation id="1477626028522505441">A következő fájl letöltése szerverproblémák miatt nem sikerült: <ph name="FILE_NAME" />.</translation> +<translation id="1497470209855416291">Próbaidőszak letiltva</translation> <translation id="1506061864768559482">Keresőmotor</translation> <translation id="1513352483775369820">Könyvjelzők és webes előzmények</translation> <translation id="1513858653616922153">Jelszó törlése</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Következő videó megtekintése</translation> <translation id="2074143993849053708">A Segéd hangalapú kereséssel kapcsolatos, bezárt hozzájárulási kezelőfelülete</translation> <translation id="2082238445998314030">Eredmény: <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Próbaidőszak engedélyezve</translation> <translation id="2096012225669085171">Szinkronizálás és személyre szabás az eszközök között</translation> <translation id="2100273922101894616">Automatikus bejelentkezés</translation> <translation id="2100314319871056947">Próbálja meg kisebb részletekben megosztani a szöveget</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Keresések és URL-címek automatikus kiegészítése</translation> <translation id="7707922173985738739">Mobiladat-kapcsolat használata</translation> <translation id="7725024127233776428">Itt jelennek meg a könyvjelzőként mentett oldalak</translation> -<translation id="7735637452482172701">Feloldás képernyőzár használatával</translation> <translation id="7746457520633464754">A veszélyes alkalmazások és webhelyek észlelésének érdekében a Chrome az egyes felkeresett oldalak URL-jét, valamint korlátozott rendszer-információkat és bizonyos oldaltartalmakat továbbít a Google-nak.</translation> <translation id="7757787379047923882">Szöveg megosztva a következő eszközről: <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Dátum és időpont kiválasztása</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index 29207f4f..e794757 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Տպում</translation> <translation id="1450753235335490080">Չհաջողվեց ուղարկել բովանդակությունը (<ph name="CONTENT_TYPE" />)</translation> <translation id="1477626028522505441"><ph name="FILE_NAME" /> ֆայլի ներբեռնումը ձախողվեց՝ սերվերի հետ կապված խնդրի պատճառով:</translation> +<translation id="1497470209855416291">Փորձնական տարբերակն անջատված է</translation> <translation id="1506061864768559482">Որոնողական համակարգ</translation> <translation id="1513352483775369820">Էջանիշներ և վեբ պատմություն</translation> <translation id="1513858653616922153">Ջնջել գաղտնաբառը</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Դիտել հաջորդ տեսանյութը</translation> <translation id="2074143993849053708">Օգնականի միջոցով ձայնային որոնման միջերեսը փակվել է</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />-ից <ph name="TOTAL_RESULTS" /> արդյունք</translation> +<translation id="2083113399121613785">Փորձնական տարբերակը միացված է</translation> <translation id="2096012225669085171">Համաժամացում և անհատականացում բոլոր սարքերում</translation> <translation id="2100273922101894616">Ավտոմատ մուտք</translation> <translation id="2100314319871056947">Փորձեք ուղարկել տեքստը մաս-մաս</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Ավտոմատ լրացնել որոնման հարցումները և URL-ները</translation> <translation id="7707922173985738739">Օգտագործել բջջային ինտերնետ</translation> <translation id="7725024127233776428">Ձեր էջանշած էջերը կցուցադրվեն այստեղ</translation> -<translation id="7735637452482172701">Ապակողպել էկրանի կողպման միջոցով</translation> <translation id="7746457520633464754">Վտանգավոր կայքերն ու հավելվածները հայտնաբերելու համար Chrome-ը Google-ին է ուղարկում ձեր այցելած որոշ էջերի URL-ներն ու դրանց բովանդակությունը և որոշակի տեղեկություններ համակարգի մասին։</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> սարքից ուղարկված հաղորդագրություն</translation> <translation id="7761849928583394409">Ընտրեք ամսաթիվը և ժամը</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 767e7370..6c0fe56 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Cetak</translation> <translation id="1450753235335490080">Tidak dapat membagikan <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Download <ph name="FILE_NAME" /> gagal karena masalah server.</translation> +<translation id="1497470209855416291">Uji coba dinonaktifkan</translation> <translation id="1506061864768559482">Mesin telusur</translation> <translation id="1513352483775369820">Bookmark dan histori web</translation> <translation id="1513858653616922153">Hapus sandi</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Tonton video berikutnya</translation> <translation id="2074143993849053708">UI izin penelusuran suara Asisten ditutup</translation> <translation id="2082238445998314030">Hasil <ph name="RESULT_NUMBER" /> dari <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Uji coba diaktifkan</translation> <translation id="2096012225669085171">Sinkronkan dan personalisasi di berbagai perangkat</translation> <translation id="2100273922101894616">Login Otomatis</translation> <translation id="2100314319871056947">Coba bagikan teks dalam potongan yang lebih kecil</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Lengkapi otomatis penelusuran dan URL</translation> <translation id="7707922173985738739">Gunakan data seluler</translation> <translation id="7725024127233776428">Halaman yang Anda bookmark muncul di sini</translation> -<translation id="7735637452482172701">Buka dengan Kunci Layar</translation> <translation id="7746457520633464754">Untuk mendeteksi aplikasi dan situs berbahaya, Chrome mengirimkan URL beberapa halaman yang Anda kunjungi, informasi sistem terbatas, dan beberapa konten halaman ke Google</translation> <translation id="7757787379047923882">Teks dibagikan dari <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Pilih tanggal & waktu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index 5defe35..385fe513 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Prenta</translation> <translation id="1450753235335490080">Ekki er hægt að deila <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Niðurhal á <ph name="FILE_NAME" /> mistókst vegna vandamála á netþjóni.</translation> +<translation id="1497470209855416291">Prufutími er óvirkur</translation> <translation id="1506061864768559482">Leitarvél</translation> <translation id="1513352483775369820">Bókamerki og vefferill</translation> <translation id="1513858653616922153">Eyða aðgangsorði</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Horfa á næsta myndskeið</translation> <translation id="2074143993849053708">Samþykkisviðmót raddleitar Hjálpara lokað</translation> <translation id="2082238445998314030">Niðurstaða <ph name="RESULT_NUMBER" /> af <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Prufutími er virkur</translation> <translation id="2096012225669085171">Samstilltu á milli tækja og gerðu að þínu</translation> <translation id="2100273922101894616">Sjálfvirk innskráning</translation> <translation id="2100314319871056947">Prófaðu að deila textanum í smærri hluta</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Fylla sjálfvirkt út leitir og vefslóðir</translation> <translation id="7707922173985738739">Nota farsímagögn</translation> <translation id="7725024127233776428">Síður sem þú setur í bókamerki birtast hér</translation> -<translation id="7735637452482172701">Taka úr lás með skjálás</translation> <translation id="7746457520633464754">Til að greina hættuleg forrit og vefsvæði sendir Chrome vefslóðir einhverra síðna sem þú skoðar, kerfisupplýsingar og efni síðu til Google.</translation> <translation id="7757787379047923882">Texta deilt af <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Velja dagsetningu og tíma</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index 1fa00974..c37a684 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Stampa</translation> <translation id="1450753235335490080">Impossibile condividere <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Download di <ph name="FILE_NAME" /> non riuscito a causa di problemi del server.</translation> +<translation id="1497470209855416291">La prova è disattivata</translation> <translation id="1506061864768559482">Motore di ricerca</translation> <translation id="1513352483775369820">Preferiti e cronologia web</translation> <translation id="1513858653616922153">Elimina la password</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Guarda il video successivo</translation> <translation id="2074143993849053708">Interfaccia utente per il consenso all'utilizzo dell'assistente per la ricerca vocale chiusa</translation> <translation id="2082238445998314030">Risultato <ph name="RESULT_NUMBER" /> di <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">La prova è attivata</translation> <translation id="2096012225669085171">Sincronizza e personalizza su tutti i dispositivi</translation> <translation id="2100273922101894616">Accesso automatico</translation> <translation id="2100314319871056947">Prova a condividere il testo in parti più piccole</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Completamento automatico di ricerche e URL</translation> <translation id="7707922173985738739">Verranno utilizzati i dati mobili</translation> <translation id="7725024127233776428">Le pagine aggiunte ai preferiti saranno mostrate qui</translation> -<translation id="7735637452482172701">Sblocca con blocco schermo</translation> <translation id="7746457520633464754">Per rilevare app e siti pericolosi, Chrome invia a Google gli URL di alcune pagine che visiti, informazioni limitate sul sistema e i contenuti di alcune pagine</translation> <translation id="7757787379047923882">Testo condiviso da <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Scegli data e ora</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index dcb7cb4..79f41a4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">הדפסה</translation> <translation id="1450753235335490080">לא ניתן לשתף את ה<ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">הורדת <ph name="FILE_NAME" /> נכשלה עקב בעיות בשרת.</translation> +<translation id="1497470209855416291">תקופת הניסיון הושבתה</translation> <translation id="1506061864768559482">מנוע חיפוש</translation> <translation id="1513352483775369820">סימניות והיסטוריית אתרים</translation> <translation id="1513858653616922153">מחיקת סיסמה</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">לצפייה בסרטון הבא</translation> <translation id="2074143993849053708">ההסכמה לחיפוש קולי של Assistant בממשק משתמש נסגרה</translation> <translation id="2082238445998314030">תוצאה <ph name="RESULT_NUMBER" /> מתוך <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">תקופת הניסיון הופעלה</translation> <translation id="2096012225669085171">סנכרון והתאמה אישית במכשירים שונים</translation> <translation id="2100273922101894616">כניסה אוטומטית</translation> <translation id="2100314319871056947">כדאי לשתף את הטקסט במקטעים קטנים יותר</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">השלמה אוטומטית של חיפושים וכתובות אתרים</translation> <translation id="7707922173985738739">שימוש בחבילת הגלישה</translation> <translation id="7725024127233776428">הדפים שהוספת לסימניות מופיעים כאן</translation> -<translation id="7735637452482172701">ביטול נעילה באמצעות נעילת מסך</translation> <translation id="7746457520633464754">כדי לזהות אפליקציות ואתרים מסוכנים, Chrome שולח אל Google כתובות URL של חלק מהדפים שאליהם נכנסת, מידע מוגבל לגבי המערכת וחלק מתוכן הדפים</translation> <translation id="7757787379047923882">הטקסט שותף דרך <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">בחירת תאריך ושעה</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index 67f90efd4..c26b4a28 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -964,7 +964,6 @@ <translation id="7704317875155739195">検索語句や URL をオートコンプリートする</translation> <translation id="7707922173985738739">モバイルデータを使用します</translation> <translation id="7725024127233776428">ブックマークしたページがここに表示されます</translation> -<translation id="7735637452482172701">画面ロックでロックを解除する</translation> <translation id="7746457520633464754">危険なアプリやサイトを検出するために、アクセスした一部のページの URL と限定的なシステム情報、一部のページ コンテンツが Chrome から Google に送信されます</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> からテキストが共有されました</translation> <translation id="7761849928583394409">日付と時間を選択</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 01d5d6a..337cd14 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">ბეჭდვა</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> ვერ ზიარდება</translation> <translation id="1477626028522505441"><ph name="FILE_NAME" /> ვერ ჩამოიტვირთა სერვერთან დაკავშირებული პრობლემების გამო.</translation> +<translation id="1497470209855416291">საცდელი ვერსია გათიშულია</translation> <translation id="1506061864768559482">საძიებო სისტემა</translation> <translation id="1513352483775369820">სანიშნეები და ვებ-ისტორია</translation> <translation id="1513858653616922153">პაროლის წაშლა</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">შემდეგი ვიდეოს ყურება</translation> <translation id="2074143993849053708">ასისტენტში ხმოვან ძიებაზე თანხმობის სამომხმარებლო ინტერფეისი დახურულია</translation> <translation id="2082238445998314030">შედეგი <ph name="RESULT_NUMBER" /> / <ph name="TOTAL_RESULTS" />-დან</translation> +<translation id="2083113399121613785">საცდელი ვერსია ჩართულია</translation> <translation id="2096012225669085171">სინქრონიზაცია და პერსონალიზება სხვადასხვა მოწყობილობას შორის</translation> <translation id="2100273922101894616">ავტომატური შესვლა</translation> <translation id="2100314319871056947">ცადეთ ტექსტის გაზიარება უფრო მცირე ფრაგმენტებად</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">ძიებებისა და URL-ების ავტომატური დასრულება</translation> <translation id="7707922173985738739">მობილური ინტერნეტის გამოყენება</translation> <translation id="7725024127233776428">აქ გამოჩნდება თქვენ მიერ სანიშნით მონიშნული გვერდები</translation> -<translation id="7735637452482172701">ეკრანის დაბლოკვით განბლოკვა</translation> <translation id="7746457520633464754">სახიფათო აპებისა და საიტების აღმოსაჩენად Chrome უგზავნის Google-ს თქვენ მიერ მონახულებული ზოგიერთი გვერდის URL-ებს, სისტემის შეზღუდულ ინფორმაციასა და გვერდების გარკვეულ კონტენტს</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" />-დან გაზიარებული ტექსტი</translation> <translation id="7761849928583394409">თაირიღისა და დროის არჩევა</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 69591b3..a01325e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -964,7 +964,6 @@ <translation id="7704317875155739195">Іздеулер мен URL мекенжайларын автотолтыру</translation> <translation id="7707922173985738739">Мобильдік деректерді пайдалану</translation> <translation id="7725024127233776428">Бетбелгі қойылған беттер осы жерде көрсетіледі</translation> -<translation id="7735637452482172701">Экран құлпымен ашу</translation> <translation id="7746457520633464754">Қауіпті қолданбалар мен сайттарды анықтау үшін Chrome браузері сіз кірген кейбір беттердің URL сілтемелерін, жүйе туралы шектеулі ақпаратты және беттің кейбір мазмұнын Google-ға жібереді.</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> бөліскен мәтін</translation> <translation id="7761849928583394409">Күні мен уақытын таңдау</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 206206f..06e1f9b75c 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
@@ -964,7 +964,6 @@ <translation id="7704317875155739195">បំពេញការស្វែងរក និង URL ដោយស្វ័យប្រវត្តិ</translation> <translation id="7707922173985738739">ប្រើទិន្នន័យទូរសព្ទចល័ត</translation> <translation id="7725024127233776428">ទំព័រដែលអ្នកចំណាំបង្ហាញនៅទីនេះ</translation> -<translation id="7735637452482172701">ដោះសោដោយប្រើមុខងារចាក់សោអេក្រង់</translation> <translation id="7746457520633464754">ដើម្បីរកមើលកម្មវិធី និងគេហទំព័រគ្រោះថ្នាក់ Chrome ផ្ញើ URL របស់ទំព័រមួយចំនួនដែលអ្នកចូលមើល ព្រមទាំងខ្លឹមសារទំព័រ និងព័ត៌មានប្រព័ន្ធមួយចំនួនទៅ Google</translation> <translation id="7757787379047923882">អត្ថបទដែលបានចែករំលែកពី <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">ជ្រើសរើសកាលបរិច្ឆេទ និងម៉ោង</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb index 8f36958..1057ee6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -964,7 +964,6 @@ <translation id="7704317875155739195">ಸ್ವಯಂಪೂರ್ಣ ಹುಡುಕಾಟಗಳು ಮತ್ತು URLಗಳು</translation> <translation id="7707922173985738739">ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಸಿ</translation> <translation id="7725024127233776428">ನೀವು ಬುಕ್ಮಾರ್ಕ್ ಮಾಡುವ ಪುಟಗಳು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ</translation> -<translation id="7735637452482172701">ಸ್ಕ್ರೀನ್ ಲಾಕ್ಗಳು ನೊಂದಿಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿ</translation> <translation id="7746457520633464754">ಅಪಾಯಕಾರಿ ಆ್ಯಪ್ಗಳು ಮತ್ತು ಸೈಟ್ಗಳನ್ನು ಪತ್ತೆಹಚ್ಚಲು Chrome, ನೀವು ಭೇಟಿ ನೀಡುವ ಕೆಲವು ಪುಟಗಳ URL ಗಳು, ಸೀಮಿತ ಸಿಸ್ಟಂ ಮಾಹಿತಿ ಮತ್ತು ಕೆಲವು ಪುಟದ ವಿಷಯವನ್ನು Google ಗೆ ಕಳುಹಿಸುತ್ತದೆ</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> ಮೂಲಕ ಪಠ್ಯವನ್ನು ಹಂಚಲಾಗಿದೆ</translation> <translation id="7761849928583394409">ದಿನಾಂಕ ಮತ್ತು ಸಮಯವನ್ನು ಆರಿಸಿ</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 a89284e..be712b5 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">인쇄</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> 공유할 수 없음</translation> <translation id="1477626028522505441">서버 문제로 인해 <ph name="FILE_NAME" />을(를) 다운로드할 수 없습니다.</translation> +<translation id="1497470209855416291">시험판 사용 중지됨</translation> <translation id="1506061864768559482">검색엔진</translation> <translation id="1513352483775369820">북마크 및 방문 기록</translation> <translation id="1513858653616922153">비밀번호 삭제</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">다음 동영상 보기</translation> <translation id="2074143993849053708">어시스턴트 음성 검색 동의 UI 닫힘</translation> <translation id="2082238445998314030">전체 결과 <ph name="TOTAL_RESULTS" />개 중 <ph name="RESULT_NUMBER" />개</translation> +<translation id="2083113399121613785">시험판 사용 설정됨</translation> <translation id="2096012225669085171">모든 기기 동기화 및 맞춤설정</translation> <translation id="2100273922101894616">자동 로그인</translation> <translation id="2100314319871056947">좀 더 짧은 길이로 텍스트를 줄인 다음 공유해 보세요.</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">검색어 및 URL 자동 완성</translation> <translation id="7707922173985738739">모바일 데이터 사용</translation> <translation id="7725024127233776428">북마크한 페이지가 여기에 표시됩니다.</translation> -<translation id="7735637452482172701">화면 잠금 해제</translation> <translation id="7746457520633464754">Chrome은 위험한 앱 및 사이트를 감지하기 위해 일부 방문 페이지의 URL, 제한적인 시스템 정보, 페이지 콘텐츠 일부를 Google로 전송합니다.</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" />에서 공유된 텍스트</translation> <translation id="7761849928583394409">날짜 및 시간 선택</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index 4d39ed86..163f0d9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -474,7 +474,7 @@ <translation id="4487967297491345095">Chrome'дун колдонмо дайындарынын бардыгы биротоло өчүрүлөт. Ага бардык файлдар, жөндөөлөр, каттоо эсептери, дайындар базасы ж.б. кирет.</translation> <translation id="4493497663118223949">Жөнөкөй режим күйүк</translation> <translation id="4508528996305412043">Түрмөктөгү меню ачылды</translation> -<translation id="4508642716788467538">Тилиңизди тандаңыз</translation> +<translation id="4508642716788467538">Тил тандаңыз</translation> <translation id="4513387527876475750">{DAYS,plural, =1{# күн мурун}other{# күн мурун}}</translation> <translation id="451872707440238414">Кыстармаларды издөө</translation> <translation id="4521489764227272523">Тандалган дайындар Chrome'дон жана шайкештирилген түзмөктөрүңүздөн өчүрүлдү. @@ -750,7 +750,7 @@ <translation id="6277522088822131679">Баракты басып чыгарууда көйгөй келип чыкты. Дагы аракет кылып көрүңүз.</translation> <translation id="6278428485366576908">Тема</translation> <translation id="6292420053234093573">Chrome'ду колдонуу менен, <ph name="BEGIN_LINK1" />Google'дун Тейлөө шарттарына<ph name="END_LINK1" /> жана <ph name="BEGIN_LINK2" />Google Chrome менен Chrome OS'тун Кошумча Тейлөө шарттарына<ph name="END_LINK2" /> макулдугуңузду билдиресиз.</translation> -<translation id="629730747756840877">Каттоо эсеби</translation> +<translation id="629730747756840877">Аккаунт</translation> <translation id="6297765934698848803">Түзмөгүңүздү башкарган уюм камераңызды өчүрүп койду.</translation> <translation id="6301525844455696527">Окуу тизмеңизди унутпаңыз</translation> <translation id="6303969859164067831">Аккаунттан чыгып, шайкештирүүнү өчүрүү</translation> @@ -964,7 +964,6 @@ <translation id="7704317875155739195">Издөө сурамдарын жана URL'дерди автоматтык түрдө толтуруу</translation> <translation id="7707922173985738739">Мобилдик Интернетти колдонуу</translation> <translation id="7725024127233776428">Сиз кыстарма катары сактаган барактар ушул жерде көрүнөт</translation> -<translation id="7735637452482172701">Screen Lock менен кулпусун ачуу</translation> <translation id="7746457520633464754">Кооптуу колдонмолор менен сайттарды аныктоо үчүн, Chrome сиз баш баккан айрым сайттардын URL'дерин, тутум тууралуу чектелген маалыматты жана барактагы айрым мазмунду Google'га жөнөтүп турат</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> түзмөгүнөн көчүрүлгөн текст</translation> <translation id="7761849928583394409">Күн жана убакыт тандоо</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index 2b5b0ea..774e614 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -964,7 +964,6 @@ <translation id="7704317875155739195">ຕື່ມການຊອກຫາ ແລະ URL ໂດຍອັດຕະໂນມັດ</translation> <translation id="7707922173985738739">ໃຊ້ຂໍ້ມູນມືຖື</translation> <translation id="7725024127233776428">ໜ້າທີ່ທ່ານບຸກມາກໄວ້ປາກົດຢູ່ບ່ອນນີ້</translation> -<translation id="7735637452482172701">ປົດລັອກດ້ວຍລັອກໜ້າຈໍ</translation> <translation id="7746457520633464754">ເພື່ອກວດຫາແອັບ ແລະ ເວັບໄຊອັນຕະລາຍ, Chrome ສົ່ງ URL ຂອງບາງໜ້າເວັບທີ່ທ່ານເຂົ້າເບິ່ງ, ຂໍ້ມູນລະບົບແບບຈຳກັດ ແລະ ບາງເນື້ອຫາໜ້າເວັບໄປໃຫ້ Google</translation> <translation id="7757787379047923882">ຂໍ້ຄວາມທີ່ແບ່ງປັນຈາກ <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">ເລືອກວັນ ແລະ ເວລາ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index 0b9a3cb..ab2d824 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -964,7 +964,6 @@ <translation id="7704317875155739195">Automatiškai užbaigti paieškas ir URL</translation> <translation id="7707922173985738739">Naudoti mobiliojo ryšio duomenis</translation> <translation id="7725024127233776428">Pažymėti puslapiai rodomi čia</translation> -<translation id="7735637452482172701">Atrakinti naudojant ekrano užraktą</translation> <translation id="7746457520633464754">Tam, kad būtų aptiktos pavojingos programos ir svetainės, „Chrome“ siunčia „Google“ kai kurių puslapių, kuriuose lankotės, URL, ribotą sistemos informaciją ir kai kurių puslapių turinį</translation> <translation id="7757787379047923882">Tekstas bendrinamas iš „<ph name="DEVICE_NAME" />“</translation> <translation id="7761849928583394409">Pasirinkti datą ir laiką</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index 67165868..98d1cad 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Drukāt</translation> <translation id="1450753235335490080">Nevar kopīgot: <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Neizdevās lejupielādēt failu <ph name="FILE_NAME" />, jo radās servera problēmas.</translation> +<translation id="1497470209855416291">Izmēģinājuma periods ir atspējots.</translation> <translation id="1506061864768559482">Meklētājprogramma</translation> <translation id="1513352483775369820">Grāmatzīmes un tīmekļa vēsture</translation> <translation id="1513858653616922153">Dzēst paroli</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Skatīties nākamo videoklipu</translation> <translation id="2074143993849053708">Piekrišanas lietotāja saskarne Asistenta izmantošanai meklēšanā ar balsi (aizvērta)</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. rezultāts no <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Izmēģinājuma periods ir iespējots.</translation> <translation id="2096012225669085171">Sinhronizējiet un personalizējiet vairākās ierīcēs</translation> <translation id="2100273922101894616">Automātiski pierakstīties</translation> <translation id="2100314319871056947">Kopīgojiet mazākus teksta fragmentus</translation> @@ -591,6 +593,7 @@ <translation id="5222676887888702881">Izrakstīties</translation> <translation id="5230560987958996918"><ph name="SITE" /> vēlas meklēt tuvumā esošas Bluetooth ierīces. Ir atrastas šīs ierīces:</translation> <translation id="5233638681132016545">Jauna cilne</translation> +<translation id="5250483651202458397">Ekrānuzņēmums. Pieskarieties, lai to aizvērtu.</translation> <translation id="526421993248218238">Šo lapu nevar ielādēt</translation> <translation id="5271967389191913893">Ierīcē nevar atvērt lejupielādējamo saturu.</translation> <translation id="5292796745632149097">Sūtīt uz:</translation> @@ -836,6 +839,7 @@ <translation id="6767294960381293877">Ierīču saraksts, ar ko kopīgot cilni, ir atvērts pusekrāna augstumā.</translation> <translation id="6783942555455976443">Saglabājiet šo lapu lasīšanai vēlāk un saņemiet atgādinājumu</translation> <translation id="6811034713472274749">Lapu var skatīt</translation> +<translation id="6813446258015311409">Lapa “Pierakstīšanās pārlūkā Chrome”, atvērta.</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, cilne, atlasīta</translation> <translation id="6833996806551876956">Privacy Sandbox izmēģinājuma periods</translation> @@ -964,7 +968,6 @@ <translation id="7704317875155739195">Automātiski pabeigt meklēšanas vaicājumus un vietrāžus URL</translation> <translation id="7707922173985738739">Izmantot mobilos datus</translation> <translation id="7725024127233776428">Šeit tiek rādītas ar grāmatzīmēm atzīmētās lapas</translation> -<translation id="7735637452482172701">Atbloķēt, izmantojot ekrāna bloķēšanu</translation> <translation id="7746457520633464754">Lai noteiktu bīstamas lietotnes un vietnes, pārlūkā Chrome dažu jūsu apmeklēto lapu saturs, ierobežots sistēmas informācijas apjoms un daļa lapu satura tiek nosūtīta uzņēmumam Google</translation> <translation id="7757787379047923882">Kopīgots teksts no ierīces <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Datuma un laika izvēle</translation> @@ -1097,6 +1100,7 @@ <translation id="8583805026567836021">Konta datu dzēšana</translation> <translation id="8587585930972369234">Lai meklētu, pieskarieties un turiet</translation> <translation id="860043288473659153">Bankas kartes īpašnieka vārds</translation> +<translation id="8602358303461588329">Lapa “Pierakstīšanās pārlūkā Chrome”, aizvērta.</translation> <translation id="860282621117673749">Brīdinājumi par cenu kritumu</translation> <translation id="8616006591992756292">Jūsu Google kontam var būt citu veidu pārlūkošanas vēstures dati vietnē <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="8617240290563765734">Vai atvērt lejupielādētajā saturā norādīto ieteikto URL?</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 15070215..f9393ac 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Печати</translation> <translation id="1450753235335490080">Не може да се сподели <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Преземањето на <ph name="FILE_NAME" /> не успеа поради проблеми со серверот.</translation> +<translation id="1497470209855416291">Пробниот период е оневозможен</translation> <translation id="1506061864768559482">Пребарувач</translation> <translation id="1513352483775369820">Обележувачи и веб-историја</translation> <translation id="1513858653616922153">Избриши ја лозинката</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Гледајте го следното видео</translation> <translation id="2074143993849053708">Корисничкиот интерфејс за согласност за гласовно пребарување со „Помошникот“ е затворен</translation> <translation id="2082238445998314030">Резултат <ph name="RESULT_NUMBER" /> од <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Пробниот период е овозможен</translation> <translation id="2096012225669085171">Синхронизирајте и персонализирајте низ уредите</translation> <translation id="2100273922101894616">Автоматско најавување</translation> <translation id="2100314319871056947">Обидете се да го споделите текстот во помали делови</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Автоматски довршувај ги пребарувањата и URL-адресите</translation> <translation id="7707922173985738739">Ќе користи мобилен интернет</translation> <translation id="7725024127233776428">Страниците што ќе ги обележите се појавуваат тука</translation> -<translation id="7735637452482172701">Отклучете со заклучувањето екран</translation> <translation id="7746457520633464754">За да открие опасни апликации и сајтови, Chrome испраќа URL-адреси од некои страници што ги посетувате, ограничени информации за системот и некои содржини од страниците до Google</translation> <translation id="7757787379047923882">Текстот е споделен од <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Изберете датум и време</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb index 5b4a43b..77dd1a1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -591,6 +591,7 @@ <translation id="5222676887888702881">സൈൻ ഔട്ട് ചെയ്യുക</translation> <translation id="5230560987958996918"><ph name="SITE" /> എന്നതിന് സമീപമുള്ള Bluetooth ഉപകരണങ്ങൾ സ്കാൻ ചെയ്യണമെന്നുണ്ട്. ഇനിപ്പറയുന്ന ഉപകരണങ്ങൾ കണ്ടെത്തി:</translation> <translation id="5233638681132016545">പുതിയ ടാബ്</translation> +<translation id="5250483651202458397">സ്ക്രീൻഷോട്ട്. അടയ്ക്കാൻ ടാപ്പ് ചെയ്യുക.</translation> <translation id="526421993248218238">ഈ പേജ് ലോഡ് ചെയ്യാനായില്ല</translation> <translation id="5271967389191913893">ഡൗൺലോഡ് ചെയ്യേണ്ട ഉള്ളടക്കം ഉപകരണത്തിന് തുറക്കാനാവില്ല.</translation> <translation id="5292796745632149097">ഇതിലേക്ക് അയയ്ക്കുക</translation> @@ -836,6 +837,7 @@ <translation id="6767294960381293877">പകുതി ഉയരത്തിൽ ടാബ് പങ്കിടാനാകുന്ന ഉപകരണങ്ങളുടെ ലിസ്റ്റ്.</translation> <translation id="6783942555455976443">പിന്നീട് വായിക്കുന്നതിന് ഈ പേജ് സംരക്ഷിച്ച് റിമൈൻഡർ നേടുക</translation> <translation id="6811034713472274749">പേജ്, കാണാൻ തയ്യാറാണ്</translation> +<translation id="6813446258015311409">Chrome-ലേക്ക് സെെൻ ഇൻ ചെയ്യുക, തുറന്നു.</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, ടാബ്, തിരഞ്ഞെടുത്തു</translation> <translation id="6833996806551876956">സ്വകാര്യതാ സാൻഡ്ബോക്സ് ട്രയൽ</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">സ്വമേധയാ പൂർത്തിയാക്കുന്ന തിരയലുകളും URL-കളും</translation> <translation id="7707922173985738739">മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കുക</translation> <translation id="7725024127233776428">നിങ്ങൾ ബുക്ക്മാർക്ക് ചെയ്യുന്ന പേജുകൾ ഇവിടെ ദൃശ്യമാകും</translation> -<translation id="7735637452482172701">സ്ക്രീൻ ലോക്ക് ഉപയോഗിച്ച് അൺലോക്ക് ചെയ്യുക</translation> <translation id="7746457520633464754">അപകടകരമായ ആപ്പുകളും സൈറ്റുകളും കണ്ടെത്തുന്നതിന്, നിങ്ങൾ സന്ദർശിക്കുന്ന ചില പേജുകളുടെ URL, പരിമിത സിസ്റ്റം വിവരങ്ങൾ, ചില പേജ് ഉള്ളടക്കം എന്നിവ Chrome Google-ന് അയയ്ക്കുന്നു</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> ഉപകരണത്തിൽ നിന്ന് പങ്കിട്ട ടെക്സ്റ്റ്</translation> <translation id="7761849928583394409">തീയതിയും സമയവും തിരഞ്ഞെടുക്കുക</translation> @@ -1097,6 +1098,7 @@ <translation id="8583805026567836021">അക്കൗണ്ട് ഡാറ്റ മായ്ക്കുന്നു</translation> <translation id="8587585930972369234">തിരയാൻ സ്പർശിച്ച് പിടിക്കുക</translation> <translation id="860043288473659153">കാർഡിന്റെ ഉടമയുടെ പേര്</translation> +<translation id="8602358303461588329">Chrome-ലേക്ക് സെെൻ ഇൻ ചെയ്യുക, അടച്ചു.</translation> <translation id="860282621117673749">വിലയിടിവ് മുന്നറിയിപ്പുകൾ</translation> <translation id="8616006591992756292">നിങ്ങളുടെ Google അക്കൗണ്ടിന് <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> എന്നതിൽ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രമുണ്ടായിരിക്കാം.</translation> <translation id="8617240290563765734">ഡൗൺലോഡ് ചെയ്ത ഉള്ളടക്കത്തിൽ നിർദ്ദേശിച്ചിട്ടുള്ള URL തുറക്കണോ?</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 09b3694..465cd7b 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Хэвлэх</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" />-г хуваалцах боломжгүй байна</translation> <translation id="1477626028522505441">Серверийн алдаанаас шалтгаалан <ph name="FILE_NAME" />-г татаж чадсангүй.</translation> +<translation id="1497470209855416291">Туршилтыг идэвхгүй болгосон</translation> <translation id="1506061864768559482">Хайлтын хэрэгсэл</translation> <translation id="1513352483775369820">Хавчуурга болон веб түүх</translation> <translation id="1513858653616922153">Нууц үг устгах</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Дараагийн видеог үзэх</translation> <translation id="2074143993849053708">Туслахын дуут хайлтын зөвшөөрлийн ui-г хаасан</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" />-ын <ph name="RESULT_NUMBER" /> илэрц байна</translation> +<translation id="2083113399121613785">Tуршилтыг идэвхжүүлсэн</translation> <translation id="2096012225669085171">Төхөөрөмжүүдийг синк хийж хувийн болгох</translation> <translation id="2100273922101894616">Автоматаар нэвтэх</translation> <translation id="2100314319871056947">Текстийг жижиг хэсгээр хуваалцахыг оролдоно уу</translation> @@ -963,7 +965,6 @@ <translation id="7704317875155739195">Хайлт болон URL-г автоматаар гүйцээх</translation> <translation id="7707922173985738739">Мобайл дата ашиглах</translation> <translation id="7725024127233776428">Таны хавчуурга хийсэн хуудас энд харагдана</translation> -<translation id="7735637452482172701">Дэлгэцийн түгжээ ашиглан түгжээг тайлах</translation> <translation id="7746457520633464754">Chrome аюултай апп болон сайт илрүүлэхийн тулд таны зочилдог зарим хуудасны URL, хязгаарлагдмал системийн мэдээлэл болон зарим хуудасны контентыг Google-д илгээдэг</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" />-с текстийг хуваалцсан</translation> <translation id="7761849928583394409">Огноо болон цаг сонгох</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index e7f892d..4f53f69 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -963,7 +963,6 @@ <translation id="7704317875155739195">ऑटोकंप्लीट शोध आणि URL</translation> <translation id="7707922173985738739">मोबाइल डेटा वापरा</translation> <translation id="7725024127233776428">तुम्ही बुकमार्क केलेली पेज येथे दिसतील</translation> -<translation id="7735637452482172701">स्क्रीन लॉकसह अनलॉक करा</translation> <translation id="7746457520633464754">धोकादायक ॲप्स आणि साइट शोधण्यासाठी, Chrome तुम्ही भेट दिलेल्या काही पेजचे URL, मर्यादित सिस्टमची माहिती आणि काही पेजचा आशय Google कडे पाठवतो</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> वरून शेअर केलेला मजकूर</translation> <translation id="7761849928583394409">तारीख आणि वेळ निवडा</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 708901c..d389c53 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Cetak</translation> <translation id="1450753235335490080">Tidak dapat berkongsi <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Muat turun <ph name="FILE_NAME" /> gagal disebabkan oleh masalah pelayan.</translation> +<translation id="1497470209855416291">Percubaan dilumpuhkan</translation> <translation id="1506061864768559482">Enjin carian</translation> <translation id="1513352483775369820">Penanda halaman dan sejarah web</translation> <translation id="1513858653616922153">Padam kata laluan</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Tonton video seterusnya</translation> <translation id="2074143993849053708">UI persetujuan carian suara Assistant ditutup</translation> <translation id="2082238445998314030">Hasil carian <ph name="RESULT_NUMBER" /> daripada <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Percubaan didayakan</translation> <translation id="2096012225669085171">Segerakkan dan peribadikan pada semua peranti</translation> <translation id="2100273922101894616">Auto Log masuk</translation> <translation id="2100314319871056947">Cuba kongsikan teks itu dalam bahagian yang lebih kecil</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Autolengkap carian dan URL</translation> <translation id="7707922173985738739">Gunakan data mudah alih</translation> <translation id="7725024127233776428">Halaman yang anda tandai halaman dipaparkan di sini</translation> -<translation id="7735637452482172701">Buka kunci dengan Kunci Skrin</translation> <translation id="7746457520633464754">Untuk mengesan apl dan tapak berbahaya, Chrome menghantar URL sesetengah halaman yang anda lawati, maklumat sistem yang terhad dan sesetengah kandungan halaman kepada Google</translation> <translation id="7757787379047923882">Teks dikongsi daripada <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Pilih tarikh & masa</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index 9aa282b2..fd2dba6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">ပရင့်</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> ကို မျှဝေ၍ မရပါ</translation> <translation id="1477626028522505441"><ph name="FILE_NAME" /> ဒေါင်းလုဒ်မှာ အကြောင်း အမျိုးမျိုးကြောင့် မအောင်မြင်ခဲ့ပါ။</translation> +<translation id="1497470209855416291">အစမ်းသုံးကာလ ပိတ်ထားသည်</translation> <translation id="1506061864768559482">ရှာဖွေရေး အင်ဂျင်</translation> <translation id="1513352483775369820">စာညှပ်များ နှင့် ဝဘ် မှတ်တမ်း</translation> <translation id="1513858653616922153">စကားဝှက်ကို ဖျက်ရန်</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">နောက်ဗီဒီယို ကြည့်ရန်</translation> <translation id="2074143993849053708">Assistant အသံဖြင့်ရှာဖွေခြင်း သဘောတူညီချက် ui ကို ပိတ်ထားသည်</translation> <translation id="2082238445998314030">အဖြေ <ph name="RESULT_NUMBER" /> / <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">အစမ်းသုံးကာလ ဖွင့်ထားသည်</translation> <translation id="2096012225669085171">စက်ပစ္စည်းများအားလုံးတွင် စင့်ခ်လုပ်ပြီး ပုဂ္ဂိုလ်ရေးသီးသန့် ပြင်ဆင်ပါ</translation> <translation id="2100273922101894616">အလိုအလျောက် ဝင်ရောက်ရန်</translation> <translation id="2100314319871056947">စာသားကို ပိုသေးသော အပိုင်းများအဖြစ် မျှဝေကြည့်ပါ</translation> @@ -963,7 +965,6 @@ <translation id="7704317875155739195">ရှာဖွေမှုများနှင့် URL များကို အလိုအလျောက်ဖြည့်ခြင်း</translation> <translation id="7707922173985738739">မိုဘိုင်းဒေတာကို သုံးရန်</translation> <translation id="7725024127233776428">သင်သိမ်းဆည်းထားသည့် လိပ်စာ၏ စာမျက်နှာများကို ဤနေရာတွင် တွေ့ရပါမည်</translation> -<translation id="7735637452482172701">ဖန်သားပြင် လော့ခ်ချခြင်းဖြင့် ဖွင့်ရန်</translation> <translation id="7746457520633464754">အန္တရာယ်ရှိသော အက်ပ်နှင့် ဝဘ်ဆိုက်များကို သိရှိရန် Chrome က သင်ဝင်ကြည့်ထားသော စာမျက်နှာအချို့၏ URL များ၊ ကန့်သတ်ထားသော စနစ် အချက်အလက်များနှင့် စာမျက်နှာ အကြောင်းအရာအချို့ကို Google သို့ ပို့ပါသည်</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> မှ မျှဝေထားသော စာသား</translation> <translation id="7761849928583394409">ရက်စွဲနှင့် အချိန်ရွေးရန်</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index 9a0b8b2..58733c6c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -590,6 +590,7 @@ <translation id="5222676887888702881">साइन आउट गर्नुहोस्</translation> <translation id="5230560987958996918"><ph name="SITE" /> वरपरका ब्लुटुथ यन्त्रहरू खोज्न स्क्यान गर्न चाहन्छ। निम्न यन्त्रहरू फेला परेका छन्:</translation> <translation id="5233638681132016545">नयाँ ट्याब</translation> +<translation id="5250483651202458397">स्क्रिनसट। बन्द गर्न ट्याप गर्नुहोस्।</translation> <translation id="526421993248218238">यो पृष्ठ लोड गर्न सकिएन</translation> <translation id="5271967389191913893">यन्त्रले डाउनलोड गर्नको लागि सामग्रीलाई खोल्न सक्दैन।</translation> <translation id="5292796745632149097">निम्न यन्त्रमा पठाउनुहोस्</translation> @@ -835,6 +836,7 @@ <translation id="6767294960381293877">ट्याब आदान प्रदान गरिनु पर्ने यन्त्रहरूको सूची आधा उचाइमा खोलिएको छ।</translation> <translation id="6783942555455976443">यो पृष्ठ पछि पढ्ने प्रयोजनका लागि सुरक्षित गर्नुहोस् र रिमाइन्डर प्राप्त गर्नुहोस्</translation> <translation id="6811034713472274749">पृष्ठ हेर्नका लागि तयार छ</translation> +<translation id="6813446258015311409">Chrome मा साइन इन गर्ने पेज खोलियो।</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, ट्याब, चयन गरियो</translation> <translation id="6833996806551876956">गोपनीयता स्यान्डबक्सको ट्रायल अवधि</translation> @@ -963,7 +965,6 @@ <translation id="7704317875155739195">खोज तथा URL हरू स्वतः पूर्ण गर्नुहोस्</translation> <translation id="7707922173985738739">मोबाइल डेटा प्रयोग गर्नुहोस्</translation> <translation id="7725024127233776428">तपाईंले पुस्तक चिन्ह लगाउनुभएका पृष्ठहरू यहाँ देखिन्छन्</translation> -<translation id="7735637452482172701">स्क्रिन लक प्रयोग गरी अनलक गर्नुहोस्</translation> <translation id="7746457520633464754">Chrome ले खतरनाक एप र साइटहरू पत्ता लगाउने प्रयोजनका लागि तपाईंले भ्रमण गर्ने केही पृष्ठका URL, प्रणालीसम्बन्धी सीमित जानकारी र केही पृष्ठका सामग्री Google मा पठाउँछ</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> ले आदान प्रदान गरेको पाठ</translation> <translation id="7761849928583394409">मिति र समय रोज्नुहोस्</translation> @@ -1096,6 +1097,7 @@ <translation id="8583805026567836021">खाता लगत खालि गर्दै</translation> <translation id="8587585930972369234">खोज्न टच एण्ड होल्ड गर्नुहोस्</translation> <translation id="860043288473659153">कार्डवालाको नाम</translation> +<translation id="8602358303461588329">Chrome मा साइन इन गर्ने पेज बन्द गरियो।</translation> <translation id="860282621117673749">मूल्य घटेको कुरासम्बन्धी अलर्टहरू</translation> <translation id="8616006591992756292">तपाईंको Google खाताको <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> मा अन्य प्रकारका ब्राउजिङ इतिहास रहेका हुन सक्छन्।</translation> <translation id="8617240290563765734">डाउनलोड गरिएको सामग्रीमा सुझाव गरिएको निर्दिष्ट URL खोल्ने हो?</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 0805a8e..7a58367 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
@@ -964,7 +964,6 @@ <translation id="7704317875155739195">Zoekopdrachten en URL's automatisch aanvullen</translation> <translation id="7707922173985738739">Mobiele data gebruiken</translation> <translation id="7725024127233776428">Pagina's waaraan je een bookmark toevoegt, worden hier weergegeven</translation> -<translation id="7735637452482172701">Ontgrendelen met schermvergrendeling</translation> <translation id="7746457520633464754">Chrome verzendt de URL's van sommige pagina's die je bezoekt, beperkte systeemgegevens en bepaalde paginacontent naar Google om gevaarlijke apps en sites te detecteren</translation> <translation id="7757787379047923882">Tekst gedeeld vanaf <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Datum en tijd kiezen</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 d9bf4ae..158fb20 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Skriv ut</translation> <translation id="1450753235335490080">Kan ikke dele <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Nedlastingen av <ph name="FILE_NAME" /> ble avbrutt på grunn av tjenerproblemer.</translation> +<translation id="1497470209855416291">Prøveperioden er deaktivert</translation> <translation id="1506061864768559482">Søkemotor</translation> <translation id="1513352483775369820">Bokmerker og nettlogg</translation> <translation id="1513858653616922153">Slett passordet</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Se neste video</translation> <translation id="2074143993849053708">UI for samtykke til talesøk med assistenten er lukket</translation> <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> av <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Prøveperioden er aktivert</translation> <translation id="2096012225669085171">Synkronisering og personlig tilpasning på alle enheter</translation> <translation id="2100273922101894616">Automatisk pålogging</translation> <translation id="2100314319871056947">Prøv å dele teksten i mindre deler</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Autofullfør søk og nettadresser</translation> <translation id="7707922173985738739">Bruk mobildata</translation> <translation id="7725024127233776428">Sider du setter som bokmerker, vises her</translation> -<translation id="7735637452482172701">Lås opp med skjermlås</translation> <translation id="7746457520633464754">For å oppdage farlige apper og nettsteder sender Chrome nettadressene til noen av sidene du besøker, begrenset systeminformasjon og noe sideinnhold til Google.</translation> <translation id="7757787379047923882">Tekst delt fra <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Velg dato og klokkeslett</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index f68bc7b..2ad4a21 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -963,7 +963,6 @@ <translation id="7704317875155739195">ସନ୍ଧାନ ଓ URLଗୁଡ଼ିକୁ ସ୍ୱଚାଳିତ ଭାବେ ସମ୍ପୂର୍ଣ୍ଣ ହେବାକୁ ଦିଅନ୍ତୁ</translation> <translation id="7707922173985738739">ମୋବାଇଲ୍ ଡାଟା ବ୍ୟବହାର କରନ୍ତୁ।</translation> <translation id="7725024127233776428">ଏଠାରେ ଆପଣ ବୁକ୍ମାର୍କ କରୁଥିବା ପୃଷ୍ଠା ଦେଖାଯାଏ</translation> -<translation id="7735637452482172701">ସ୍କ୍ରିନ୍ ଲକ୍ ସହ ଅନଲକ୍ କରନ୍ତୁ</translation> <translation id="7746457520633464754">ବିପଜ୍ଜନକ ଆପ୍ସ ଏବଂ ସାଇଟ୍ଗୁଡ଼ିକ ବିଷୟରେ ଜାଣିବା ପାଇଁ, Chrome ଏପରି କିଛି ପୃଷ୍ଠାର URLଗୁଡ଼ିକ ଯେଉଁଠାକୁ ଆପଣ ଯାଆନ୍ତି, ସୀମିତ ସିଷ୍ଟମ୍ ସୂଚନା ଏବଂ କିଛି ପୃଷ୍ଠାର ବିଷୟବସ୍ତୁ Googleକୁ ପଠାଇଥାଏ।</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" />ରୁ ଟେକ୍ସଟ୍ ସେୟାର୍ କରାଯାଇଛି</translation> <translation id="7761849928583394409">ତାରିଖ ଓ ସମୟ ବାଛନ୍ତୁ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index 49c2996..48e1683 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -591,6 +591,7 @@ <translation id="5222676887888702881">ਸਾਈਨ-ਆਊਟ ਕਰੋ</translation> <translation id="5230560987958996918"><ph name="SITE" /> ਦੀ ਨਜ਼ਦੀਕੀ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਲਈ ਸਕੈਨ ਕਰਨ ਦੀ ਇੱਛਾ ਹੈ, ਅੱਗੇ ਦਿੱਤੇ ਡੀਵਾਈਸ ਮਿਲੇ ਹਨ:</translation> <translation id="5233638681132016545">ਨਵੀਂ ਟੈਬ</translation> +<translation id="5250483651202458397">ਸਕ੍ਰੀਨਸ਼ਾਟ। ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।</translation> <translation id="526421993248218238">ਇਸ ਪੰਨੇ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation> <translation id="5271967389191913893">ਡੀਵਾਈਸ ਡਾਊਨਲੋਡ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਸਮੱਗਰੀ ਨੂੰ ਨਹੀਂ ਖੋਲ੍ਹ ਸਕਦਾ ਹੈ।</translation> <translation id="5292796745632149097">ਇਸ 'ਤੇ ਭੇਜੋ</translation> @@ -836,6 +837,7 @@ <translation id="6767294960381293877">ਟੈਬ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਵਾਲੇ ਡੀਵਾਈਸਾਂ ਦੀ ਸੂਚੀ ਅੱਧੀ ਉਚਾਈ 'ਤੇ ਖੁੱਲ੍ਹੀ ਹੋਈ ਹੈ।</translation> <translation id="6783942555455976443">ਇਸ ਪੰਨੇ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਪੜ੍ਹਣ ਲਈ ਰੱਖਿਅਤ ਕਰੋ ਅਤੇ ਇਸ ਲਈ ਇੱਕ ਯਾਦ-ਸੂਚਨਾ ਪ੍ਰਾਪਤ ਕਰੋ</translation> <translation id="6811034713472274749">ਦੇਖਣ ਲਈ ਪੰਨਾ ਤਿਆਰ ਹੈ</translation> +<translation id="6813446258015311409">Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ, ਖੋਲ੍ਹਿਆ ਗਿਆ।</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" /> ਟੈਬ ਨੂੰ ਚੁਣਿਆ ਗਿਆ</translation> <translation id="6833996806551876956">ਪਰਦੇਦਾਰੀ ਸੈਂਡਬਾਕਸ ਪਰਖ</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">ਸਵੈ-ਮੁਕੰਮਲ ਖੋਜਾਂ ਅਤੇ URLs</translation> <translation id="7707922173985738739">ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤੋ</translation> <translation id="7725024127233776428">ਤੁਹਾਡੇ ਵੱਲੋਂ ਬੁੱਕਮਾਰਕ ਕੀਤੇ ਪੰਨੇ ਇੱਥੇ ਦਿਖਾਈ ਦਿੰਦੇ ਹਨ</translation> -<translation id="7735637452482172701">ਸਕ੍ਰੀਨ ਲਾਕ ਨਾਲ ਅਣਲਾਕ ਕਰੋ</translation> <translation id="7746457520633464754">ਖਤਰਨਾਕ ਐਪਾਂ ਅਤੇ ਸਾਈਟਾਂ ਦਾ ਪਤਾ ਲਗਾਉਣ ਲਈ, Chrome ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੇ ਕੁਝ ਪੰਨਿਆਂ ਦੇ URL, ਸੀਮਤ ਸਿਸਟਮ ਜਾਣਕਾਰੀ ਅਤੇ ਕੁਝ ਪੰਨਾ ਸਮੱਗਰੀ Google ਨੂੰ ਭੇਜਦਾ ਹੈ</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> ਤੋਂ ਸਾਂਝੀ ਕੀਤੀ ਲਿਖਤ</translation> <translation id="7761849928583394409">ਤਾਰੀਖ ਅਤੇ ਸਮਾਂ ਚੁਣੋ</translation> @@ -1097,6 +1098,7 @@ <translation id="8583805026567836021">ਖਾਤੇ ਦਾ ਡਾਟਾ ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="8587585930972369234">ਖੋਜਣ ਲਈ ਸਪਰਸ਼ ਕਰਕੇ ਰੱਖੋ</translation> <translation id="860043288473659153">ਕਾਰਡਧਾਰਕ ਦਾ ਨਾਮ</translation> +<translation id="8602358303461588329">Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ, ਬੰਦ ਕੀਤਾ ਗਿਆ।</translation> <translation id="860282621117673749">ਕੀਮਤ ਘਟਣ ਦੀਆਂ ਸੁਚੇਤਨਾਵਾਂ</translation> <translation id="8616006591992756292">ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 'ਤੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਦੀਆਂ ਹੋਰ ਕਿਸਮਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ।</translation> <translation id="8617240290563765734">ਕੀ ਡਾਊਨਲੋਡ ਕੀਤੀ ਸਮੱਗਰੀ ਵਿੱਚ ਦੱਸੇ ਗਏ ਸੁਝਾਏ URLਖੋਲ੍ਹਣੇ ਹਨ?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index dcbb169..55df426 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Drukuj</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" />: nie udało się udostępnić</translation> <translation id="1477626028522505441">Nie udało się pobrać pliku <ph name="FILE_NAME" /> z powodu problemów z serwerem.</translation> +<translation id="1497470209855416291">Okres próbny jest wyłączony</translation> <translation id="1506061864768559482">Wyszukiwarka</translation> <translation id="1513352483775369820">Zakładki i historia online</translation> <translation id="1513858653616922153">Usuń hasło</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Obejrzyj następny film</translation> <translation id="2074143993849053708">Ekran wyrażenia zgody na wyszukiwanie głosowe z pomocą Asystenta został zamknięty</translation> <translation id="2082238445998314030">Wynik <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Włączony jest okres próbny</translation> <translation id="2096012225669085171">Synchronizacja i personalizacja na urządzeniach</translation> <translation id="2100273922101894616">Automatyczne logowanie</translation> <translation id="2100314319871056947">Spróbuj udostępnić mniejsze fragmenty tekstu</translation> @@ -962,7 +964,6 @@ <translation id="7704317875155739195">Autouzupełniaj wyszukiwania i adresy URL</translation> <translation id="7707922173985738739">Użycie mobilnej transmisji danych</translation> <translation id="7725024127233776428">Tutaj pojawią się strony, które dodasz do zakładek</translation> -<translation id="7735637452482172701">Odblokuj za pomocą blokady ekranu</translation> <translation id="7746457520633464754">Aby wykrywać niebezpieczne aplikacje i witryny, Chrome wysyła do Google adresy URL i część zawartości niektórych odwiedzanych przez Ciebie stron, a także niektóre informacje o systemie</translation> <translation id="7757787379047923882">Tekst udostępniony z urządzenia <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Wybierz datę i godzinę</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index 1863eddd..3626fc7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Imprimir</translation> <translation id="1450753235335490080">Falha no compartilhamento de <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Falha no download do arquivo <ph name="FILE_NAME" /> devido a problemas de servidor.</translation> +<translation id="1497470209855416291">O teste está desativado</translation> <translation id="1506061864768559482">Mecanismo de pesquisa</translation> <translation id="1513352483775369820">Favoritos e histórico da Web</translation> <translation id="1513858653616922153">Excluir senha</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Assistir ao próximo vídeo</translation> <translation id="2074143993849053708">IU de consentimento para a pesquisa por voz do Assistente fechada</translation> <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">O teste está ativado</translation> <translation id="2096012225669085171">Sincronizar e personalizar vários dispositivos</translation> <translation id="2100273922101894616">Login automático</translation> <translation id="2100314319871056947">Tente compartilhar o texto em segmentos menores</translation> @@ -965,7 +967,6 @@ <translation id="7704317875155739195">Preencher automaticamente pesquisas e URLs</translation> <translation id="7707922173985738739">Usar dados móveis</translation> <translation id="7725024127233776428">As páginas favoritas são exibidas aqui</translation> -<translation id="7735637452482172701">Desbloquear com o bloqueio de tela</translation> <translation id="7746457520633464754">Para detectar apps e sites perigosos, o Chrome envia para o Google URLs de algumas páginas visitadas, informações limitadas do sistema e um pouco do conteúdo da página</translation> <translation id="7757787379047923882">Texto compartilhado por <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Escolher data e hora</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index 28cc9af..99fe3ad1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Imprimir</translation> <translation id="1450753235335490080">Não é possível partilhar <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">A transferência de <ph name="FILE_NAME" /> falhou devido a problemas do servidor.</translation> +<translation id="1497470209855416291">A avaliação está desativada</translation> <translation id="1506061864768559482">Motor de pesquisa</translation> <translation id="1513352483775369820">Marcadores e histórico da Web</translation> <translation id="1513858653616922153">Eliminar palavra-passe</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Ver vídeo seguinte</translation> <translation id="2074143993849053708">IU de consentimento da pesquisa por voz do Assistente fechada</translation> <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">A avaliação está ativada</translation> <translation id="2096012225669085171">Sincronizar e personalizar entre dispositivos</translation> <translation id="2100273922101894616">Início de sessão automático</translation> <translation id="2100314319871056947">Experimente partilhar o texto em partes mais pequenas.</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Pesquisas de preenchimento automático e URLs</translation> <translation id="7707922173985738739">Utilizar dados móveis</translation> <translation id="7725024127233776428">As páginas que adiciona aos marcadores aparecem aqui.</translation> -<translation id="7735637452482172701">Desbloquear com bloqueio de ecrã</translation> <translation id="7746457520633464754">Para detetar aplicações e sites perigosos, o Chrome envia para a Google URLs de algumas páginas que visita, informações limitadas do sistema e algum conteúdo das páginas.</translation> <translation id="7757787379047923882">Texto partilhado a partir do dispositivo <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Escolher data e hora</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 50bfdbe..366a816 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Printează</translation> <translation id="1450753235335490080">Nu se poate trimite <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Descărcarea fișierului <ph name="FILE_NAME" /> nu a reușit din cauza unor probleme de server.</translation> +<translation id="1497470209855416291">Versiunea de încercare este dezactivată</translation> <translation id="1506061864768559482">Motor de căutare</translation> <translation id="1513352483775369820">Marcaje și istoric web</translation> <translation id="1513858653616922153">Șterge parola</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Urmărește videoclipul următor</translation> <translation id="2074143993849053708">IU pentru consimțirea la căutarea vocală cu ajutorul Asistentului, închisă</translation> <translation id="2082238445998314030">Rezultatul <ph name="RESULT_NUMBER" /> din <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Versiunea de încercare este activată</translation> <translation id="2096012225669085171">Sincronizează și personalizează pe toate dispozitivele</translation> <translation id="2100273922101894616">Conectare automată</translation> <translation id="2100314319871056947">Împarte textul în fragmente mai mici</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Completează automat căutările și adresele URL</translation> <translation id="7707922173985738739">va folosi datele mobile;</translation> <translation id="7725024127233776428">Paginile pe care le marchezi apar aici</translation> -<translation id="7735637452482172701">Deblochează folosind blocarea ecranului</translation> <translation id="7746457520633464754">Pentru a detecta aplicațiile și site-urile periculoase, Chrome trimite la Google adresele URL ale unor pagini pe care le accesezi, informații de sistem limitate și o parte din conținutul paginii</translation> <translation id="7757787379047923882">Text trimis de pe <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Alege data și ora</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index 65bc52e..0be85a2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Печать</translation> <translation id="1450753235335490080">Не удается отправить: <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Не удалось скачать файл <ph name="FILE_NAME" /> из-за неполадок на сервере.</translation> +<translation id="1497470209855416291">Пробная версия отключена</translation> <translation id="1506061864768559482">Поисковая система</translation> <translation id="1513352483775369820">Закладки и история поиска</translation> <translation id="1513858653616922153">Удалить пароль</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Смотреть следующее видео</translation> <translation id="2074143993849053708">Окно, где требуется разрешить использование Ассистента для голосового поиска, закрыто</translation> <translation id="2082238445998314030">Результат <ph name="RESULT_NUMBER" />, всего <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Пробная версия включена</translation> <translation id="2096012225669085171">Синхронизация и персонализация данных на всех устройствах</translation> <translation id="2100273922101894616">Автоматический вход</translation> <translation id="2100314319871056947">Перед отправкой разбейте текст на несколько частей.</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Заполнять поисковые запросы и URL автоматически</translation> <translation id="7707922173985738739">Использовать мобильный Интернет</translation> <translation id="7725024127233776428">Здесь будут страницы, которые вы добавляете в закладки.</translation> -<translation id="7735637452482172701">Использовать разблокировку экрана</translation> <translation id="7746457520633464754">Для обнаружения опасных приложений и сайтов Chrome отправляет в Google URL некоторых страниц, которые вы открываете, контент на них, а также определенные сведения о системе</translation> <translation id="7757787379047923882">Текст с устройства <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Выбрать дату и время</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index 5fee30c..0a14948 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">මුද්රණය කරන්න</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> බෙදා ගත නොහැක</translation> <translation id="1477626028522505441">සේවාදායකයේ දෝෂ නිසා <ph name="FILE_NAME" /> බාගැනීම අසාර්ථක විය.</translation> +<translation id="1497470209855416291">අත්හදා බැලීම අබලයි</translation> <translation id="1506061864768559482">සෙවුම් යන්ත්රය</translation> <translation id="1513352483775369820">පිටුසන් සහ වෙබ් ඉතිහාසය</translation> <translation id="1513858653616922153">මුරපදය මකන්න</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">ඊළඟ වීඩියෝව නරඹන්න</translation> <translation id="2074143993849053708">සහායක හඬ සෙවීම් අනුමත ui වසන ලදි</translation> <translation id="2082238445998314030">ප්රතිඵල <ph name="TOTAL_RESULTS" /> කින් <ph name="RESULT_NUMBER" /></translation> +<translation id="2083113399121613785">අත්හදා බැලීම සබලයි</translation> <translation id="2096012225669085171">උපාංග හරහා සමමුහුර්ත සහ පුද්ගලිකකරණය කරන්න</translation> <translation id="2100273922101894616">ස්වයංක්රිය පුරනය වන්න</translation> <translation id="2100314319871056947">පාඨය කුඩා කැබලි ලෙස බෙදා ගැනීමට උත්සාහ කරන්න</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">සෙවීම් සහ URL ලිපින ස්වයංව සම්පූර්ණ කරන්න</translation> <translation id="7707922173985738739">ජංගම දත්ත භාවිත කරන්න</translation> <translation id="7725024127233776428">ඔබ පිටුසන් කරන පිටු මෙහි දිස් වෙති</translation> -<translation id="7735637452482172701">තිර අගුල සමගින් අගුලු හරින්න</translation> <translation id="7746457520633464754">අනතුරුදායක යෙදුම් සහ වෙබ් අඩවි අනාවරණ කිරීමට, Chrome විසින් ඔබ පැමිණෙන සමහර පිටුවල URL, සීමිත පද්ධති තොරතුරු, සහ සමහර පිටු අන්තර්ගතය Google වෙත යවනු ලැබේ</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> වෙතින් බෙදා ගත් පාඨය</translation> <translation id="7761849928583394409">දිනය සහ වේලාව තෝරන්න</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 70cc38b9..d265464f 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Tlačiť</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> sa nedá zdieľať</translation> <translation id="1477626028522505441">Súbor <ph name="FILE_NAME" /> sa nepodarilo stiahnuť z dôvodu problémov so serverom.</translation> +<translation id="1497470209855416291">Skúšobné obdobie nie je aktívne</translation> <translation id="1506061864768559482">Vyhľadávač</translation> <translation id="1513352483775369820">Záložky a webová história</translation> <translation id="1513858653616922153">Odstrániť heslo</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Pozrieť ďalšie video</translation> <translation id="2074143993849053708">Používateľské rozhranie na udelenie súhlasu s hlasovým vyhľadávaním Asistentom je zatvorené</translation> <translation id="2082238445998314030">Výsledok <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Skúšobné obdobie je aktívne</translation> <translation id="2096012225669085171">Synchronizovať a prispôsobiť v rôznych zariadeniach</translation> <translation id="2100273922101894616">Automaticky prihlasovať</translation> <translation id="2100314319871056947">Skúste text zdieľať po menších častiach</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Automaticky dopĺňať vyhľadávania a webové adresy</translation> <translation id="7707922173985738739">Používať mobilné dáta</translation> <translation id="7725024127233776428">Tu sa zobrazia vaše stránky uložené ako záložky</translation> -<translation id="7735637452482172701">Odomknúť zámkou obrazovky</translation> <translation id="7746457520633464754">Chrome odosiela Googlu webové adresy niektorých navštívených stránok, obmedzené informácie o systéme a obsah niektorých stránok na účely rozpoznávania nebezpečných aplikácií a webov.</translation> <translation id="7757787379047923882">Text zdieľaný zo zariadenia <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Vybrať dátum a čas</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index 652acf6a..1ff95e5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Natisni</translation> <translation id="1450753235335490080">Ni mogoče deliti tega: <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Prenos datoteke <ph name="FILE_NAME" /> ni uspel zaradi težav s strežnikom.</translation> +<translation id="1497470209855416291">Preizkus je onemogočen</translation> <translation id="1506061864768559482">Iskalnik</translation> <translation id="1513352483775369820">Zaznamki in spletna zgodovina</translation> <translation id="1513858653616922153">Izbris gesla</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Ogled naslednjega videoposnetka</translation> <translation id="2074143993849053708">Uporabniški vmesnik za soglasje za glasovno iskanje v Pomočniku zaprt.</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. rezultat od <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Preizkus je omogočen</translation> <translation id="2096012225669085171">Sinhronizacija in prilagajanje med napravami</translation> <translation id="2100273922101894616">Samodejna prijava</translation> <translation id="2100314319871056947">Poskusite deliti besedilo v manjših kosih</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Samodejno dokončanje iskanj in URL-jev</translation> <translation id="7707922173985738739">Uporaba prenosa podatkov v mobilnem omrežju</translation> <translation id="7725024127233776428">Strani, ki jih dodate med zaznamke, so prikazane tukaj</translation> -<translation id="7735637452482172701">Odkleni z zaklepanjem zaslona</translation> <translation id="7746457520633464754">Zaradi zaznavanja nevarnih aplikacij in spletnih mest Chrome Googlu pošlje URL-je nekaterih strani, ki jih obiščete, omejene podatke o sistemu in vsebino nekaterih strani</translation> <translation id="7757787379047923882">Besedilo v skupni rabi iz naprave <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Izberi datum in uro</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index 46cae497d6..a553cb8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Printo</translation> <translation id="1450753235335490080">Nuk mund të ndahet <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Shkarkimi i <ph name="FILE_NAME" /> dështoi për shkak të problemeve të serverit.</translation> +<translation id="1497470209855416291">Prova është çaktivizuar</translation> <translation id="1506061864768559482">Motori i kërkimit</translation> <translation id="1513352483775369820">Faqeshënuesit dhe historiku i uebit</translation> <translation id="1513858653616922153">Fshi fjalëkalimin</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Shiko videon tjetër</translation> <translation id="2074143993849053708">Ndërfaqja e përdoruesit e miratimit të kërkimit zanor të "Asistentit" e mbyllur</translation> <translation id="2082238445998314030">Rezultati <ph name="RESULT_NUMBER" /> nga <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Prova është aktivizuar</translation> <translation id="2096012225669085171">Sinkronizo e personalizo përmes pajisjeve</translation> <translation id="2100273922101894616">Identifikohu automatikisht</translation> <translation id="2100314319871056947">Provo ta ndash tekstin në copëza më të vogla</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Plotësimi automatik i kërkimeve dhe i URL-ve</translation> <translation id="7707922173985738739">Përdor të dhënat celulare</translation> <translation id="7725024127233776428">Faqet që shënon shfaqen këtu</translation> -<translation id="7735637452482172701">Shkyçe me "Kyçjen e ekranit"</translation> <translation id="7746457520633464754">Për të zbuluar aplikacionet dhe sajtet e rrezikshme, Chrome dërgon URL-të e disa faqeve që viziton, informacione të kufizuara të sistemit dhe disa përmbajtje faqesh te Google</translation> <translation id="7757787379047923882">Teksti u nda nga <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Zgjidh datën dhe orën</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 aefce042..2188cdc 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Štampaj</translation> <translation id="1450753235335490080">Nije uspelo deljenje: <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Preuzimanje datoteke <ph name="FILE_NAME" /> nije uspelo zbog problema na serveru.</translation> +<translation id="1497470209855416291">Proba je onemogućena</translation> <translation id="1506061864768559482">Pretraživač</translation> <translation id="1513352483775369820">Obeleživači i veb-istorija</translation> <translation id="1513858653616922153">Izbriši lozinku</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Gledajte sledeći video</translation> <translation id="2074143993849053708">Korisnički interfejs za saglasnost za glasovnu pretragu Pomoćnika je zatvoren</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. od <ph name="TOTAL_RESULTS" /> rezultata</translation> +<translation id="2083113399121613785">Proba je omogućena</translation> <translation id="2096012225669085171">Sinhronizacija i personalizacija na svim uređajima</translation> <translation id="2100273922101894616">Automatsko prijavljivanje</translation> <translation id="2100314319871056947">Probajte da delite tekst u manjim delovima</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Automatski dovršavaj pretrage i URL-ove</translation> <translation id="7707922173985738739">Koristi mobilne podatke</translation> <translation id="7725024127233776428">Stranice koje obeležite se prikazuju ovde</translation> -<translation id="7735637452482172701">Otključaj pomoću Zaključavanja ekrana</translation> <translation id="7746457520633464754">Da bi otkrivao opasne aplikacije i sajtove, Chrome šalje Google-u URL-ove nekih stranica koje posećujete, ograničene informacije o sistemu i određeni sadržaj stranica</translation> <translation id="7757787379047923882">Tekst deljen sa uređaja <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Izaberite datum i vreme</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 796169d2..c179b1a4 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
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Штампај</translation> <translation id="1450753235335490080">Није успело дељење: <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Преузимање датотеке <ph name="FILE_NAME" /> није успело због проблема на серверу.</translation> +<translation id="1497470209855416291">Проба је онемогућена</translation> <translation id="1506061864768559482">Претраживач</translation> <translation id="1513352483775369820">Обележивачи и веб-историја</translation> <translation id="1513858653616922153">Избриши лозинку</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Гледајте следећи видео</translation> <translation id="2074143993849053708">Кориснички интерфејс за сагласност за гласовну претрагу Помоћника је затворен</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. од <ph name="TOTAL_RESULTS" /> резултата</translation> +<translation id="2083113399121613785">Проба је омогућена</translation> <translation id="2096012225669085171">Синхронизација и персонализација на свим уређајима</translation> <translation id="2100273922101894616">Аутоматско пријављивање</translation> <translation id="2100314319871056947">Пробајте да делите текст у мањим деловима</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Аутоматски довршавај претраге и URL-ове</translation> <translation id="7707922173985738739">Користи мобилне податке</translation> <translation id="7725024127233776428">Странице које обележите се приказују овде</translation> -<translation id="7735637452482172701">Откључај помоћу Закључавања екрана</translation> <translation id="7746457520633464754">Да би откривао опасне апликације и сајтове, Chrome шаље Google-у URL-ове неких страница које посећујете, ограничене информације о систему и одређени садржај страница</translation> <translation id="7757787379047923882">Текст дељен са уређаја <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Изаберите датум и време</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index 4ab69d9..9087aab 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Skriv ut</translation> <translation id="1450753235335490080">Det gick inte att dela <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Det gick inte att ladda ned <ph name="FILE_NAME" /> på grund av serverfel.</translation> +<translation id="1497470209855416291">Provperioden har inaktiverats</translation> <translation id="1506061864768559482">Sökmotor</translation> <translation id="1513352483775369820">Bokmärken och webbhistorik</translation> <translation id="1513858653616922153">Radera lösenord</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Titta på nästa video</translation> <translation id="2074143993849053708">Användargränssnittet för samtycke till röstsökning med assistenten har stängts</translation> <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> av <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Provperioden har aktiverats</translation> <translation id="2096012225669085171">Synkronisera och anpassa på alla enheter</translation> <translation id="2100273922101894616">Automatisk inloggning</translation> <translation id="2100314319871056947">Testa att dela upp texten i mindre bitar</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Autoslutför sökningar och webbadresser</translation> <translation id="7707922173985738739">Mobildata används</translation> <translation id="7725024127233776428">Sidor som infogats som bokmärke visas här</translation> -<translation id="7735637452482172701">Lås upp med skärmlås</translation> <translation id="7746457520633464754">För att kunna upptäcka farliga appar och webbplatser skickar Chrome webbadresser till vissa sidor som du besöker, vissa systemuppgifter och visst sidinnehåll till Google</translation> <translation id="7757787379047923882">Texten delades från <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Välj datum och tid</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index 56e5921..a0da328 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Chapisha</translation> <translation id="1450753235335490080">Imeshindwa kushiriki <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Kipakuliwa cha <ph name="FILE_NAME" /> hakijafaulu kwa sababu ya matatizo ya seva.</translation> +<translation id="1497470209855416291">Jaribio limezimwa</translation> <translation id="1506061864768559482">Mtambo wa utafutaji</translation> <translation id="1513352483775369820">Alamisho na historia ya wavuti</translation> <translation id="1513858653616922153">Futa nenosiri</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Tazama video inayofuata</translation> <translation id="2074143993849053708">Kiolesura cha idhini ya kutafuta kwa kutamka kupitia programu ya Mratibu kimefungwa</translation> <translation id="2082238445998314030">Tokeo <ph name="RESULT_NUMBER" /> kati ya <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Jaribio limewashwa</translation> <translation id="2096012225669085171">Sawazisha na uweke mapendeleo kwenye vifaa vyote</translation> <translation id="2100273922101894616">Ingia katika Akaunti Kiotomatiki</translation> <translation id="2100314319871056947">Jaribu kushiriki maandishi katika sehemu ndogo ndogo</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Jaza kiotomatiki URL na hoja za utafutaji</translation> <translation id="7707922173985738739">Tumia data ya mtandao wa simu</translation> <translation id="7725024127233776428">Kurasa unazoalamisha zitaonekana hapa</translation> -<translation id="7735637452482172701">Fungua kwa kutumia kipengele cha Kufunga Skrini</translation> <translation id="7746457520633464754">Ili kutambua programu na tovuti hatari, Chrome hutuma URL za baadhi ya kurasa unazotembelea. maelezo machache ya mfumo na maudhui ya ukurasa kwa Google</translation> <translation id="7757787379047923882">Maandishi yameshirikiwa kutoka <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Chagua tarehe na saa</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb index 895988f..5149301 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -591,6 +591,7 @@ <translation id="5222676887888702881">வெளியேறு</translation> <translation id="5230560987958996918">அருகிலுள்ள புளூடூத் சாதனங்களை <ph name="SITE" /> ஸ்கேன் செய்ய விரும்புகிறது. இவை கண்டறியப்பட்டுள்ளன:</translation> <translation id="5233638681132016545">புதிய தாவல்</translation> +<translation id="5250483651202458397">ஸ்கிரீன்ஷாட். மூடுவதற்குத் தட்டவும்.</translation> <translation id="526421993248218238">பக்கத்தை ஏற்ற முடியவில்லை</translation> <translation id="5271967389191913893">பதிவிறக்க வேண்டிய உள்ளடக்கத்தைச் சாதனத்தால் திறக்க முடியாது</translation> <translation id="5292796745632149097">இதற்கு அனுப்பு:</translation> @@ -836,6 +837,7 @@ <translation id="6767294960381293877">தாவலைப் பகிர்வதற்கான சாதனங்களின் பட்டியல் திரையின் பாதி அளவிற்குத் திறக்கப்பட்டுள்ளது.</translation> <translation id="6783942555455976443">இதைப் பின்னர் பார்ப்பதற்குச் சேமித்து அதற்கான நினைவூட்டலைப் பெறலாம்</translation> <translation id="6811034713472274749">பக்கத்தைப் பார்க்கலாம்</translation> +<translation id="6813446258015311409">Chromeமில் உள்நுழைக, திறக்கப்பட்டுள்ளது.</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" /> தாவல் தேர்ந்தெடுக்கப்பட்டது</translation> <translation id="6833996806551876956">தனியுரிமை சாண்ட்பாக்ஸ் இலவச உபயோகக் காலம்</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">தேடல்களையும் URLகளையும் தானே நிரப்பு</translation> <translation id="7707922173985738739">மொபைல் டேட்டாவைப் பயன்படுத்து</translation> <translation id="7725024127233776428">நீங்கள் புக்மார்க் செய்த பக்கங்கள் இங்கு தோன்றும்</translation> -<translation id="7735637452482172701">திரைப் பூட்டு மூலம் திற</translation> <translation id="7746457520633464754">ஆபத்தான ஆப்ஸையும் தளங்களையும் கண்டறிய நீங்கள் பார்வையிட்ட சில பக்கங்களின் URLகளையும், வரம்பிற்குட்பட்ட சிஸ்டம் தகவல்களையும், சில பக்கங்களின் உள்ளடக்கத்தையும் Googleளுக்கு Chrome அனுப்பும்</translation> <translation id="7757787379047923882">உரை <ph name="DEVICE_NAME" /> இலிருந்து பகிரப்பட்டுள்ளது</translation> <translation id="7761849928583394409">தேதியையும் நேரத்தையும் தேர்வுசெய்யுங்கள்</translation> @@ -1097,6 +1098,7 @@ <translation id="8583805026567836021">கணக்குத் தரவை அழிக்கிறது</translation> <translation id="8587585930972369234">தேட, தொட்டுப் பிடிக்கவும்</translation> <translation id="860043288473659153">கார்டு உரிமையாளரின் பெயர்</translation> +<translation id="8602358303461588329">Chromeமில் உள்நுழைக, மூடப்பட்டுள்ளது.</translation> <translation id="860282621117673749">விலைச் சரிவு குறித்த விழிப்பூட்டல்கள்</translation> <translation id="8616006591992756292">உங்கள் Google கணக்கு, <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> என்ற இணைப்பில் உலாவல் வரலாறு தொடர்பான பிற தகவல்களைக் கொண்டிருக்கக்கூடும்.</translation> <translation id="8617240290563765734">பதிவிறக்கிய உள்ளடக்கத்தில் குறிப்பிட்ட பரிந்துரைக்கப்பட்ட URLஐத் திறக்கவா?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb index 62b5e43..9f3535b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -591,6 +591,7 @@ <translation id="5222676887888702881">సైన్ ఔట్</translation> <translation id="5230560987958996918"><ph name="SITE" /> సమీపంలోని బ్లూటూత్ పరికరాల కోసం స్కాన్ చేయాలనుకుంటోంది. కింది పరికరాలు కనుగొనబడ్డాయి:</translation> <translation id="5233638681132016545">కొత్త టాబ్</translation> +<translation id="5250483651202458397">స్క్రీన్షాట్. మూసివేయడానికి ట్యాప్ చేయండి.</translation> <translation id="526421993248218238">ఈ పేజీని లోడ్ చేయడం సాధ్యం కాదు</translation> <translation id="5271967389191913893">పరికరం డౌన్లోడ్ చేయాల్సిన కంటెంట్ను తెరవలేదు.</translation> <translation id="5292796745632149097">ఈ పరికరానికి పంపండి</translation> @@ -836,6 +837,7 @@ <translation id="6767294960381293877">ట్యాబ్ను షేర్ చేయాల్సిన పరికరాల జాబితా సగం ఎత్తులో తెరవబడింది.</translation> <translation id="6783942555455976443">ఈ పేజీని తర్వాత కోసం సేవ్ చేసి, ఒక రిమైండర్ను పొందండి</translation> <translation id="6811034713472274749">పేజీ వీక్షించడానికి సిద్ధంగా ఉంది</translation> +<translation id="6813446258015311409">Chromeకు సైన్ ఇన్ చేయండి, తెరవబడింది.</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, ట్యాబ్ను ఎంచుకున్నారు</translation> <translation id="6833996806551876956">గోప్యతా శాండ్బాక్స్ ట్రయల్</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">ఆటో-ఫిల్ సెర్చ్లు, URLలు</translation> <translation id="7707922173985738739">మొబైల్ డేటాను ఉపయోగిస్తుంది</translation> <translation id="7725024127233776428">మీరు బుక్మార్క్ చేసే పేజీలు ఇక్కడ కనిపిస్తాయి</translation> -<translation id="7735637452482172701">స్క్రీన్ లాక్తో అన్లాక్ చేయి</translation> <translation id="7746457520633464754">Chrome ప్రమాదకరమైన యాప్లు, సైట్లను గుర్తించడానికి, మీరు సందర్శించే కొన్ని పేజీల URLలు, పరిమిత సిస్టమ్ సమాచారం, కొంత పేజీ కంటెంట్ను Googleకు పంపుతుంది</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> నుండి షేర్ చేయబడిన వచనం</translation> <translation id="7761849928583394409">తేదీ, సమయం ఎంచుకోండి</translation> @@ -1097,6 +1098,7 @@ <translation id="8583805026567836021">ఖాతా డేటాను క్లియర్ చేస్తోంది</translation> <translation id="8587585930972369234">సెర్చ్ చేయడానికి నొక్కి, పట్టుకోండి</translation> <translation id="860043288473659153">కార్డుదారుని పేరు</translation> +<translation id="8602358303461588329">Chromeకు సైన్ ఇన్ చేయండి, మూసివేయబడింది.</translation> <translation id="860282621117673749">ధర తగ్గింపు అలర్ట్లు</translation> <translation id="8616006591992756292">మీ Google ఖాతా <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />లో ఇతర రూపాల్లో ఉన్న బ్రౌజింగ్ చరిత్రను కలిగి ఉండవచ్చు.</translation> <translation id="8617240290563765734">డౌన్లోడ్ చేసిన కంటెంట్లో పేర్కొన్న సూచిత URLని తెరవాలా?</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 2bbb655..bec0477 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
@@ -964,7 +964,6 @@ <translation id="7704317875155739195">เติมข้อความค้นหาและ URL อัตโนมัติ</translation> <translation id="7707922173985738739">ใช้เน็ตมือถือ</translation> <translation id="7725024127233776428">หน้าที่คุณบุ๊กมาร์กไว้จะปรากฏที่นี่</translation> -<translation id="7735637452482172701">ปลดล็อกด้วยการล็อกหน้าจอ</translation> <translation id="7746457520633464754">ในการตรวจหาแอปและเว็บไซต์ที่เป็นอันตราย Chrome จะส่ง URL ของหน้าบางหน้าที่คุณเข้าชม ข้อมูลระบบที่จำกัด และเนื้อหาบางส่วนของหน้าไปให้ Google</translation> <translation id="7757787379047923882">ข้อความที่แชร์จาก <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">เลือกวันที่และเวลา</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index 7fcc956..7d35b95 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Yazdır</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> paylaşılamıyor</translation> <translation id="1477626028522505441">Sunucu sorunları nedeniyle <ph name="FILE_NAME" /> dosyası indirilemedi.</translation> +<translation id="1497470209855416291">Deneme sürümü devre dışı bırakıldı</translation> <translation id="1506061864768559482">Arama motoru</translation> <translation id="1513352483775369820">Yer işaretleri ve web geçmişi</translation> <translation id="1513858653616922153">Şifreyi sil</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Sonraki videoyu izle</translation> <translation id="2074143993849053708">Asistan sesli arama izni kullanıcı arayüzü kapalı</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> sonuçtan <ph name="RESULT_NUMBER" /> numaralı sonuç</translation> +<translation id="2083113399121613785">Deneme sürümü etkinleştirildi</translation> <translation id="2096012225669085171">Cihazlar arasında senkronizasyon ve kişiselleştirme</translation> <translation id="2100273922101894616">Otomatik Oturum Aç</translation> <translation id="2100314319871056947">Metni daha küçük parçalar halinde paylaşmayı deneyin</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Aramaları ve URL'leri otomatik tamamla</translation> <translation id="7707922173985738739">Mobil veri kullanın</translation> <translation id="7725024127233776428">Yer işareti koyduğunuz sayfalar burada görünür</translation> -<translation id="7735637452482172701">Kilidi, Ekran Kilidi ile aç</translation> <translation id="7746457520633464754">Chrome, tehlikeli uygulamaları ve siteleri algılamak için Google'a ziyaret ettiğiniz bazı sitelerin URL'lerini, sınırlı sistem bilgisini ve bazı sayfa içeriklerini gönderir.</translation> <translation id="7757787379047923882">Metin, <ph name="DEVICE_NAME" /> cihazından paylaşıldı</translation> <translation id="7761849928583394409">Tarih ve saat seçin</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index bd1f6a6..61a0691e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Друк</translation> <translation id="1450753235335490080">Не вдалося надіслати: <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Файл <ph name="FILE_NAME" /> не завантажено через проблеми із сервером.</translation> +<translation id="1497470209855416291">Пробну версію вимкнено</translation> <translation id="1506061864768559482">Пошукова система</translation> <translation id="1513352483775369820">Закладки й історія веб-пошуку</translation> <translation id="1513858653616922153">Видалити пароль</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Дивитися наступне відео</translation> <translation id="2074143993849053708">Інтерфейс надання згоди на голосовий пошук через Асистента закрито</translation> <translation id="2082238445998314030">Результат <ph name="RESULT_NUMBER" /> з <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Пробну версію ввімкнено</translation> <translation id="2096012225669085171">Синхронізація та персоналізація на всіх пристроях</translation> <translation id="2100273922101894616">Автоматичний вхід</translation> <translation id="2100314319871056947">Спробуйте надіслати текст меншими частинами</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Автоматично завершувати пошукові запити та URL-адреси</translation> <translation id="7707922173985738739">Використовувати мобільне передавання даних</translation> <translation id="7725024127233776428">Сторінки, для яких ви робите закладки, з'являються тут</translation> -<translation id="7735637452482172701">Розблокувати через функцію блокування екрана</translation> <translation id="7746457520633464754">Щоб виявляти небезпечні додатки й сайти, Chrome надсилає URL-адреси певних відвіданих сторінок, обмежену системну інформацію та вміст деяких сторінок у Google</translation> <translation id="7757787379047923882">Текст, надісланий із пристрою <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Вибрати дату й час</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index cbd6be5..2be42c1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -591,6 +591,7 @@ <translation id="5222676887888702881">سائن آؤٹ</translation> <translation id="5230560987958996918"><ph name="SITE" /> قریبی بلوٹوتھ آلات کے لیے اسکین کرنا چاہتی ہے، مندرجہ ذیل آلات ملے ہیں:</translation> <translation id="5233638681132016545">نیا ٹیب</translation> +<translation id="5250483651202458397">اسکرین شاٹ۔ بند کرنے کے لئے تھپتھپائیں۔</translation> <translation id="526421993248218238">اس صفحہ کو لوڈ نہیں کیا جا سکتا</translation> <translation id="5271967389191913893">آلہ ڈاؤن لوڈ کیے جانے والے مواد کو نہیں کھول سکتا۔</translation> <translation id="5292796745632149097">اس پر بھیجیں</translation> @@ -836,6 +837,7 @@ <translation id="6767294960381293877">ان آلات کی فہرست جن کے ساتھ ٹیب کا اشتراک کرنا ہے نصف اونچائی پر کھلی ہوئی ہے۔</translation> <translation id="6783942555455976443">یہ صفحہ بعد کے لیے محفوظ کریں اور یاد دہانی حاصل کریں</translation> <translation id="6811034713472274749">صفحہ دیکھے جانے کیلئے تیار ہے</translation> +<translation id="6813446258015311409">کھولے گئے Chrome میں سائن ان کریں۔</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />، ٹیب منتخب ہو گیا</translation> <translation id="6833996806551876956">رازداری سینڈ باکس کا ٹرائل</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">تلاشوں اور URLs کی خودکار تکمیل کریں</translation> <translation id="7707922173985738739">موبائل ڈیٹا استعمال کریں</translation> <translation id="7725024127233776428">آپ کے بُک مارک کیے ہوئے صفحات یہاں دکھائی دیتے ہیں</translation> -<translation id="7735637452482172701">اسکرین لاک کے ساتھ غیر مقفل کریں</translation> <translation id="7746457520633464754">خطرناک ایپس اور سائٹس کا پتہ لگانے کیلئے، Chrome آپ کے ملاحظہ کئے جانے والے چند صفحات کے URLs، سسٹم کی محدود معلومات اور صفحے کا کچھ مواد Google کو بھیجتا ہے</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> سے ٹیکسٹ کا اشتراک کیا گیا ہے</translation> <translation id="7761849928583394409">تاریخ اور وقت منتخب کریں</translation> @@ -1097,6 +1098,7 @@ <translation id="8583805026567836021">اکاؤنٹ ڈیٹا صاف کرنا</translation> <translation id="8587585930972369234">تلاش کرنے کیلئے ٹچ کریں اور دبائے رکھیں</translation> <translation id="860043288473659153">کارڈ کے حامل کا نام</translation> +<translation id="8602358303461588329">بند کیے گئے Chrome میں سائن ان کریں۔</translation> <translation id="860282621117673749">قیمت میں کمی کے الرٹس</translation> <translation id="8616006591992756292">ممکن ہے کہ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> پر آپ کے Google اکاؤنٹ میں براؤزنگ کی سرگزشت کی دیگر شکلیں موجود ہوں۔</translation> <translation id="8617240290563765734">ڈاؤن لوڈ کردہ مواد میں بیان کیا گیا تجویز کردہ URL کھولیں؟</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb index a918657..bebce0b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Chop etish</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> yuborilmadi</translation> <translation id="1477626028522505441">Serverdagi turli muammolar tufayli “<ph name="FILE_NAME" />” fayli yuklab olinmadi.</translation> +<translation id="1497470209855416291">Sinov muddati yoqilmagan</translation> <translation id="1506061864768559482">Qidiruv tizimi</translation> <translation id="1513352483775369820">Xatcho‘plar va qidiruv tarixi</translation> <translation id="1513858653616922153">Parolni o‘chirish</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Keyingi videoni tomosha qilish</translation> <translation id="2074143993849053708">Assistent ovozli qidiruv paneli interfeysi yopildi</translation> <translation id="2082238445998314030">Natija: <ph name="RESULT_NUMBER" /> / <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Sinov muddati yoniq</translation> <translation id="2096012225669085171">Barcha qurilmalardagi sinxronizatsiya va shaxsiy sozlamalar</translation> <translation id="2100273922101894616">Avtomatik kirish</translation> <translation id="2100314319871056947">Yuboriladigan matnni biroz qisqartiring</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Qidiruv va URL manzillarning avtomatik kiritilishi</translation> <translation id="7707922173985738739">Mobil internetdan foydalanish</translation> <translation id="7725024127233776428">Xatchoʻplarga saqlanadigan sahifalar shu yerda chiqadi</translation> -<translation id="7735637452482172701">Ekran qulfini yechish</translation> <translation id="7746457520633464754">Xavfli ilova saytlarni aniqlashda Chrome siz tashrif buyuradigan saytlarning URL manzillari, tizim axboroti va ayrim sahifalardagi kontentlarni Google serverlariga yuboradi</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> qurilmasidan ulashilgan matn</translation> <translation id="7761849928583394409">Sana va vaqtni tanlang</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index 5161bb8..8e25c9a8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">In</translation> <translation id="1450753235335490080">Không thể chia sẻ <ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Tải xuống <ph name="FILE_NAME" /> không thành công do sự cố máy chủ.</translation> +<translation id="1497470209855416291">Bản dùng thử đang tắt</translation> <translation id="1506061864768559482">Công cụ tìm kiếm</translation> <translation id="1513352483775369820">Dấu trang và lịch sử web</translation> <translation id="1513858653616922153">Xóa mật khẩu</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Xem video tiếp theo</translation> <translation id="2074143993849053708">Giao diện người dùng cho phép sử dụng Trợ lý để tìm kiếm bằng giọng nói đã đóng</translation> <translation id="2082238445998314030">Kết quả <ph name="RESULT_NUMBER" /> trong tổng số <ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Bản dùng thử đang bật</translation> <translation id="2096012225669085171">Đồng bộ hóa và cá nhân hóa trên các thiết bị</translation> <translation id="2100273922101894616">Tự động đăng nhập</translation> <translation id="2100314319871056947">Hãy thử chia sẻ văn bản theo các đoạn nhỏ hơn</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Tự động hoàn thành cụm từ tìm kiếm và URL</translation> <translation id="7707922173985738739">Sử dụng dữ liệu di động</translation> <translation id="7725024127233776428">Các trang mà bạn đánh dấu sẽ xuất hiện tại đây</translation> -<translation id="7735637452482172701">Mở khóa bằng phương thức khóa màn hình</translation> <translation id="7746457520633464754">Để phát hiện các ứng dụng và trang web nguy hiểm, Chrome sẽ gửi URL của một số trang mà bạn truy cập, thông tin hệ thống giới hạn và một số nội dung trang cho Google</translation> <translation id="7757787379047923882">Văn bản được chia sẻ từ <ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Chọn ngày và giờ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index dc3c594..bbd06930d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">打印</translation> <translation id="1450753235335490080">无法分享<ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">未能成功下载 <ph name="FILE_NAME" />,因为服务器出现了问题。</translation> +<translation id="1497470209855416291">试用版已停用</translation> <translation id="1506061864768559482">搜索引擎</translation> <translation id="1513352483775369820">书签和网络历史记录</translation> <translation id="1513858653616922153">删除密码</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">观看下一个视频</translation> <translation id="2074143993849053708">针对 Google 助理语音搜索功能的用户意见征求界面已关闭</translation> <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 条结果,共 <ph name="TOTAL_RESULTS" /> 条</translation> +<translation id="2083113399121613785">试用版已启用</translation> <translation id="2096012225669085171">在所有设备上保持同步,获享个性化体验</translation> <translation id="2100273922101894616">自动登录</translation> <translation id="2100314319871056947">请尝试使用较小的文本块进行分享</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">自动补全搜索字词和网址</translation> <translation id="7707922173985738739">使用移动数据</translation> <translation id="7725024127233776428">您添加了书签的网页会显示在此处</translation> -<translation id="7735637452482172701">使用“屏幕锁定”功能解锁</translation> <translation id="7746457520633464754">为了检测危险应用和网站,Chrome 会将您所访问的部分网页的网址、有限的系统信息以及部分网页内容发送给 Google</translation> <translation id="7757787379047923882">分享自“<ph name="DEVICE_NAME" />”的文字</translation> <translation id="7761849928583394409">选择日期和时间</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 05f400b..4c91466 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">列印</translation> <translation id="1450753235335490080">無法分享<ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">伺服器發生問題,因此無法下載 <ph name="FILE_NAME" />。</translation> +<translation id="1497470209855416291">已停用試用</translation> <translation id="1506061864768559482">搜尋引擎</translation> <translation id="1513352483775369820">書籤和網頁記錄</translation> <translation id="1513858653616922153">刪除密碼</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">觀看下一段影片</translation> <translation id="2074143993849053708">「Google 助理」語音搜尋的同意使用者介面</translation> <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 項結果 (共 <ph name="TOTAL_RESULTS" /> 項)</translation> +<translation id="2083113399121613785">已啟用試用</translation> <translation id="2096012225669085171">在不同裝置上同步與個人化</translation> <translation id="2100273922101894616">自動登入</translation> <translation id="2100314319871056947">請嘗試將要分享的文字分為數個簡短片段</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">自動完成搜尋和網址</translation> <translation id="7707922173985738739">使用流動數據</translation> <translation id="7725024127233776428">加入書籤的網頁會在這裡顯示</translation> -<translation id="7735637452482172701">透過「螢幕鎖定」功能解鎖</translation> <translation id="7746457520633464754">為了偵測危險的應用程式和網站,Chrome 會將您瀏覽的部分網頁網址、有限的系統資料以及部分網頁內容傳送給 Google</translation> <translation id="7757787379047923882">透過 <ph name="DEVICE_NAME" /> 分享的文字</translation> <translation id="7761849928583394409">選擇日期和時間</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index d421036..5b051d3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">列印</translation> <translation id="1450753235335490080">無法分享<ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">伺服器發生問題,因此無法下載 <ph name="FILE_NAME" />。</translation> +<translation id="1497470209855416291">試用功能已停用</translation> <translation id="1506061864768559482">搜尋引擎</translation> <translation id="1513352483775369820">書籤與網頁記錄</translation> <translation id="1513858653616922153">刪除密碼</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">觀看下一部影片</translation> <translation id="2074143993849053708">Google 助理語音搜尋的同意使用者介面已關閉</translation> <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 個結果,共 <ph name="TOTAL_RESULTS" /> 個</translation> +<translation id="2083113399121613785">試用功能已啟用</translation> <translation id="2096012225669085171">讓多部裝置保持同步,並提供人化體驗</translation> <translation id="2100273922101894616">自動登入</translation> <translation id="2100314319871056947">請嘗試將要分享的文字分成多個片段</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">自動完成搜尋字詞與網址</translation> <translation id="7707922173985738739">使用行動數據</translation> <translation id="7725024127233776428">加入書籤的頁面會顯示在這裡</translation> -<translation id="7735637452482172701">使用螢幕鎖定功能解鎖</translation> <translation id="7746457520633464754">為了偵測危險的應用程式和網站,Chrome 會將你造訪的部分網頁網址、部分系統資訊以及部分網頁內容傳送給 Google</translation> <translation id="7757787379047923882">透過「<ph name="DEVICE_NAME" />」分享的文字</translation> <translation id="7761849928583394409">選擇日期和時間</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index 5ada0f1..a181023 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -72,6 +72,7 @@ <translation id="1430915738399379752">Phrinta</translation> <translation id="1450753235335490080">Ayikwazi ukwabelana nge-<ph name="CONTENT_TYPE" /></translation> <translation id="1477626028522505441">Ukulandwa kwe-<ph name="FILE_NAME" /> kuhlulekile ngenxa yezinkinga zeseva.</translation> +<translation id="1497470209855416291">Ukuzama kukhutshaziwe</translation> <translation id="1506061864768559482">Injini yokusesha</translation> <translation id="1513352483775369820">Amabhukhimakhi nomlando wendawo</translation> <translation id="1513858653616922153">Susa iphasiwedi</translation> @@ -152,6 +153,7 @@ <translation id="2068748236079642969">Buka ividiyo elandelayo</translation> <translation id="2074143993849053708">Imvume ye-ui yomsizi wokusesha ngezwi ivaliwe</translation> <translation id="2082238445998314030">Umphumela ongu-<ph name="RESULT_NUMBER" /> wokungu-<ph name="TOTAL_RESULTS" /></translation> +<translation id="2083113399121613785">Ukuzama kunikwe amandla</translation> <translation id="2096012225669085171">Vumelanisa uphinde wenze kube ngokwakho kumadivayisi onkana</translation> <translation id="2100273922101894616">Ngena ngemvume ngokuzenzakalela</translation> <translation id="2100314319871056947">Zama ukwabelana ngombhalo ngezingxenye ezincane</translation> @@ -964,7 +966,6 @@ <translation id="7704317875155739195">Qedela ngokuzenzakalela usesho nama-URL</translation> <translation id="7707922173985738739">Sebenzisa idatha yeselula</translation> <translation id="7725024127233776428">Amakhasi owafaka ibhukhimakhi avela lapha</translation> -<translation id="7735637452482172701">Vula Ngokukhiya Isikrini</translation> <translation id="7746457520633464754">Ukuze uthole izinhlelo zokusebenza namasayithi ayingozi, i-Chrome ithumela ama-URL wamanye amakhasi owavakashelayo, ulwazi lwesistimu olukhawulelwe, kanye nokuqukethwe kwekhasi ku-Google</translation> <translation id="7757787379047923882">Umbhalo wabiwe kusuka ku-<ph name="DEVICE_NAME" /></translation> <translation id="7761849928583394409">Khetha idethi nesikhathi</translation>
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/HomeButton.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/HomeButton.java index ab9e0da..46d2345 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/HomeButton.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/HomeButton.java
@@ -74,6 +74,7 @@ public boolean onMenuItemClick(MenuItem item) { assert !mIsManagedByPolicySupplier.get(); assert item.getItemId() == ID_SETTINGS; + assert mOnMenuClickCallback != null; mOnMenuClickCallback.onResult(getContext()); return true; @@ -94,7 +95,7 @@ } private void updateContextMenuListener() { - if (!mIsManagedByPolicySupplier.get()) { + if (!mIsManagedByPolicySupplier.get() && mOnMenuClickCallback != null) { setOnCreateContextMenuListener(this); } else { setOnCreateContextMenuListener(null);
diff --git a/chrome/browser/ui/app_list/search/score_normalizer/balanced_reservoir.cc b/chrome/browser/ui/app_list/search/score_normalizer/balanced_reservoir.cc index 87a8f86..8e239f9 100644 --- a/chrome/browser/ui/app_list/search/score_normalizer/balanced_reservoir.cc +++ b/chrome/browser/ui/app_list/search/score_normalizer/balanced_reservoir.cc
@@ -12,6 +12,7 @@ #include "ash/constants/ash_pref_names.h" #include "base/logging.h" +#include "base/metrics/histogram_macros.h" #include "base/values.h" #include "chrome/browser/profiles/profile.h" #include "components/prefs/pref_service.h" @@ -81,10 +82,13 @@ SplitBinByScore(index, score); MergeSmallestBins(); // Undo split and merge if there is no improvement in error. - if (old_error < GetError()) { + const double new_error = GetError(); + if (old_error < new_error) { dividers_ = old_dividers; counts_ = old_counts; } + UMA_HISTOGRAM_BOOLEAN("Apps.AppList.ScoreNormalizer.L2ErrorDecreased", + (new_error <= old_error)); } } @@ -174,6 +178,10 @@ pref_counts->is_list()) { dividers_ = PrefsListToVector(pref_dividers->GetList()); counts_ = PrefsListToVector(pref_counts->GetList()); + // If dividers and counts exists in prefs log to UMA histogram if it was + // successfully read, that is all values in the vector are doubles. + UMA_HISTOGRAM_BOOLEAN("Apps.AppList.ScoreNormalizer.ReadPrefsError", + (dividers_.empty() || counts_.empty())); } } if (dividers_.empty() || counts_.empty()) { @@ -182,8 +190,6 @@ } else { DCHECK(dividers_.size() + 1 == counts_.size()); } - // TODO(crbug.com/1156930): Add UMA histogram if ReadPrefs() fails because - // entries in vectors are not doubles. } void BalancedReservoir::WritePrefs() {
diff --git a/chrome/browser/ui/app_list/search/score_normalizer/score_normalizer.cc b/chrome/browser/ui/app_list/search/score_normalizer/score_normalizer.cc index f2fea91..738e45f1 100644 --- a/chrome/browser/ui/app_list/search/score_normalizer/score_normalizer.cc +++ b/chrome/browser/ui/app_list/search/score_normalizer/score_normalizer.cc
@@ -8,6 +8,7 @@ #include "ash/constants/ash_pref_names.h" #include "base/logging.h" +#include "base/metrics/histogram_macros.h" #include "base/values.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/search/chrome_search_result.h" @@ -33,6 +34,8 @@ for (const auto& result : results) { RecordScore(result->relevance()); } + UMA_HISTOGRAM_COUNTS_100("Apps.AppList.ScoreNormalizer.SearchResultsCount", + results.size()); reservoir_.WritePrefs(); }
diff --git a/chrome/browser/ui/apps/app_info_dialog.h b/chrome/browser/ui/apps/app_info_dialog.h index 205648e..7f07bc8 100644 --- a/chrome/browser/ui/apps/app_info_dialog.h +++ b/chrome/browser/ui/apps/app_info_dialog.h
@@ -28,15 +28,6 @@ class Rect; } -// Used for UMA to track where the App Info dialog is launched from. -enum AppInfoLaunchSource { - FROM_APP_LIST, // Launched from the app list context menu (ChromeOS). - FROM_EXTENSIONS_PAGE, // Launched from the chrome://extensions page. - FROM_APPS_PAGE, // Launched from chrome://apps context menu. - FROM_SHELF, // Launched from chrome shelf. - NUM_LAUNCH_SOURCES, -}; - // TODO(tsergeant): Move these methods into a class // Returns true if the app info dialog is available on the current platform. bool CanPlatformShowAppInfoDialog();
diff --git a/chrome/browser/ui/ash/arc_custom_tab_modal_dialog_host.cc b/chrome/browser/ui/ash/arc_custom_tab_modal_dialog_host.cc index deb5b1e..32f5b1a 100644 --- a/chrome/browser/ui/ash/arc_custom_tab_modal_dialog_host.cc +++ b/chrome/browser/ui/ash/arc_custom_tab_modal_dialog_host.cc
@@ -16,7 +16,9 @@ ArcCustomTabModalDialogHost::ArcCustomTabModalDialogHost( std::unique_ptr<arc::CustomTab> custom_tab, content::WebContents* web_contents) - : custom_tab_(std::move(custom_tab)), web_contents_(web_contents) { + : WebContentsObserver(web_contents), + custom_tab_(std::move(custom_tab)), + web_contents_(web_contents) { // Attach any required WebContents helpers. Browser tabs automatically get // them attached in TabHelpers::AttachTabHelpers. web_modal::WebContentsModalDialogManager::CreateForWebContents(web_contents_); @@ -24,7 +26,15 @@ ->SetDelegate(this); } -ArcCustomTabModalDialogHost::~ArcCustomTabModalDialogHost() = default; +ArcCustomTabModalDialogHost::~ArcCustomTabModalDialogHost() { + for (auto& observer : observer_list_) + observer.OnHostDestroying(); +} + +void ArcCustomTabModalDialogHost::MainFrameWasResized(bool width_changed) { + for (auto& observer : observer_list_) + observer.OnPositionRequiresUpdate(); +} web_modal::WebContentsModalDialogHost* ArcCustomTabModalDialogHost::GetWebContentsModalDialogHost() { @@ -45,7 +55,11 @@ } void ArcCustomTabModalDialogHost::AddObserver( - web_modal::ModalDialogHostObserver* observer) {} + web_modal::ModalDialogHostObserver* observer) { + observer_list_.AddObserver(observer); +} void ArcCustomTabModalDialogHost::RemoveObserver( - web_modal::ModalDialogHostObserver* observer) {} + web_modal::ModalDialogHostObserver* observer) { + observer_list_.RemoveObserver(observer); +}
diff --git a/chrome/browser/ui/ash/arc_custom_tab_modal_dialog_host.h b/chrome/browser/ui/ash/arc_custom_tab_modal_dialog_host.h index d05771c..4057248 100644 --- a/chrome/browser/ui/ash/arc_custom_tab_modal_dialog_host.h +++ b/chrome/browser/ui/ash/arc_custom_tab_modal_dialog_host.h
@@ -8,8 +8,10 @@ #include <memory> #include "base/macros.h" +#include "base/observer_list.h" #include "components/web_modal/web_contents_modal_dialog_host.h" #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h" +#include "content/public/browser/web_contents_observer.h" #include "ui/gfx/native_widget_types.h" namespace arc { @@ -33,13 +35,17 @@ // web contents modal dialog to be drawn in the ARC Custom Tab. // The WebContents hosted by this object must outlive it. class ArcCustomTabModalDialogHost - : public web_modal::WebContentsModalDialogHost, + : public content::WebContentsObserver, + public web_modal::WebContentsModalDialogHost, public web_modal::WebContentsModalDialogManagerDelegate { public: ArcCustomTabModalDialogHost(std::unique_ptr<arc::CustomTab> custom_tab, content::WebContents* web_contents); ~ArcCustomTabModalDialogHost() override = 0; + // content::WebContentsObserver: + void MainFrameWasResized(bool width_changed) override; + // web_modal::WebContentsModalDialogManagerDelegate: web_modal::WebContentsModalDialogHost* GetWebContentsModalDialogHost() override; @@ -55,6 +61,10 @@ std::unique_ptr<arc::CustomTab> custom_tab_; content::WebContents* web_contents_; + private: + base::ObserverList<web_modal::ModalDialogHostObserver>::Unchecked + observer_list_; + DISALLOW_COPY_AND_ASSIGN(ArcCustomTabModalDialogHost); };
diff --git a/chrome/browser/ui/ash/assistant/assistant_web_view_impl.cc b/chrome/browser/ui/ash/assistant/assistant_web_view_impl.cc index 672d5d41..e4f3632 100644 --- a/chrome/browser/ui/ash/assistant/assistant_web_view_impl.cc +++ b/chrome/browser/ui/ash/assistant/assistant_web_view_impl.cc
@@ -131,6 +131,13 @@ void AssistantWebViewImpl::OnFocusChangedInPage( content::FocusedNodeDetails* details) { + // When navigating to the |web_contents_|, it may not focus it. Request focus + // as needed. This is a workaround to get a non-empty rect of the focused + // node. See details in b/177047240. + auto* native_view = web_contents_->GetContentNativeView(); + if (native_view && !native_view->HasFocus()) + web_contents_->Focus(); + for (auto& observer : observers_) observer.DidChangeFocusedNode(details->node_bounds_in_screen); }
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.cc b/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.cc index 2878d125d..afea3db 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.cc
@@ -240,6 +240,10 @@ return test_api_->GetTray(); } +views::View* HoldingSpaceBrowserTestBase::GetTrayDropTargetOverlay() { + return test_api_->GetTrayDropTargetOverlay(); +} + views::View* HoldingSpaceBrowserTestBase::GetDefaultTrayIcon() { return test_api_->GetDefaultTrayIcon(); }
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h b/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h index 31b1cb2c..6fc733be 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h +++ b/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h
@@ -101,6 +101,10 @@ // Returns the holding space tray in the shelf. views::View* GetTray(); + // Returns the view drawn on top of the holding space tray to indicate that + // it is a drop target capable of handling the current drag payload. + views::View* GetTrayDropTargetOverlay(); + // Getter for the holding space tray icons in the shelf. views::View* GetDefaultTrayIcon(); views::View* GetPreviewsTrayIcon();
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc b/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc index 4e4b7c5..06d11de 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc
@@ -81,7 +81,10 @@ } // Performs a gesture drag between `from` and `to`. -void GestureDrag(const views::View* from, const views::View* to) { +void GestureDrag(const views::View* from, + const views::View* to, + base::OnceClosure before_release_callback = base::DoNothing(), + base::OnceClosure after_release_callback = base::DoNothing()) { auto* root_window = HoldingSpaceBrowserTestBase::GetRootWindowForNewWindows(); ui::test::EventGenerator event_generator(root_window); event_generator.PressTouch(from->GetBoundsInScreen().CenterPoint()); @@ -99,7 +102,10 @@ // be compensated for here. event_generator.MoveTouch( gfx::Point(to->GetBoundsInScreen().CenterPoint() + gfx::Vector2d(0, 25))); + + std::move(before_release_callback).Run(); event_generator.ReleaseTouch(); + std::move(after_release_callback).Run(); } // Performs a gesture tap on `view`. @@ -110,13 +116,23 @@ } // Performs a mouse drag between `from` and `to`. -void MouseDrag(const views::View* from, const views::View* to) { +void MouseDrag(const views::View* from, + const views::View* to, + base::OnceClosure before_release_callback = base::DoNothing(), + base::OnceClosure after_release_callback = base::DoNothing()) { auto* root_window = HoldingSpaceBrowserTestBase::GetRootWindowForNewWindows(); ui::test::EventGenerator event_generator(root_window); event_generator.MoveMouseTo(from->GetBoundsInScreen().CenterPoint()); event_generator.PressLeftButton(); - event_generator.MoveMouseTo(to->GetBoundsInScreen().CenterPoint()); + + // Generate multiple interpolated mouse move events so that views are notified + // of mouse enter/exit as they would be in production. + event_generator.MoveMouseTo(to->GetBoundsInScreen().CenterPoint(), + /*count=*/10); + + std::move(before_release_callback).Run(); event_generator.ReleaseLeftButton(); + std::move(after_release_callback).Run(); } // Moves mouse to `view` over `count` number of events. @@ -449,12 +465,30 @@ // Parameterized by a callback to invoke to perform a drag-and-drop. class HoldingSpaceUiDragAndDropBrowserTest : public HoldingSpaceUiBrowserTest, - public testing::WithParamInterface<base::RepeatingCallback< - void(const views::View* from, const views::View* to)>> { + public testing::WithParamInterface<base::RepeatingCallback<void( + const views::View* from, + const views::View* to, + base::OnceClosure before_release_callback, + base::OnceClosure after_release_callback)>> { public: + // Asserts expectations that the holding space tray is or isn't a drop target. + void ExpectTrayIsDropTarget(bool is_drop_target) { + EXPECT_EQ(GetTrayDropTargetOverlay()->layer()->GetTargetOpacity(), + is_drop_target ? 1.f : 0.f); + EXPECT_EQ(GetDefaultTrayIcon()->layer()->GetTargetOpacity(), + is_drop_target ? 0.f : 1.f); + EXPECT_EQ(GetPreviewsTrayIcon()->layer()->GetTargetOpacity(), + is_drop_target ? 0.f : 1.f); + } + // Performs a drag-and-drop between `from` and `to`. - void PerformDragAndDrop(const views::View* from, const views::View* to) { - GetParam().Run(from, to); + void PerformDragAndDrop( + const views::View* from, + const views::View* to, + base::OnceClosure before_release_callback = base::DoNothing(), + base::OnceClosure after_release_callback = base::DoNothing()) { + GetParam().Run(from, to, std::move(before_release_callback), + std::move(after_release_callback)); } // Returns the view serving as the drop sender for tests. @@ -579,7 +613,17 @@ }); // Perform and verify the ability to pin a file via drag-and-drop. - PerformDragAndDrop(/*from=*/sender(), /*to=*/GetTray()); + ExpectTrayIsDropTarget(false); + PerformDragAndDrop( + /*from=*/sender(), /*to=*/GetTray(), + /*before_release_callback=*/ + base::BindOnce( + &HoldingSpaceUiDragAndDropBrowserTest::ExpectTrayIsDropTarget, + base::Unretained(this), true), + /*after_release_callback=*/ + base::BindOnce( + &HoldingSpaceUiDragAndDropBrowserTest::ExpectTrayIsDropTarget, + base::Unretained(this), false)); run_loop.Run(); } @@ -602,7 +646,17 @@ // Perform and verify the ability to pin multiple files via drag-and-drop. // Note that any already pinned files in the drop payload are ignored. - PerformDragAndDrop(/*from=*/sender(), /*to=*/GetTray()); + ExpectTrayIsDropTarget(false); + PerformDragAndDrop( + /*from=*/sender(), /*to=*/GetTray(), + /*before_release_callback=*/ + base::BindOnce( + &HoldingSpaceUiDragAndDropBrowserTest::ExpectTrayIsDropTarget, + base::Unretained(this), true), + /*after_release_callback=*/ + base::BindOnce( + &HoldingSpaceUiDragAndDropBrowserTest::ExpectTrayIsDropTarget, + base::Unretained(this), false)); run_loop.Run(); } @@ -617,7 +671,17 @@ // Verify that attempting to drag-and-drop a payload which contains only // files that are already pinned will not result in a client interaction. EXPECT_CALL(client, PinFiles).Times(0); - PerformDragAndDrop(/*from=*/sender(), /*to=*/GetTray()); + ExpectTrayIsDropTarget(false); + PerformDragAndDrop( + /*from=*/sender(), /*to=*/GetTray(), + /*before_release_callback=*/ + base::BindOnce( + &HoldingSpaceUiDragAndDropBrowserTest::ExpectTrayIsDropTarget, + base::Unretained(this), false), + /*after_release_callback=*/ + base::BindOnce( + &HoldingSpaceUiDragAndDropBrowserTest::ExpectTrayIsDropTarget, + base::Unretained(this), false)); testing::Mock::VerifyAndClearExpectations(&client); } }
diff --git a/chrome/browser/ui/ash/launcher/arc_app_window.cc b/chrome/browser/ui/ash/launcher/arc_app_window.cc index 0213f9d..0ba630a3 100644 --- a/chrome/browser/ui/ash/launcher/arc_app_window.cc +++ b/chrome/browser/ui/ash/launcher/arc_app_window.cc
@@ -111,7 +111,7 @@ // Reset any pending request to set default app icon. apply_default_image_timer_.Stop(); - if (!exo::GetShellMainSurface(GetNativeWindow())) { + if (!exo::GetShellRootSurface(GetNativeWindow())) { // Support unit tests where we don't have exo system initialized. views::NativeWidgetAura::AssignIconToAuraWindow( GetNativeWindow(), gfx::ImageSkia() /* window_icon */,
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.h b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.h index 1c0d9a6b..b9ebd94 100644 --- a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.h +++ b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.h
@@ -32,8 +32,6 @@ static constexpr int kSpacing = 24; static constexpr int kTitleLineHeight = 24; - SharesheetBubbleView(views::View* anchor_view, - sharesheet::SharesheetServiceDelegate* delegate); SharesheetBubbleView(gfx::NativeWindow native_window, sharesheet::SharesheetServiceDelegate* delegate); SharesheetBubbleView(const SharesheetBubbleView&) = delete;
diff --git a/chrome/browser/ui/ash/system_tray_client.cc b/chrome/browser/ui/ash/system_tray_client.cc index b3f1b8b3..3528c4dc 100644 --- a/chrome/browser/ui/ash/system_tray_client.cc +++ b/chrome/browser/ui/ash/system_tray_client.cc
@@ -15,13 +15,13 @@ #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/ash/accessibility/accessibility_manager.h" +#include "chrome/browser/ash/system/system_clock.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/login/help_app_launcher.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" #include "chrome/browser/chromeos/set_time_dialog.h" -#include "chrome/browser/chromeos/system/system_clock.h" #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/lifetime/termination_notification.h" #include "chrome/browser/profiles/profile_manager.h"
diff --git a/chrome/browser/ui/ash/system_tray_client.h b/chrome/browser/ui/ash/system_tray_client.h index 8fbd329..952d7f8 100644 --- a/chrome/browser/ui/ash/system_tray_client.h +++ b/chrome/browser/ui/ash/system_tray_client.h
@@ -7,7 +7,7 @@ #include "ash/public/cpp/system_tray_client.h" #include "base/macros.h" -#include "chrome/browser/chromeos/system/system_clock_observer.h" +#include "chrome/browser/ash/system/system_clock_observer.h" #include "chrome/browser/upgrade_detector/upgrade_observer.h" #include "components/policy/core/common/cloud/cloud_policy_store.h"
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index dc8b13b..71aab1ce0 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -51,6 +51,7 @@ #include "components/autofill/core/common/autofill_payments_features.h" #include "components/autofill/core/common/autofill_prefs.h" #include "components/autofill/core/common/autofill_switches.h" +#include "components/autofill_assistant/browser/public/runtime_manager.h" #include "components/password_manager/content/browser/content_password_manager_driver.h" #include "components/password_manager/core/browser/password_manager_metrics_util.h" #include "components/password_manager/core/browser/password_requirements_service.h" @@ -542,6 +543,14 @@ void ChromeAutofillClient::ShowAutofillPopup( const autofill::AutofillClient::PopupOpenArgs& open_args, base::WeakPtr<AutofillPopupDelegate> delegate) { + // Don't show any popups while Autofill Assistant's UI is shown. + auto* assistant_runtime_manager = + autofill_assistant::RuntimeManager::GetForWebContents(web_contents()); + if (assistant_runtime_manager && assistant_runtime_manager->GetState() == + autofill_assistant::UIState::kShown) { + return; + } + // Convert element_bounds to be in screen space. gfx::Rect client_area = web_contents()->GetContainerBounds(); gfx::RectF element_bounds_in_screen_space =
diff --git a/chrome/browser/ui/cocoa/notifications/BUILD.gn b/chrome/browser/ui/cocoa/notifications/BUILD.gn index 722621ed..b445b84e 100644 --- a/chrome/browser/ui/cocoa/notifications/BUILD.gn +++ b/chrome/browser/ui/cocoa/notifications/BUILD.gn
@@ -27,6 +27,7 @@ deps = [ ":common", "//base", + "//chrome/services/mac_notifications/public/cpp", "//third_party/crashpad/crashpad/client", ] @@ -57,8 +58,6 @@ "notification_builder_base.mm", "notification_builder_mac.h", "notification_builder_mac.mm", - "notification_constants_mac.h", - "notification_constants_mac.mm", "notification_delivery.h", "notification_operation.h", "notification_response_builder_mac.h", @@ -71,5 +70,8 @@ "xpc_mach_port.mm", ] - deps = [ "//base" ] + deps = [ + "//base", + "//chrome/services/mac_notifications/public/cpp", + ] }
diff --git a/chrome/browser/ui/cocoa/notifications/DEPS b/chrome/browser/ui/cocoa/notifications/DEPS index b21e182..3a31d48f 100644 --- a/chrome/browser/ui/cocoa/notifications/DEPS +++ b/chrome/browser/ui/cocoa/notifications/DEPS
@@ -1,3 +1,4 @@ include_rules = [ + "+chrome/services/mac_notifications/public", "+ui/message_center", ]
diff --git a/chrome/browser/ui/cocoa/notifications/alert_nsnotification_service.mm b/chrome/browser/ui/cocoa/notifications/alert_nsnotification_service.mm index 62ab60b..3762139 100644 --- a/chrome/browser/ui/cocoa/notifications/alert_nsnotification_service.mm +++ b/chrome/browser/ui/cocoa/notifications/alert_nsnotification_service.mm
@@ -7,9 +7,9 @@ #import "base/mac/scoped_nsobject.h" #include "base/notreached.h" #import "chrome/browser/ui/cocoa/notifications/notification_builder_mac.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" #import "chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.h" #import "chrome/browser/ui/cocoa/notifications/xpc_transaction_handler.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" @class NSUserNotificationCenter;
diff --git a/chrome/browser/ui/cocoa/notifications/notification_builder_base.h b/chrome/browser/ui/cocoa/notifications/notification_builder_base.h index 9606a45..a579d4c7 100644 --- a/chrome/browser/ui/cocoa/notifications/notification_builder_base.h +++ b/chrome/browser/ui/cocoa/notifications/notification_builder_base.h
@@ -8,7 +8,7 @@ #import <Foundation/Foundation.h> #include "base/mac/scoped_nsobject.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" @interface NotificationBuilderBase : NSObject { base::scoped_nsobject<NSMutableDictionary> _notificationData;
diff --git a/chrome/browser/ui/cocoa/notifications/notification_builder_mac.mm b/chrome/browser/ui/cocoa/notifications/notification_builder_mac.mm index 085626d..821c92f 100644 --- a/chrome/browser/ui/cocoa/notifications/notification_builder_mac.mm +++ b/chrome/browser/ui/cocoa/notifications/notification_builder_mac.mm
@@ -8,8 +8,7 @@ #include "base/mac/mac_util.h" #include "base/mac/scoped_nsobject.h" - -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" @implementation NotificationBuilder
diff --git a/chrome/browser/ui/cocoa/notifications/notification_builder_mac_unittest.mm b/chrome/browser/ui/cocoa/notifications/notification_builder_mac_unittest.mm index e50639c1..11b14db 100644 --- a/chrome/browser/ui/cocoa/notifications/notification_builder_mac_unittest.mm +++ b/chrome/browser/ui/cocoa/notifications/notification_builder_mac_unittest.mm
@@ -10,7 +10,7 @@ #include "base/strings/sys_string_conversions.h" #include "chrome/browser/notifications/notification_handler.h" #include "chrome/browser/ui/cocoa/notifications/notification_builder_mac.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" #include "testing/gtest/include/gtest/gtest.h" TEST(NotificationBuilderMacTest, TestNotificationNoButtons) {
diff --git a/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.mm b/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.mm index 71faf5a..1f9130f 100644 --- a/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.mm +++ b/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.mm
@@ -5,8 +5,8 @@ #import "chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.h" #include "base/check.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" #include "chrome/browser/ui/cocoa/notifications/notification_operation.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" @implementation NotificationResponseBuilder
diff --git a/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac_unittest.mm b/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac_unittest.mm index 9ebd1a4..2e06f71 100644 --- a/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac_unittest.mm +++ b/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac_unittest.mm
@@ -8,9 +8,9 @@ #include "chrome/browser/notifications/notification_common.h" #include "chrome/browser/notifications/notification_handler.h" #include "chrome/browser/ui/cocoa/notifications/notification_builder_mac.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" #include "chrome/browser/ui/cocoa/notifications/notification_operation.h" #include "chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" #include "testing/gtest/include/gtest/gtest.h" #define STATIC_ASSERT_ENUM(a, b) \
diff --git a/chrome/browser/ui/cocoa/notifications/unnotification_builder_mac.mm b/chrome/browser/ui/cocoa/notifications/unnotification_builder_mac.mm index d99fb395..a4f8b7f73 100644 --- a/chrome/browser/ui/cocoa/notifications/unnotification_builder_mac.mm +++ b/chrome/browser/ui/cocoa/notifications/unnotification_builder_mac.mm
@@ -9,8 +9,7 @@ #include "base/mac/mac_util.h" #include "base/mac/scoped_nsobject.h" - -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" @implementation UNNotificationBuilder
diff --git a/chrome/browser/ui/cocoa/notifications/unnotification_builder_mac_unittest.mm b/chrome/browser/ui/cocoa/notifications/unnotification_builder_mac_unittest.mm index 8d319ec..9c5381d 100644 --- a/chrome/browser/ui/cocoa/notifications/unnotification_builder_mac_unittest.mm +++ b/chrome/browser/ui/cocoa/notifications/unnotification_builder_mac_unittest.mm
@@ -14,9 +14,9 @@ #include "build/build_config.h" #include "chrome/browser/notifications/notification_handler.h" #include "chrome/browser/notifications/notification_image_retainer.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" #import "chrome/browser/ui/cocoa/notifications/unnotification_builder_mac.h" #include "chrome/common/chrome_paths.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/image/image.h"
diff --git a/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac.mm b/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac.mm index 46c7efa2..f4b8954 100644 --- a/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac.mm +++ b/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac.mm
@@ -8,8 +8,8 @@ #include "base/check.h" #include "base/notreached.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" #include "chrome/browser/ui/cocoa/notifications/notification_operation.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" @implementation UNNotificationResponseBuilder
diff --git a/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac_unittest.mm b/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac_unittest.mm index 21a9379..88d037c 100644 --- a/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac_unittest.mm +++ b/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac_unittest.mm
@@ -7,10 +7,10 @@ #include "base/mac/scoped_nsobject.h" #include "chrome/browser/notifications/notification_common.h" #include "chrome/browser/notifications/notification_handler.h" -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" #include "chrome/browser/ui/cocoa/notifications/notification_operation.h" #include "chrome/browser/ui/cocoa/notifications/unnotification_builder_mac.h" #include "chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" #include "testing/gtest/include/gtest/gtest.h" @interface FakeContent : NSObject
diff --git a/chrome/browser/ui/startup/launch_mode_recorder.cc b/chrome/browser/ui/startup/launch_mode_recorder.cc index 31cba66..a3b6c5d 100644 --- a/chrome/browser/ui/startup/launch_mode_recorder.cc +++ b/chrome/browser/ui/startup/launch_mode_recorder.cc
@@ -11,6 +11,7 @@ #include "base/metrics/histogram_functions.h" #include "base/path_service.h" #include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" #include "base/task/thread_pool.h" #include "build/build_config.h" @@ -61,10 +62,12 @@ DCHECK(shortcut_path); DCHECK(shortcut_path.value()); - const base::string16 shortcut(base::i18n::ToLower(shortcut_path.value())); + const base::string16 shortcut( + base::i18n::ToLower(base::WideToUTF16(shortcut_path.value()))); // The windows quick launch path is not localized. - if (shortcut.find(L"\\quick launch\\") != base::StringPiece16::npos) + if (shortcut.find(STRING16_LITERAL("\\quick launch\\")) != + base::StringPiece16::npos) return LaunchMode::kShortcutTaskbar; // Check the common shortcut locations. @@ -80,7 +83,8 @@ base::FilePath candidate; for (const auto& item : kPathKeysAndModes) { if (base::PathService::Get(item.path_key, &candidate) && - base::StartsWith(shortcut, base::i18n::ToLower(candidate.value()), + base::StartsWith(shortcut, + base::i18n::ToLower(candidate.AsUTF16Unsafe()), base::CompareCase::SENSITIVE)) { return item.launch_mode; }
diff --git a/chrome/browser/ui/views/accessibility/non_accessible_image_view.cc b/chrome/browser/ui/views/accessibility/non_accessible_image_view.cc index e683f46..d47e4f5 100644 --- a/chrome/browser/ui/views/accessibility/non_accessible_image_view.cc +++ b/chrome/browser/ui/views/accessibility/non_accessible_image_view.cc
@@ -6,6 +6,7 @@ #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" +#include "ui/views/metadata/metadata_impl_macros.h" NonAccessibleImageView::NonAccessibleImageView() {} @@ -14,3 +15,6 @@ void NonAccessibleImageView::GetAccessibleNodeData(ui::AXNodeData* node_data) { node_data->AddState(ax::mojom::State::kInvisible); } + +BEGIN_METADATA(NonAccessibleImageView, views::ImageView) +END_METADATA
diff --git a/chrome/browser/ui/views/accessibility/non_accessible_image_view.h b/chrome/browser/ui/views/accessibility/non_accessible_image_view.h index 9dd800f..fcd435f 100644 --- a/chrome/browser/ui/views/accessibility/non_accessible_image_view.h +++ b/chrome/browser/ui/views/accessibility/non_accessible_image_view.h
@@ -7,19 +7,21 @@ #include "base/macros.h" #include "ui/views/controls/image_view.h" +#include "ui/views/metadata/metadata_header_macros.h" // ImageView that sets the "invisible" state on AXNodeData so that // the image is not traversed by screen readers. class NonAccessibleImageView : public views::ImageView { public: + METADATA_HEADER(NonAccessibleImageView); NonAccessibleImageView(); + NonAccessibleImageView(const NonAccessibleImageView&) = delete; + NonAccessibleImageView& operator=(const NonAccessibleImageView&) = delete; ~NonAccessibleImageView() override; private: // Overridden from views::ImageView. void GetAccessibleNodeData(ui::AXNodeData* node_data) override; - - DISALLOW_COPY_AND_ASSIGN(NonAccessibleImageView); }; #endif // CHROME_BROWSER_UI_VIEWS_ACCESSIBILITY_NON_ACCESSIBLE_IMAGE_VIEW_H_
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc index 40b32ac..487f17e 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc
@@ -179,7 +179,7 @@ RecordBookmarkLaunch(location_, ProfileMetrics::GetBrowserProfileType(profile_)); - chrome::OpenAllIfAllowed(browser_, std::move(get_navigator_), selection, + chrome::OpenAllIfAllowed(browser_, get_navigator_, selection, ui::DispositionFromEventFlags(mouse_event_flags)); }
diff --git a/chrome/browser/ui/views/bubble/bubble_contents_wrapper.cc b/chrome/browser/ui/views/bubble/bubble_contents_wrapper.cc new file mode 100644 index 0000000..58329f5 --- /dev/null +++ b/chrome/browser/ui/views/bubble/bubble_contents_wrapper.cc
@@ -0,0 +1,116 @@ +// Copyright 2021 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/views/bubble/bubble_contents_wrapper.h" + +#include "content/public/browser/keyboard_event_processing_result.h" +#include "content/public/browser/native_web_keyboard_event.h" +#include "content/public/browser/render_widget_host_view.h" +#include "ui/gfx/geometry/rounded_corners_f.h" +#include "ui/views/widget/widget.h" + +namespace { + +bool IsEscapeEvent(const content::NativeWebKeyboardEvent& event) { + return event.GetType() == + content::NativeWebKeyboardEvent::Type::kRawKeyDown && + event.windows_key_code == ui::VKEY_ESCAPE; +} + +} // namespace + +bool BubbleContentsWrapper::Host::HandleKeyboardEvent( + content::WebContents* source, + const content::NativeWebKeyboardEvent& event) { + return false; +} + +BubbleContentsWrapper::BubbleContentsWrapper( + content::BrowserContext* browser_context, + int task_manager_string_id, + bool enable_extension_apis) + : web_contents_(content::WebContents::Create( + content::WebContents::CreateParams(browser_context))) { + web_contents_->SetDelegate(this); + WebContentsObserver::Observe(web_contents_.get()); + + if (enable_extension_apis) { + // In order for the WebUI in the renderer to use extensions APIs we must + // add a ChromeExtensionWebContentsObserver to the WebView's WebContents. + extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( + web_contents_.get()); + } + task_manager::WebContentsTags::CreateForToolContents(web_contents_.get(), + task_manager_string_id); +} + +BubbleContentsWrapper::~BubbleContentsWrapper() { + WebContentsObserver::Observe(nullptr); +} + +void BubbleContentsWrapper::ResizeDueToAutoResize(content::WebContents* source, + const gfx::Size& new_size) { + DCHECK_EQ(web_contents(), source); + if (host_) + host_->ResizeDueToAutoResize(source, new_size); +} + +content::KeyboardEventProcessingResult +BubbleContentsWrapper::PreHandleKeyboardEvent( + content::WebContents* source, + const content::NativeWebKeyboardEvent& event) { + DCHECK_EQ(web_contents(), source); + // Close the bubble if an escape event is detected. Handle this here to + // prevent the renderer from capturing the event and not propagating it up. + if (host_ && IsEscapeEvent(event)) { + host_->CloseUI(); + return content::KeyboardEventProcessingResult::HANDLED; + } + return content::KeyboardEventProcessingResult::NOT_HANDLED; +} + +bool BubbleContentsWrapper::HandleKeyboardEvent( + content::WebContents* source, + const content::NativeWebKeyboardEvent& event) { + DCHECK_EQ(web_contents(), source); + return host_ ? host_->HandleKeyboardEvent(source, event) : false; +} + +void BubbleContentsWrapper::RenderViewHostChanged( + content::RenderViewHost* old_host, + content::RenderViewHost* new_host) { + content::RenderWidgetHostView* render_widget_host_view = + web_contents_->GetRenderWidgetHostView(); + if (!render_widget_host_view) + return; + + render_widget_host_view->EnableAutoResize(gfx::Size(1, 1), + gfx::Size(INT_MAX, INT_MAX)); +} + +void BubbleContentsWrapper::ShowUI() { + if (host_) + host_->ShowUI(); +} + +void BubbleContentsWrapper::CloseUI() { + if (host_) + host_->CloseUI(); +} + +base::WeakPtr<BubbleContentsWrapper::Host> BubbleContentsWrapper::GetHost() { + return host_; +} + +void BubbleContentsWrapper::SetHost( + base::WeakPtr<BubbleContentsWrapper::Host> host) { + host_ = std::move(host); +} + +void BubbleContentsWrapper::SetWebContentsForTesting( + std::unique_ptr<content::WebContents> web_contents) { + web_contents_->SetDelegate(nullptr); + web_contents_ = std::move(web_contents); + web_contents_->SetDelegate(this); +}
diff --git a/chrome/browser/ui/views/bubble/bubble_contents_wrapper.h b/chrome/browser/ui/views/bubble/bubble_contents_wrapper.h new file mode 100644 index 0000000..9f2287b --- /dev/null +++ b/chrome/browser/ui/views/bubble/bubble_contents_wrapper.h
@@ -0,0 +1,119 @@ +// Copyright 2021 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_VIEWS_BUBBLE_BUBBLE_CONTENTS_WRAPPER_H_ +#define CHROME_BROWSER_UI_VIEWS_BUBBLE_BUBBLE_CONTENTS_WRAPPER_H_ + +#include <memory> +#include <utility> + +#include "base/memory/weak_ptr.h" +#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" +#include "chrome/browser/task_manager/web_contents_tags.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_delegate.h" +#include "content/public/common/referrer.h" +#include "ui/webui/mojo_bubble_web_ui_controller.h" + +namespace content { +class BrowserContext; +} // namespace content + +// BubbleContentsWrapper wraps a WebContents that hosts a bubble WebUI (ie a +// WebUI with WebUIController subclassing MojoBubbleWebUIController). This class +// notifies the Host when it should be shown or hidden via ShowUI() and +// CloseUI() in addition to passing through resize events so the Host can adjust +// bounds accordingly. +class BubbleContentsWrapper : public content::WebContentsDelegate, + public content::WebContentsObserver, + public ui::MojoBubbleWebUIController::Embedder { + public: + class Host { + public: + virtual void CloseUI() = 0; + virtual void ShowUI() = 0; + virtual void ResizeDueToAutoResize(content::WebContents* source, + const gfx::Size& new_size) {} + virtual bool HandleKeyboardEvent( + content::WebContents* source, + const content::NativeWebKeyboardEvent& event); + }; + + BubbleContentsWrapper(content::BrowserContext* browser_context, + int task_manager_string_id, + bool enable_extension_apis); + ~BubbleContentsWrapper() override; + + // content::WebContentsDelegate: + void ResizeDueToAutoResize(content::WebContents* source, + const gfx::Size& new_size) override; + content::KeyboardEventProcessingResult PreHandleKeyboardEvent( + content::WebContents* source, + const content::NativeWebKeyboardEvent& event) override; + bool HandleKeyboardEvent( + content::WebContents* source, + const content::NativeWebKeyboardEvent& event) override; + + // content::WebContentsObserver: + void RenderViewHostChanged(content::RenderViewHost* old_host, + content::RenderViewHost* new_host) override; + + // MojoBubbleWebUIController::Embedder: + void CloseUI() override; + void ShowUI() override; + + // Reloads the WebContents hosting the WebUI. + virtual void ReloadWebContents() = 0; + + base::WeakPtr<BubbleContentsWrapper::Host> GetHost(); + void SetHost(base::WeakPtr<BubbleContentsWrapper::Host> host); + + content::WebContents* web_contents() { return web_contents_.get(); } + + void SetWebContentsForTesting( + std::unique_ptr<content::WebContents> web_contents); + + private: + base::WeakPtr<BubbleContentsWrapper::Host> host_; + std::unique_ptr<content::WebContents> web_contents_; +}; + +// BubbleContentsWrapperT is designed to be paired with the WebUIController +// subclass used by the hosted WebUI. This type information allows compile time +// checking that the WebUIController subclasses MojoBubbleWebUIController as +// expected. +template <typename T> +class BubbleContentsWrapperT : public BubbleContentsWrapper { + public: + BubbleContentsWrapperT(const GURL& webui_url, + content::BrowserContext* browser_context, + int task_manager_string_id, + bool enable_extension_apis = false) + : BubbleContentsWrapper(browser_context, + task_manager_string_id, + enable_extension_apis), + webui_url_(webui_url) {} + + void ReloadWebContents() override { + // Lie to WebContents so it starts rendering and eventually calls ShowUI(). + web_contents()->WasShown(); + web_contents()->GetController().LoadURL(webui_url_, content::Referrer(), + ui::PAGE_TRANSITION_AUTO_TOPLEVEL, + std::string()); + // Depends on the WebUIController object being constructed synchronously + // when the navigation is started in LoadInitialURL(). + GetWebUIController()->set_embedder(weak_ptr_factory_.GetWeakPtr()); + } + + T* GetWebUIController() { + return web_contents()->GetWebUI()->GetController()->template GetAs<T>(); + } + + private: + const GURL webui_url_; + base::WeakPtrFactory<BubbleContentsWrapper> weak_ptr_factory_{this}; +}; + +#endif // CHROME_BROWSER_UI_VIEWS_BUBBLE_BUBBLE_CONTENTS_WRAPPER_H_
diff --git a/chrome/browser/ui/views/bubble/bubble_contents_wrapper_unittest.cc b/chrome/browser/ui/views/bubble/bubble_contents_wrapper_unittest.cc new file mode 100644 index 0000000..e64cb5ad --- /dev/null +++ b/chrome/browser/ui/views/bubble/bubble_contents_wrapper_unittest.cc
@@ -0,0 +1,152 @@ +// Copyright 2021 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/views/bubble/bubble_contents_wrapper.h" + +#include <memory> +#include <utility> + +#include "base/memory/weak_ptr.h" +#include "chrome/test/base/testing_profile.h" +#include "chrome/test/views/chrome_views_test_base.h" +#include "content/public/browser/render_widget_host_view.h" +#include "content/public/browser/site_instance.h" +#include "content/public/common/content_client.h" +#include "content/public/test/browser_task_environment.h" +#include "content/public/test/test_renderer_host.h" +#include "content/public/test/web_contents_tester.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace views { + +namespace { + +class MockHost : public BubbleContentsWrapper::Host { + public: + // BubbleContentsWrapper::Host: + void ShowUI() override { ++show_ui_called_; } + void CloseUI() override { ++close_ui_called_; } + void ResizeDueToAutoResize(content::WebContents* source, + const gfx::Size& new_size) override { + ++resize_due_to_auto_resize_called_; + } + + base::WeakPtr<MockHost> GetWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); + } + + int show_ui_called() const { return show_ui_called_; } + int close_ui_called() const { return close_ui_called_; } + int resize_due_to_auto_resize_called() const { + return resize_due_to_auto_resize_called_; + } + + private: + int show_ui_called_ = 0; + int close_ui_called_ = 0; + int resize_due_to_auto_resize_called_ = 0; + + base::WeakPtrFactory<MockHost> weak_ptr_factory_{this}; +}; + +class TestBubbleContentsWrapper : public BubbleContentsWrapper { + public: + explicit TestBubbleContentsWrapper(Profile* profile) + : BubbleContentsWrapper(profile, 0, false) {} + ~TestBubbleContentsWrapper() override = default; + + // BubbleContentsWrapper: + void ReloadWebContents() override {} +}; + +} // namespace + +namespace test { + +class BubbleContentsWrapperTest : public ChromeViewsTestBase { + public: + BubbleContentsWrapperTest() = default; + BubbleContentsWrapperTest(const BubbleContentsWrapperTest&) = delete; + BubbleContentsWrapperTest& operator=(const BubbleContentsWrapperTest&) = + delete; + ~BubbleContentsWrapperTest() override = default; + + // ViewsTestBase: + void SetUp() override { + ChromeViewsTestBase::SetUp(); + profile_ = std::make_unique<TestingProfile>(); + + scoped_refptr<content::SiteInstance> instance = + content::SiteInstance::Create(profile_.get()); + instance->GetProcess()->Init(); + auto test_contents = content::WebContentsTester::CreateTestWebContents( + profile_.get(), std::move(instance)); + + contents_wrapper_ = + std::make_unique<TestBubbleContentsWrapper>(profile_.get()); + contents_wrapper_->SetWebContentsForTesting(std::move(test_contents)); + } + + BubbleContentsWrapper* contents_wrapper() { return contents_wrapper_.get(); } + + private: + content::RenderViewHostTestEnabler test_render_host_factories_; + std::unique_ptr<TestingProfile> profile_; + std::unique_ptr<BubbleContentsWrapper> contents_wrapper_; +}; + +TEST_F(BubbleContentsWrapperTest, CallsHostForShowUIAndCloseUIWhenPresent) { + MockHost host; + EXPECT_EQ(0, host.show_ui_called()); + EXPECT_EQ(0, host.close_ui_called()); + + contents_wrapper()->SetHost(host.GetWeakPtr()); + contents_wrapper()->ShowUI(); + contents_wrapper()->CloseUI(); + EXPECT_EQ(1, host.show_ui_called()); + EXPECT_EQ(1, host.close_ui_called()); + + contents_wrapper()->SetHost(nullptr); + contents_wrapper()->ShowUI(); + contents_wrapper()->CloseUI(); + EXPECT_EQ(1, host.show_ui_called()); + EXPECT_EQ(1, host.close_ui_called()); +} + +TEST_F(BubbleContentsWrapperTest, NotifiesHostWhenResized) { + MockHost host; + EXPECT_EQ(0, host.resize_due_to_auto_resize_called()); + + contents_wrapper()->SetHost(host.GetWeakPtr()); + contents_wrapper()->ResizeDueToAutoResize(contents_wrapper()->web_contents(), + gfx::Size()); + EXPECT_EQ(1, host.resize_due_to_auto_resize_called()); + + contents_wrapper()->SetHost(nullptr); + contents_wrapper()->ResizeDueToAutoResize(contents_wrapper()->web_contents(), + gfx::Size()); + EXPECT_EQ(1, host.resize_due_to_auto_resize_called()); +} + +TEST_F(BubbleContentsWrapperTest, EscapeKeyClosesHost) { + MockHost host; + contents_wrapper()->SetHost(host.GetWeakPtr()); + + content::NativeWebKeyboardEvent event( + blink::WebInputEvent::Type::kRawKeyDown, + blink::WebInputEvent::kNoModifiers, + blink::WebInputEvent::GetStaticTimeStampForTests()); + event.windows_key_code = ui::VKEY_ESCAPE; + + EXPECT_EQ(0, host.close_ui_called()); + contents_wrapper() + ->web_contents() + ->GetRenderWidgetHostView() + ->GetRenderWidgetHost() + ->ForwardKeyboardEvent(event); + EXPECT_EQ(1, host.close_ui_called()); +} + +} // namespace test +} // namespace views
diff --git a/chrome/browser/ui/views/crostini/crostini_update_component_view_browsertest.cc b/chrome/browser/ui/views/crostini/crostini_update_component_view_browsertest.cc index d0f4cdd..7bb54de7 100644 --- a/chrome/browser/ui/views/crostini/crostini_update_component_view_browsertest.cc +++ b/chrome/browser/ui/views/crostini/crostini_update_component_view_browsertest.cc
@@ -4,9 +4,11 @@ #include "chrome/browser/ui/views/crostini/crostini_update_component_view.h" +#include "ash/constants/ash_features.h" #include "base/metrics/histogram_base.h" #include "base/run_loop.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h" #include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/profiles/profile.h" @@ -27,7 +29,12 @@ : public CrostiniDialogBrowserTest { public: CrostiniUpdateComponentViewBrowserTest() - : CrostiniDialogBrowserTest(true /*register_termina*/) {} + : CrostiniDialogBrowserTest(true /*register_termina*/) { + // TODO(crbug/953544) DLC makes this entire feature redundant, so once we're + // committed to it delete all of this. + scoped_feature_list_.InitAndDisableFeature( + chromeos::features::kCrostiniUseDlc); + } // DialogBrowserTest: void ShowUi(const std::string& name) override { @@ -63,6 +70,8 @@ } private: + base::test::ScopedFeatureList scoped_feature_list_; + DISALLOW_COPY_AND_ASSIGN(CrostiniUpdateComponentViewBrowserTest); };
diff --git a/chrome/browser/ui/views/download/download_started_animation_views.cc b/chrome/browser/ui/views/download/download_started_animation_views.cc index d1ec926e..e5714a0 100644 --- a/chrome/browser/ui/views/download/download_started_animation_views.cc +++ b/chrome/browser/ui/views/download/download_started_animation_views.cc
@@ -14,6 +14,8 @@ #include "ui/gfx/geometry/rect.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/views/controls/image_view.h" +#include "ui/views/metadata/metadata_header_macros.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/widget/widget.h" // How long to spend moving downwards and fading out after waiting. @@ -32,7 +34,11 @@ class DownloadStartedAnimationViews : public gfx::LinearAnimation, public views::ImageView { public: + METADATA_HEADER(DownloadStartedAnimationViews); explicit DownloadStartedAnimationViews(content::WebContents* web_contents); + DownloadStartedAnimationViews(const DownloadStartedAnimationViews&) = delete; + DownloadStartedAnimationViews& operator=( + const DownloadStartedAnimationViews&) = delete; private: // Move the animation to wherever it should currently be. @@ -54,8 +60,6 @@ // with the parent window, but it's so fast that this shouldn't cause too // much heartbreak. gfx::Rect web_contents_bounds_; - - DISALLOW_COPY_AND_ASSIGN(DownloadStartedAnimationViews); }; DownloadStartedAnimationViews::DownloadStartedAnimationViews( @@ -117,6 +121,9 @@ } } +BEGIN_METADATA(DownloadStartedAnimationViews, views::ImageView) +END_METADATA + } // namespace // static
diff --git a/chrome/browser/ui/views/location_bar/permission_chip.cc b/chrome/browser/ui/views/location_bar/permission_chip.cc index 74f85657f..ea3196d 100644 --- a/chrome/browser/ui/views/location_bar/permission_chip.cc +++ b/chrome/browser/ui/views/location_bar/permission_chip.cc
@@ -224,6 +224,8 @@ } base::string16 PermissionChip::GetPermissionMessage() const { + if (!delegate_) + return base::string16(); auto requests = delegate_->Requests(); return requests.size() == 1
diff --git a/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc b/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc index a0df5ec7..3c871853 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc
@@ -29,6 +29,7 @@ #include "ui/views/border.h" #include "ui/views/controls/image_view.h" #include "ui/views/layout/layout_provider.h" +#include "ui/views/metadata/metadata_header_macros.h" #include "ui/views/metadata/metadata_impl_macros.h" namespace { @@ -45,6 +46,8 @@ class PlaceholderImageSource : public gfx::CanvasImageSource { public: PlaceholderImageSource(const gfx::Size& canvas_size, SkColor color); + PlaceholderImageSource(const PlaceholderImageSource&) = delete; + PlaceholderImageSource& operator=(const PlaceholderImageSource&) = delete; ~PlaceholderImageSource() override = default; // gfx::CanvasImageSource: @@ -52,8 +55,6 @@ private: const SkColor color_; - - DISALLOW_COPY_AND_ASSIGN(PlaceholderImageSource); }; PlaceholderImageSource::PlaceholderImageSource(const gfx::Size& canvas_size, @@ -76,7 +77,10 @@ class RoundedCornerImageView : public views::ImageView { public: + METADATA_HEADER(RoundedCornerImageView); RoundedCornerImageView() = default; + RoundedCornerImageView(const RoundedCornerImageView&) = delete; + RoundedCornerImageView& operator=(const RoundedCornerImageView&) = delete; // views::ImageView: bool GetCanProcessEventsWithinSubtree() const override { return false; } @@ -84,9 +88,6 @@ protected: // views::ImageView: void OnPaint(gfx::Canvas* canvas) override; - - private: - DISALLOW_COPY_AND_ASSIGN(RoundedCornerImageView); }; void RoundedCornerImageView::OnPaint(gfx::Canvas* canvas) { @@ -99,6 +100,9 @@ ImageView::OnPaint(canvas); } +BEGIN_METADATA(RoundedCornerImageView, views::ImageView) +END_METADATA + } // namespace ////////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.cc b/chrome/browser/ui/views/overlay/overlay_window_views.cc index 6779068..33c56c2 100644 --- a/chrome/browser/ui/views/overlay/overlay_window_views.cc +++ b/chrome/browser/ui/views/overlay/overlay_window_views.cc
@@ -349,6 +349,7 @@ auto window_background_view = std::make_unique<views::View>(); auto video_view = std::make_unique<views::View>(); auto controls_scrim_view = std::make_unique<views::View>(); + auto controls_container_view = std::make_unique<views::View>(); auto close_controls_view = std::make_unique<views::CloseImageButton>(base::BindRepeating( [](OverlayWindowViews* overlay) { @@ -418,6 +419,12 @@ controls_scrim_view->layer()->SetColor(gfx::kGoogleGrey900); controls_scrim_view->layer()->SetOpacity(kControlsScrimOpacity); + // views::View that is a parent of all the controls. Makes hiding and showing + // all the controls at once easier. + controls_container_view->SetPaintToLayer(ui::LAYER_NOT_DRAWN); + controls_container_view->layer()->SetFillsBoundsOpaquely(false); + controls_container_view->layer()->SetName("ControlsContainerView"); + // views::View that closes the window. -------------------------------------- close_controls_view->SetPaintToLayer(ui::LAYER_TEXTURED); close_controls_view->layer()->SetFillsBoundsOpaquely(false); @@ -463,23 +470,25 @@ AddChildView(&view_holder_, std::move(window_background_view)); video_view_ = AddChildView(&view_holder_, std::move(video_view)); controls_scrim_view_ = - AddChildView(&view_holder_, std::move(controls_scrim_view)); + controls_container_view->AddChildView(std::move(controls_scrim_view)); close_controls_view_ = - AddChildView(&view_holder_, std::move(close_controls_view)); - back_to_tab_controls_view_ = - AddChildView(&view_holder_, std::move(back_to_tab_controls_view)); - previous_track_controls_view_ = - AddChildView(&view_holder_, std::move(previous_track_controls_view)); - play_pause_controls_view_ = - AddChildView(&view_holder_, std::move(play_pause_controls_view)); - next_track_controls_view_ = - AddChildView(&view_holder_, std::move(next_track_controls_view)); + controls_container_view->AddChildView(std::move(close_controls_view)); + back_to_tab_controls_view_ = controls_container_view->AddChildView( + std::move(back_to_tab_controls_view)); + previous_track_controls_view_ = controls_container_view->AddChildView( + std::move(previous_track_controls_view)); + play_pause_controls_view_ = controls_container_view->AddChildView( + std::move(play_pause_controls_view)); + next_track_controls_view_ = controls_container_view->AddChildView( + std::move(next_track_controls_view)); skip_ad_controls_view_ = - AddChildView(&view_holder_, std::move(skip_ad_controls_view)); + controls_container_view->AddChildView(std::move(skip_ad_controls_view)); #if BUILDFLAG(IS_CHROMEOS_ASH) resize_handle_view_ = - AddChildView(&view_holder_, std::move(resize_handle_view)); + controls_container_view->AddChildView(std::move(resize_handle_view)); #endif + controls_container_view_ = + AddChildView(&view_holder_, std::move(controls_container_view)); } void OverlayWindowViews::OnRootViewReady() { @@ -553,18 +562,7 @@ } void OverlayWindowViews::UpdateControlsVisibility(bool is_visible) { - GetControlsScrimLayer()->SetVisible(is_visible); - GetCloseControlsLayer()->SetVisible(is_visible); - GetBackToTabControlsLayer()->SetVisible(is_visible); - previous_track_controls_view_->SetVisible(is_visible && - show_previous_track_button_); - play_pause_controls_view_->SetVisible(is_visible && show_play_pause_button_); - next_track_controls_view_->SetVisible(is_visible && show_next_track_button_); - skip_ad_controls_view_->SetVisible(is_visible && show_skip_ad_button_); - -#if BUILDFLAG(IS_CHROMEOS_ASH) - GetResizeHandleLayer()->SetVisible(is_visible); -#endif + controls_container_view_->SetVisible(is_visible); } void OverlayWindowViews::UpdateControlsBounds() { @@ -584,10 +582,11 @@ } void OverlayWindowViews::OnUpdateControlsBounds() { + controls_container_view_->SetSize(GetBounds().size()); + // Adding an extra pixel to width/height makes sure the scrim covers the // entire window when the platform has fractional scaling applied. - gfx::Rect larger_window_bounds = - gfx::Rect(0, 0, GetBounds().width(), GetBounds().height()); + gfx::Rect larger_window_bounds = gfx::Rect(GetBounds().size()); larger_window_bounds.Inset(-1, -1); controls_scrim_view_->SetBoundsRect(larger_window_bounds); @@ -702,7 +701,10 @@ // This will actually update the visibility of a control that was just added // or removed, see SetPlayPauseButtonVisibility(), etc. - UpdateControlsVisibility(AreControlsVisible()); + previous_track_controls_view_->SetVisible(show_previous_track_button_); + play_pause_controls_view_->SetVisible(show_play_pause_button_); + next_track_controls_view_->SetVisible(show_next_track_button_); + skip_ad_controls_view_->SetVisible(show_skip_ad_button_); } gfx::Rect OverlayWindowViews::CalculateControlsBounds(int x, @@ -1040,7 +1042,7 @@ #endif bool OverlayWindowViews::AreControlsVisible() const { - return controls_scrim_view_->layer()->visible(); + return controls_container_view_->GetVisible(); } bool OverlayWindowViews::IsLayoutPendingForTesting() const { @@ -1048,23 +1050,6 @@ update_controls_bounds_timer_->IsRunning(); } -ui::Layer* OverlayWindowViews::GetControlsScrimLayer() { - return controls_scrim_view_->layer(); -} - -ui::Layer* OverlayWindowViews::GetBackToTabControlsLayer() { - return back_to_tab_controls_view_->layer(); -} - -ui::Layer* OverlayWindowViews::GetCloseControlsLayer() { - return close_controls_view_->layer(); -} -#if BUILDFLAG(IS_CHROMEOS_ASH) -ui::Layer* OverlayWindowViews::GetResizeHandleLayer() { - return resize_handle_view_->layer(); -} -#endif - gfx::Rect OverlayWindowViews::GetWorkAreaForWindow() const { return display::Screen::GetScreen() ->GetDisplayNearestWindow(
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.h b/chrome/browser/ui/views/overlay/overlay_window_views.h index de1b130..190d17e8 100644 --- a/chrome/browser/ui/views/overlay/overlay_window_views.h +++ b/chrome/browser/ui/views/overlay/overlay_window_views.h
@@ -144,12 +144,6 @@ gfx::Rect CalculateControlsBounds(int x, const gfx::Size& size); void UpdateControlsPositions(); - ui::Layer* GetControlsScrimLayer(); - ui::Layer* GetBackToTabControlsLayer(); - ui::Layer* GetCloseControlsLayer(); - ui::Layer* GetResizeHandleLayer(); - ui::Layer* GetControlsParentLayer(); - // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. enum class OverlayWindowControl { @@ -212,6 +206,7 @@ views::View* window_background_view_ = nullptr; views::View* video_view_ = nullptr; views::View* controls_scrim_view_ = nullptr; + views::View* controls_container_view_ = nullptr; views::CloseImageButton* close_controls_view_ = nullptr; views::BackToTabImageButton* back_to_tab_controls_view_ = nullptr; views::TrackImageButton* previous_track_controls_view_ = nullptr;
diff --git a/chrome/browser/ui/views/passwords/credentials_item_view.cc b/chrome/browser/ui/views/passwords/credentials_item_view.cc index f6f3a89..a17182c 100644 --- a/chrome/browser/ui/views/passwords/credentials_item_view.cc +++ b/chrome/browser/ui/views/passwords/credentials_item_view.cc
@@ -26,19 +26,22 @@ #include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/metadata/metadata_header_macros.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/view_class_properties.h" namespace { class CircularImageView : public views::ImageView { public: + METADATA_HEADER(CircularImageView); CircularImageView() = default; + CircularImageView(const CircularImageView&) = delete; + CircularImageView& operator=(const CircularImageView&) = delete; private: // views::ImageView: void OnPaint(gfx::Canvas* canvas) override; - - DISALLOW_COPY_AND_ASSIGN(CircularImageView); }; void CircularImageView::OnPaint(gfx::Canvas* canvas) { @@ -53,6 +56,9 @@ ImageView::OnPaint(canvas); } +BEGIN_METADATA(CircularImageView, views::ImageView) +END_METADATA + } // namespace CredentialsItemView::CredentialsItemView(
diff --git a/chrome/browser/ui/views/profiles/badged_profile_photo.cc b/chrome/browser/ui/views/profiles/badged_profile_photo.cc index a8583609..e5cdfa6 100644 --- a/chrome/browser/ui/views/profiles/badged_profile_photo.cc +++ b/chrome/browser/ui/views/profiles/badged_profile_photo.cc
@@ -12,6 +12,7 @@ #include "ui/gfx/paint_vector_icon.h" #include "ui/native_theme/native_theme.h" #include "ui/views/controls/image_view.h" +#include "ui/views/metadata/metadata_header_macros.h" #include "ui/views/metadata/metadata_impl_macros.h" namespace { @@ -31,15 +32,19 @@ // including the (transparent) border. class CustomImageView : public views::ImageView { public: + METADATA_HEADER(CustomImageView); CustomImageView() = default; + CustomImageView(const CustomImageView&) = delete; + CustomImageView& operator=(const CustomImageView&) = delete; private: // views::ImageView: void OnPaint(gfx::Canvas* canvas) override; - - DISALLOW_COPY_AND_ASSIGN(CustomImageView); }; +BEGIN_METADATA(CustomImageView, views::ImageView) +END_METADATA + void CustomImageView::OnPaint(gfx::Canvas* canvas) { // Remove the part of the ImageView that contains the badge. SkPath mask;
diff --git a/chrome/browser/ui/views/status_icons/status_icon_win.cc b/chrome/browser/ui/views/status_icons/status_icon_win.cc index 4b8cafc..69900a0 100644 --- a/chrome/browser/ui/views/status_icons/status_icon_win.cc +++ b/chrome/browser/ui/views/status_icons/status_icon_win.cc
@@ -8,6 +8,7 @@ #include "base/logging.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "chrome/browser/ui/views/status_icons/status_tray_win.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/geometry/point.h" @@ -107,7 +108,7 @@ NOTIFYICONDATA icon_data; InitIconData(&icon_data); icon_data.uFlags = NIF_TIP; - wcscpy_s(icon_data.szTip, tool_tip.c_str()); + wcscpy_s(icon_data.szTip, base::as_wcstr(tool_tip)); BOOL result = Shell_NotifyIcon(NIM_MODIFY, &icon_data); if (!result) LOG(WARNING) << "Unable to set tooltip for status tray icon"; @@ -122,8 +123,8 @@ InitIconData(&icon_data); icon_data.uFlags = NIF_INFO; icon_data.dwInfoFlags = NIIF_INFO; - wcscpy_s(icon_data.szInfoTitle, title.c_str()); - wcscpy_s(icon_data.szInfo, contents.c_str()); + wcscpy_s(icon_data.szInfoTitle, base::as_wcstr(title)); + wcscpy_s(icon_data.szInfo, base::as_wcstr(contents)); icon_data.uTimeout = 0; if (!icon.isNull()) {
diff --git a/chrome/browser/ui/views/status_icons/status_tray_state_changer_win.cc b/chrome/browser/ui/views/status_icons/status_tray_state_changer_win.cc index bd1cdb6..eb7c95d 100644 --- a/chrome/browser/ui/views/status_icons/status_tray_state_changer_win.cc +++ b/chrome/browser/ui/views/status_icons/status_tray_state_changer_win.cc
@@ -93,7 +93,7 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(notify_item); if (notify_item->hwnd != window_ || notify_item->id != icon_id_ || - base::string16(notify_item->exe_name) != file_name_) { + std::wstring(notify_item->exe_name) != file_name_) { return S_OK; }
diff --git a/chrome/browser/ui/views/status_icons/status_tray_state_changer_win.h b/chrome/browser/ui/views/status_icons/status_tray_state_changer_win.h index a6f9f02..241e032f 100644 --- a/chrome/browser/ui/views/status_icons/status_tray_state_changer_win.h +++ b/chrome/browser/ui/views/status_icons/status_tray_state_changer_win.h
@@ -116,7 +116,7 @@ const HWND window_; // Executable name of the current program. Along with |icon_id_| and // |window_|, this uniquely identifies a notification area entry to Explorer. - base::string16 file_name_; + std::wstring file_name_; // Temporary storage for the matched NOTIFYITEM. This is necessary because // Notify doesn't return anything. The call flow looks like this:
diff --git a/chrome/browser/ui/views/uninstall_view.cc b/chrome/browser/ui/views/uninstall_view.cc index ed53354..2b99247 100644 --- a/chrome/browser/ui/views/uninstall_view.cc +++ b/chrome/browser/ui/views/uninstall_view.cc
@@ -167,7 +167,7 @@ DCHECK_LT(index, static_cast<int>(browsers_->size())); BrowsersMap::const_iterator i = browsers_->begin(); std::advance(i, index); - return i->first; + return base::WideToUTF16(i->first); } BEGIN_METADATA(UninstallView, views::DialogDelegateView)
diff --git a/chrome/browser/ui/views/uninstall_view.h b/chrome/browser/ui/views/uninstall_view.h index c56491b3..bf43bde 100644 --- a/chrome/browser/ui/views/uninstall_view.h +++ b/chrome/browser/ui/views/uninstall_view.h
@@ -6,11 +6,11 @@ #define CHROME_BROWSER_UI_VIEWS_UNINSTALL_VIEW_H_ #include <map> +#include <string> #include "base/callback.h" #include "base/compiler_specific.h" #include "base/macros.h" -#include "base/strings/string16.h" #include "ui/base/models/combobox_model.h" #include "ui/views/metadata/metadata_header_macros.h" #include "ui/views/window/dialog_delegate.h" @@ -39,7 +39,7 @@ base::string16 GetItemAt(int index) const override; private: - typedef std::map<base::string16, base::string16> BrowsersMap; + typedef std::map<std::wstring, std::wstring> BrowsersMap; // Initializes the controls on the dialog. void SetupControls();
diff --git a/chrome/browser/ui/web_applications/web_share_target_browsertest.cc b/chrome/browser/ui/web_applications/web_share_target_browsertest.cc index f38f5bea..97a42aa 100644 --- a/chrome/browser/ui/web_applications/web_share_target_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_share_target_browsertest.cc
@@ -9,6 +9,7 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" #include "base/threading/thread_restrictions.h" #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" @@ -16,6 +17,9 @@ #include "chrome/browser/apps/app_service/intent_util.h" #include "chrome/browser/apps/app_service/launch_utils.h" #include "chrome/browser/chromeos/file_manager/path_util.h" +#include "chrome/browser/sharesheet/sharesheet_service.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h" #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h" #include "chrome/browser/web_applications/components/app_registrar.h" @@ -105,6 +109,23 @@ EXPECT_EQ(expected_url, web_contents->GetVisibleURL()); return web_contents; } + + std::string ExecuteShare(const std::string& script) { + const GURL url = embedded_test_server()->GetURL("/webshare/index.html"); + ui_test_utils::NavigateToURL(browser(), url); + content::WebContents* const contents = + browser()->tab_strip_model()->GetActiveWebContents(); + return content::EvalJs(contents, script).ExtractString(); + } + + content::WebContents* ShareToTarget(const std::string& script) { + ui_test_utils::AllBrowserTabAddedWaiter waiter; + EXPECT_EQ("share succeeded", ExecuteShare(script)); + + content::WebContents* contents = waiter.Wait(); + EXPECT_TRUE(content::WaitForLoadStop(contents)); + return contents; + } }; IN_PROC_BROWSER_TEST_F(WebShareTargetBrowserTest, ShareTextFiles) { @@ -283,4 +304,54 @@ EXPECT_EQ(shared_link, ReadTextContent(web_contents, "link")); } +IN_PROC_BROWSER_TEST_F(WebShareTargetBrowserTest, ShareToPosterWebApp) { + ASSERT_TRUE(embedded_test_server()->Start()); + const GURL app_url = + embedded_test_server()->GetURL("/web_share_target/poster.html"); + const AppId app_id = web_app::InstallWebAppFromManifest(browser(), app_url); + sharesheet::SharesheetService::SetSelectedAppForTesting( + base::UTF8ToUTF16(app_id)); + + // Poster web app does not accept image shares. + EXPECT_EQ("share failed: AbortError: Share canceled", + ExecuteShare("share_single_file()")); + + content::WebContents* web_contents = ShareToTarget("share_title()"); + EXPECT_EQ("Subject", ReadTextContent(web_contents, "headline")); + + web_contents = ShareToTarget("share_url()"); + EXPECT_EQ("https://example.com/", ReadTextContent(web_contents, "link")); +} + +IN_PROC_BROWSER_TEST_F(WebShareTargetBrowserTest, ShareToChartsWebApp) { + ASSERT_TRUE(embedded_test_server()->Start()); + const GURL app_url = + embedded_test_server()->GetURL("/web_share_target/charts.html"); + const AppId app_id = web_app::InstallWebAppFromManifest(browser(), app_url); + sharesheet::SharesheetService::SetSelectedAppForTesting( + base::UTF8ToUTF16(app_id)); + + content::WebContents* web_contents = ShareToTarget("share_single_file()"); + EXPECT_EQ("************", ReadTextContent(web_contents, "notes")); + + web_contents = ShareToTarget("share_url()"); + EXPECT_EQ("https://example.com/", ReadTextContent(web_contents, "link")); +} + +IN_PROC_BROWSER_TEST_F(WebShareTargetBrowserTest, ShareToPartialWild) { + ASSERT_TRUE(embedded_test_server()->Start()); + const GURL app_url = + embedded_test_server()->GetURL("/web_share_target/partial-wild.html"); + const AppId app_id = web_app::InstallWebAppFromManifest(browser(), app_url); + sharesheet::SharesheetService::SetSelectedAppForTesting( + base::UTF8ToUTF16(app_id)); + + // Partial Wild does not accept text shares. + EXPECT_EQ("share failed: AbortError: Share canceled", + ExecuteShare("share_title()")); + + content::WebContents* web_contents = ShareToTarget("share_single_file()"); + EXPECT_EQ("************", ReadTextContent(web_contents, "graphs")); +} + } // namespace web_app
diff --git a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc index 47be5ec..05117099 100644 --- a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc +++ b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
@@ -14,6 +14,7 @@ #include "chrome/grit/bluetooth_internals_resources_map.h" #include "content/public/browser/web_ui_data_source.h" #include "services/network/public/mojom/content_security_policy.mojom.h" +#include "ui/resources/grit/webui_generated_resources.h" #if BUILDFLAG(IS_CHROMEOS_ASH) #include "chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.h" @@ -28,6 +29,8 @@ network::mojom::CSPDirectiveName::ScriptSrc, "script-src chrome://resources chrome://test 'self';"); html_source->DisableTrustedTypesCSP(); + html_source->AddResourcePath("test_loader_util.js", + IDR_WEBUI_JS_TEST_LOADER_UTIL_JS); // Add required resources. webui::AddResourcePathsBulk(
diff --git a/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_ui.cc b/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_ui.cc index 64f5159..33aaf7c 100644 --- a/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_ui.cc +++ b/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_ui.cc
@@ -13,6 +13,7 @@ #include "build/branding_buildflags.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" +#include "chrome/browser/ui/webui/webui_util.h" #include "chrome/common/url_constants.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/browser_resources.h" @@ -81,13 +82,7 @@ : ui::WebDialogUI(web_ui) { content::WebUIDataSource* html_source = content::WebUIDataSource::Create( chrome::kChromeUIAccountMigrationWelcomeHost); - html_source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::ScriptSrc, - "script-src chrome://resources chrome://test 'self';"); - html_source->DisableTrustedTypesCSP(); - - html_source->UseStringsJs(); - html_source->EnableReplaceI18nInJS(); + webui::SetJSModuleDefaults(html_source); // Add localized strings. html_source->AddLocalizedString("welcomePageTitle", @@ -117,9 +112,6 @@ html_source->AddResourcePath("googleg.svg", IDR_ACCOUNT_MANAGER_WELCOME_GOOGLE_LOGO_SVG); #endif - html_source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); - html_source->AddResourcePath("test_loader.html", - IDR_WEBUI_HTML_TEST_LOADER_HTML); html_source->SetDefaultResource(IDR_ACCOUNT_MIGRATION_WELCOME_HTML); web_ui->AddMessageHandler(std::make_unique<MigrationMessageHandler>(
diff --git a/chrome/browser/ui/webui/chromeos/add_supervision/DIR_METADATA b/chrome/browser/ui/webui/chromeos/add_supervision/DIR_METADATA new file mode 100644 index 0000000..c0ebf85 --- /dev/null +++ b/chrome/browser/ui/webui/chromeos/add_supervision/DIR_METADATA
@@ -0,0 +1,3 @@ +monorail { + component: "FamilyExperiences" +} \ No newline at end of file
diff --git a/chrome/browser/ui/webui/chromeos/add_supervision/OWNERS b/chrome/browser/ui/webui/chromeos/add_supervision/OWNERS index 08850f4..046a70f 100644 --- a/chrome/browser/ui/webui/chromeos/add_supervision/OWNERS +++ b/chrome/browser/ui/webui/chromeos/add_supervision/OWNERS
@@ -1,2 +1,4 @@ +danan@chromium.org + per-file *.mojom=set noparent per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc b/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc index c9b58c2..ddd95d7 100644 --- a/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc +++ b/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc
@@ -373,7 +373,7 @@ jank_detector_ = std::make_unique<arc::ArcGraphicsJankDetector>(base::BindRepeating( &ArcGraphicsTracingHandler::OnJankDetected, base::Unretained(this))); - exo::Surface* const surface = exo::GetShellMainSurface(arc_active_window_); + exo::Surface* const surface = exo::GetShellRootSurface(arc_active_window_); DCHECK(surface); surface->AddSurfaceObserver(this); } @@ -451,7 +451,7 @@ if (!arc_active_window_) return; - exo::Surface* const surface = exo::GetShellMainSurface(arc_active_window_); + exo::Surface* const surface = exo::GetShellRootSurface(arc_active_window_); if (surface) surface->RemoveSurfaceObserver(this);
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc index dd70cc4..ac58362 100644 --- a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc +++ b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
@@ -139,10 +139,7 @@ content::WebUIDataSource* source = content::WebUIDataSource::Create(chrome::kChromeUICrostiniInstallerHost); auto* profile = Profile::FromWebUI(web_ui); - source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::ScriptSrc, - "script-src chrome://resources chrome://test 'self';"); - source->DisableTrustedTypesCSP(); + webui::SetJSModuleDefaults(source); AddStringResources(source); source->AddBoolean( "diskResizingEnabled", @@ -157,13 +154,9 @@ IDR_CROSTINI_INSTALLER_MOJO_LITE_JS); source->AddResourcePath("crostini_types.mojom-lite.js", IDR_CROSTINI_INSTALLER_TYPES_MOJO_LITE_JS); - source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); - source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); source->AddResourcePath("images/linux_illustration.png", IDR_LINUX_ILLUSTRATION); source->SetDefaultResource(IDR_CROSTINI_INSTALLER_INDEX_HTML); - source->UseStringsJs(); - source->EnableReplaceI18nInJS(); content::WebUIDataSource::Add(profile, source); }
diff --git a/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc b/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc index cea4b90..836be9a 100644 --- a/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc +++ b/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
@@ -100,10 +100,7 @@ : ui::MojoWebDialogUI{web_ui} { content::WebUIDataSource* source = content::WebUIDataSource::Create(chrome::kChromeUICrostiniUpgraderHost); - source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::ScriptSrc, - "script-src chrome://resources chrome://test 'self';"); - source->DisableTrustedTypesCSP(); + webui::SetJSModuleDefaults(source); AddStringResources(source); source->AddResourcePath("images/linux_illustration.png", @@ -117,11 +114,7 @@ IDR_CROSTINI_UPGRADER_BROWSER_PROXY_JS); source->AddResourcePath("crostini_upgrader.mojom-lite.js", IDR_CROSTINI_UPGRADER_MOJO_LITE_JS); - source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); - source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); source->SetDefaultResource(IDR_CROSTINI_UPGRADER_INDEX_HTML); - source->UseStringsJs(); - source->EnableReplaceI18nInJS(); content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source); }
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence/DIR_METADATA b/chrome/browser/ui/webui/chromeos/edu_coexistence/DIR_METADATA new file mode 100644 index 0000000..c0ebf85 --- /dev/null +++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/DIR_METADATA
@@ -0,0 +1,3 @@ +monorail { + component: "FamilyExperiences" +} \ No newline at end of file
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence/OWNERS b/chrome/browser/ui/webui/chromeos/edu_coexistence/OWNERS new file mode 100644 index 0000000..5bfa5595 --- /dev/null +++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/OWNERS
@@ -0,0 +1,3 @@ +agawronska@chromium.org +danan@chromium.org +yilkal@chromium.org \ No newline at end of file
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence_login_handler_browsertest.cc b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_browsertest.cc similarity index 97% rename from chrome/browser/ui/webui/chromeos/edu_coexistence_login_handler_browsertest.cc rename to chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_browsertest.cc index 9c4b1952..b9fef64 100644 --- a/chrome/browser/ui/webui/chromeos/edu_coexistence_login_handler_browsertest.cc +++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_browsertest.cc
@@ -2,7 +2,7 @@ // 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/edu_coexistence_login_handler_chromeos.h" +#include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h" #include <memory> #include <string> @@ -20,7 +20,7 @@ #include "chrome/browser/supervised_user/supervised_user_features.h" #include "chrome/browser/supervised_user/supervised_user_service.h" #include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/webui/chromeos/edu_coexistence_state_tracker.h" +#include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/mixin_based_in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h"
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence_login_handler_chromeos.cc b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc similarity index 98% rename from chrome/browser/ui/webui/chromeos/edu_coexistence_login_handler_chromeos.cc rename to chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc index 851184b..e4f9f163 100644 --- a/chrome/browser/ui/webui/chromeos/edu_coexistence_login_handler_chromeos.cc +++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc
@@ -2,7 +2,7 @@ // 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/edu_coexistence_login_handler_chromeos.h" +#include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h" #include <memory> #include <utility> @@ -27,7 +27,7 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/signin/chrome_device_id_helper.h" #include "chrome/browser/signin/identity_manager_factory.h" -#include "chrome/browser/ui/webui/chromeos/edu_coexistence_state_tracker.h" +#include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h" #include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" #include "chrome/common/channel_info.h" #include "components/policy/core/common/cloud/cloud_policy_core.h"
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence_login_handler_chromeos.h b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h similarity index 91% rename from chrome/browser/ui/webui/chromeos/edu_coexistence_login_handler_chromeos.h rename to chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h index 8b438cb..8a616952 100644 --- a/chrome/browser/ui/webui/chromeos/edu_coexistence_login_handler_chromeos.h +++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h
@@ -2,8 +2,8 @@ // 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_EDU_COEXISTENCE_LOGIN_HANDLER_CHROMEOS_H_ -#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_EDU_COEXISTENCE_LOGIN_HANDLER_CHROMEOS_H_ +#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_EDU_COEXISTENCE_EDU_COEXISTENCE_LOGIN_HANDLER_CHROMEOS_H_ +#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_EDU_COEXISTENCE_EDU_COEXISTENCE_LOGIN_HANDLER_CHROMEOS_H_ #include <string> @@ -91,4 +91,4 @@ } // namespace chromeos -#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_EDU_COEXISTENCE_LOGIN_HANDLER_CHROMEOS_H_ +#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_EDU_COEXISTENCE_EDU_COEXISTENCE_LOGIN_HANDLER_CHROMEOS_H_
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence_state_tracker.cc b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.cc similarity index 97% rename from chrome/browser/ui/webui/chromeos/edu_coexistence_state_tracker.cc rename to chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.cc index 9c66876..29a0066 100644 --- a/chrome/browser/ui/webui/chromeos/edu_coexistence_state_tracker.cc +++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.cc
@@ -2,7 +2,7 @@ // 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/edu_coexistence_state_tracker.h" +#include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h" #include <utility>
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence_state_tracker.h b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h similarity index 93% rename from chrome/browser/ui/webui/chromeos/edu_coexistence_state_tracker.h rename to chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h index a968b96..da10ea7 100644 --- a/chrome/browser/ui/webui/chromeos/edu_coexistence_state_tracker.h +++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h
@@ -2,8 +2,8 @@ // 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_EDU_COEXISTENCE_STATE_TRACKER_H_ -#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_EDU_COEXISTENCE_STATE_TRACKER_H_ +#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_EDU_COEXISTENCE_EDU_COEXISTENCE_STATE_TRACKER_H_ +#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_EDU_COEXISTENCE_EDU_COEXISTENCE_STATE_TRACKER_H_ #include <map> #include <string> @@ -123,4 +123,4 @@ } // namespace chromeos -#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_EDU_COEXISTENCE_STATE_TRACKER_H_ +#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_EDU_COEXISTENCE_EDU_COEXISTENCE_STATE_TRACKER_H_
diff --git a/chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.cc b/chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.cc index 04d7fd9d..db99acd 100644 --- a/chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.cc +++ b/chrome/browser/ui/webui/chromeos/emoji/emoji_dialog.cc
@@ -49,8 +49,8 @@ std::vector<content::WebUIMessageHandler*>* handlers) const {} void EmojiPickerDialog::GetDialogSize(gfx::Size* size) const { - const int kDefaultWidth = 280; - const int kDefaultHeight = 343; + const int kDefaultWidth = 340; + const int kDefaultHeight = 390; size->SetSize(kDefaultWidth, kDefaultHeight); }
diff --git a/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.cc b/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.cc index b5f63a64..227a863 100644 --- a/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.cc +++ b/chrome/browser/ui/webui/chromeos/emoji/emoji_picker.cc
@@ -37,10 +37,6 @@ base::make_span(kEmojiPickerResources, kEmojiPickerResourcesSize), IDR_EMOJI_PICKER_INDEX_HTML); - html_source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); - html_source->AddResourcePath("test_loader.html", - IDR_WEBUI_HTML_TEST_LOADER_HTML); - // Attach message handler to handle emoji click events. web_ui->AddMessageHandler(std::make_unique<EmojiHandler>());
diff --git a/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc b/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc index 182656e..9cfbc6d7 100644 --- a/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc +++ b/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc
@@ -12,8 +12,8 @@ #include "base/macros.h" #include "base/strings/string_number_conversions.h" #include "base/values.h" -#include "chrome/browser/chromeos/system/fake_input_device_settings.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" +#include "chrome/browser/ash/system/fake_input_device_settings.h" +#include "chrome/browser/ash/system/input_device_settings.h" #include "chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.h" #include "chromeos/dbus/audio/fake_cras_audio_client.h" #include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.h b/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.h index 4d99b15..e30f5b61 100644 --- a/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.h +++ b/chrome/browser/ui/webui/chromeos/emulator/device_emulator_message_handler.h
@@ -10,7 +10,7 @@ #include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" -#include "chrome/browser/chromeos/system/pointer_device_observer.h" +#include "chrome/browser/ash/system/pointer_device_observer.h" #include "chromeos/dbus/power_manager/power_supply_properties.pb.h" #include "content/public/browser/web_ui_message_handler.h" #include "device/bluetooth/bluetooth_adapter.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc index 6faa3c4..da8302f1 100644 --- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -18,6 +18,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "build/branding_buildflags.h" +#include "chrome/browser/ash/system/input_device_settings.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/login/configuration_keys.h" @@ -29,7 +30,6 @@ #include "chrome/browser/chromeos/login/ui/login_display_host.h" #include "chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.h" #include "chrome/browser/chromeos/login/wizard_controller.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" #include "chrome/browser/ui/ash/ash_util.h" #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h" #include "chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index aa5ac9d..4a99cd4 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -23,6 +23,7 @@ #include "base/system/sys_info.h" #include "base/values.h" #include "build/branding_buildflags.h" +#include "chrome/browser/ash/system/input_device_settings.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/login/enrollment/auto_enrollment_check_screen_view.h" @@ -35,7 +36,6 @@ #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/policy/enrollment_requisition_manager.h" #include "chrome/browser/chromeos/settings/shutdown_policy_handler.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" #include "chrome/browser/extensions/tab_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc index 3fcc442..f8dcd561 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -28,6 +28,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/trace_event.h" #include "chrome/browser/ash/app_mode/kiosk_app_manager.h" +#include "chrome/browser/ash/system/system_clock.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part_chromeos.h" #include "chrome/browser/chrome_notification_types.h" @@ -52,7 +53,6 @@ #include "chrome/browser/chromeos/policy/device_local_account.h" #include "chrome/browser/chromeos/policy/minimum_version_policy_handler.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/chromeos/system/system_clock.h" #include "chrome/browser/lifetime/browser_shutdown.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_metrics.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc index f152655..ae7e2ea 100644 --- a/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc
@@ -17,12 +17,12 @@ #include "base/values.h" #include "chrome/browser/ash/accessibility/accessibility_manager.h" #include "chrome/browser/ash/accessibility/magnification_manager.h" +#include "chrome/browser/ash/system/input_device_settings.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/login/demo_mode/demo_session.h" #include "chrome/browser/chromeos/login/screens/welcome_screen.h" #include "chrome/browser/chromeos/login/ui/input_events_blocker.h" -#include "chrome/browser/chromeos/system/input_device_settings.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h" #include "chrome/browser/ui/webui/chromeos/login/l10n_util.h" #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
diff --git a/chrome/browser/ui/webui/chromeos/set_time_ui.cc b/chrome/browser/ui/webui/chromeos/set_time_ui.cc index 58950b6..4f84d47 100644 --- a/chrome/browser/ui/webui/chromeos/set_time_ui.cc +++ b/chrome/browser/ui/webui/chromeos/set_time_ui.cc
@@ -16,10 +16,10 @@ #include "base/macros.h" #include "base/scoped_observation.h" #include "base/values.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.h" #include "chrome/browser/chromeos/set_time_dialog.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/webui_util.h" #include "chrome/common/url_constants.h" @@ -175,11 +175,7 @@ // Set up the chrome://set-time source. content::WebUIDataSource* source = content::WebUIDataSource::Create(chrome::kChromeUISetTimeHost); - source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::ScriptSrc, - "script-src chrome://resources chrome://test 'self';"); - source->DisableTrustedTypesCSP(); - + webui::SetJSModuleDefaults(source); static constexpr webui::LocalizedString kStrings[] = { {"setTimeTitle", IDS_SET_TIME_TITLE}, {"prompt", IDS_SET_TIME_PROMPT}, @@ -202,17 +198,12 @@ values.SetDouble("buildTime", base::GetBuildTime().ToJsTime()); source->AddLocalizedStrings(values); - source->UseStringsJs(); - source->EnableReplaceI18nInJS(); source->AddResourcePath("set_time_browser_proxy.js", IDR_SET_TIME_BROWSER_PROXY_JS); source->AddResourcePath("set_time_dialog.js", IDR_SET_TIME_DIALOG_JS); source->SetDefaultResource(IDR_SET_TIME_HTML); - source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); - source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); - content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source); }
diff --git a/chrome/browser/ui/webui/invalidations/invalidations_message_handler.cc b/chrome/browser/ui/webui/invalidations/invalidations_message_handler.cc index a56c8de4..5653f0c 100644 --- a/chrome/browser/ui/webui/invalidations/invalidations_message_handler.cc +++ b/chrome/browser/ui/webui/invalidations/invalidations_message_handler.cc
@@ -33,10 +33,7 @@ InvalidationsMessageHandler::InvalidationsMessageHandler() : logger_(nullptr) {} -InvalidationsMessageHandler::~InvalidationsMessageHandler() { - if (logger_) - logger_->UnregisterObserver(this); -} +InvalidationsMessageHandler::~InvalidationsMessageHandler() = default; void InvalidationsMessageHandler::RegisterMessages() { web_ui()->RegisterMessageCallback( @@ -49,7 +46,13 @@ base::Unretained(this))); } +void InvalidationsMessageHandler::OnJavascriptDisallowed() { + if (logger_) + logger_->UnregisterObserver(this); +} + void InvalidationsMessageHandler::UIReady(const base::ListValue* args) { + AllowJavascript(); invalidation::ProfileInvalidationProvider* invalidation_provider = GetInvalidationProvider(Profile::FromWebUI(web_ui())); if (invalidation_provider) { @@ -84,17 +87,15 @@ ++it) { list_of_handlers.AppendString(*it); } - web_ui()->CallJavascriptFunctionUnsafe("chrome.invalidations.updateHandlers", - list_of_handlers); + FireWebUIListener("handlers-updated", list_of_handlers); } void InvalidationsMessageHandler::OnStateChange( const invalidation::InvalidatorState& new_state, const base::Time& last_changed_timestamp) { std::string state(invalidation::InvalidatorStateToString(new_state)); - web_ui()->CallJavascriptFunctionUnsafe( - "chrome.invalidations.updateInvalidatorState", base::Value(state), - base::Value(last_changed_timestamp.ToJsTime())); + FireWebUIListener("state-updated", base::Value(state), + base::Value(last_changed_timestamp.ToJsTime())); } void InvalidationsMessageHandler::OnUpdatedTopics( @@ -112,9 +113,7 @@ dic->SetInteger("totalCount", topic_item.second); list_of_objects.Append(std::move(dic)); } - web_ui()->CallJavascriptFunctionUnsafe("chrome.invalidations.updateIds", - base::Value(handler_name), - list_of_objects); + FireWebUIListener("update-ids", base::Value(handler_name), list_of_objects); } void InvalidationsMessageHandler::OnDebugMessage( const base::DictionaryValue& details) {} @@ -123,12 +122,10 @@ const invalidation::TopicInvalidationMap& new_invalidations) { std::unique_ptr<base::ListValue> invalidations_list = new_invalidations.ToValue(); - web_ui()->CallJavascriptFunctionUnsafe( - "chrome.invalidations.logInvalidations", *invalidations_list); + FireWebUIListener("log-invalidations", *invalidations_list); } void InvalidationsMessageHandler::OnDetailedStatus( const base::DictionaryValue& network_details) { - web_ui()->CallJavascriptFunctionUnsafe( - "chrome.invalidations.updateDetailedStatus", network_details); + FireWebUIListener("detailed-status-updated", network_details); }
diff --git a/chrome/browser/ui/webui/invalidations/invalidations_message_handler.h b/chrome/browser/ui/webui/invalidations/invalidations_message_handler.h index 7331887..9847011 100644 --- a/chrome/browser/ui/webui/invalidations/invalidations_message_handler.h +++ b/chrome/browser/ui/webui/invalidations/invalidations_message_handler.h
@@ -42,6 +42,7 @@ // Implementation of WebUIMessageHandler. void RegisterMessages() override; + void OnJavascriptDisallowed() override; // Triggers the logger to send the current state and objects ids. void UpdateContent(const base::ListValue* args);
diff --git a/chrome/browser/ui/webui/invalidations/invalidations_ui.cc b/chrome/browser/ui/webui/invalidations/invalidations_ui.cc index 4b97b20..2ad9656 100644 --- a/chrome/browser/ui/webui/invalidations/invalidations_ui.cc +++ b/chrome/browser/ui/webui/invalidations/invalidations_ui.cc
@@ -16,6 +16,7 @@ #include "content/public/browser/web_ui_data_source.h" #include "content/public/browser/web_ui_message_handler.h" #include "services/network/public/mojom/content_security_policy.mojom.h" +#include "ui/resources/grit/webui_generated_resources.h" content::WebUIDataSource* CreateInvalidationsHTMLSource() { // This is done once per opening of the page @@ -24,10 +25,10 @@ content::WebUIDataSource::Create(chrome::kChromeUIInvalidationsHost); source->OverrideContentSecurityPolicy( network::mojom::CSPDirectiveName::ScriptSrc, - "script-src chrome://resources 'self' 'unsafe-eval';"); - source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::TrustedTypes, - "trusted-types jstemplate;"); + "script-src chrome://resources chrome://test 'self' 'unsafe-eval';"); + source->AddResourcePath("test_loader_util.js", + IDR_WEBUI_JS_TEST_LOADER_UTIL_JS); + source->DisableTrustedTypesCSP(); webui::AddResourcePathsBulk( source, base::make_span(kInvalidationsResources, kInvalidationsResourcesSize));
diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc index 6944636..685a9bd4 100644 --- a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc +++ b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
@@ -35,6 +35,7 @@ #include "services/network/expect_ct_reporter.h" #include "services/network/public/mojom/content_security_policy.mojom.h" #include "services/network/public/mojom/network_context.mojom.h" +#include "ui/resources/grit/webui_generated_resources.h" using content::BrowserThread; @@ -50,6 +51,8 @@ source->OverrideContentSecurityPolicy( network::mojom::CSPDirectiveName::ScriptSrc, "script-src chrome://resources chrome://test 'self';"); + source->AddResourcePath("test_loader_util.js", + IDR_WEBUI_JS_TEST_LOADER_UTIL_JS); source->DisableTrustedTypesCSP(); return source; }
diff --git a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc index b8959ba..90ad9742 100644 --- a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc +++ b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
@@ -16,9 +16,7 @@ #include "base/containers/contains.h" #include "base/feature_list.h" #include "base/i18n/rtl.h" -#include "base/metrics/field_trial.h" #include "base/metrics/histogram_functions.h" -#include "base/metrics/histogram_macros.h" #include "base/optional.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -1062,10 +1060,6 @@ return; DCHECK(!FromBookmark(extension)); - UMA_HISTOGRAM_ENUMERATION("Apps.AppInfoDialog.Launches", - AppInfoLaunchSource::FROM_APPS_PAGE, - AppInfoLaunchSource::NUM_LAUNCH_SOURCES); - ShowAppInfoInNativeDialog(web_ui()->GetWebContents(), Profile::FromWebUI(web_ui()), extension, base::DoNothing());
diff --git a/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc b/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc index 848db95e..1a9cae2 100644 --- a/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc +++ b/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
@@ -43,8 +43,9 @@ auto value = std::make_unique<base::ListValue>(); for (const base::FilePath& path : files) { auto item = std::make_unique<base::DictionaryValue>(); - item->SetString("dirname", path.DirName().AsEndingWithSeparator().value()); - item->SetString("basename", path.BaseName().value()); + item->SetString("dirname", + path.DirName().AsEndingWithSeparator().AsUTF8Unsafe()); + item->SetString("basename", path.BaseName().AsUTF8Unsafe()); value->Append(std::move(item)); } return value;
diff --git a/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc b/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc index b9b9eb4..1c5867a6 100644 --- a/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
@@ -11,12 +11,12 @@ #include "base/command_line.h" #include "base/time/time.h" #include "base/values.h" +#include "chrome/browser/ash/system/timezone_resolver_manager.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.h" #include "chrome/browser/chromeos/set_time_dialog.h" -#include "chrome/browser/chromeos/system/timezone_resolver_manager.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/common/pref_names.h" #include "chromeos/dbus/system_clock/system_clock_client.h" #include "chromeos/settings/timezone_settings.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/date_time_section.cc b/chrome/browser/ui/webui/settings/chromeos/date_time_section.cc index 37705412..37af30c4 100644 --- a/chrome/browser/ui/webui/settings/chromeos/date_time_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/date_time_section.cc
@@ -7,8 +7,8 @@ #include "base/no_destructor.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/chromeos/system/timezone_util.h" #include "chrome/browser/ui/webui/settings/chromeos/date_time_handler.h" #include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h" #include "chrome/browser/ui/webui/webui_util.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_pointer_handler.h b/chrome/browser/ui/webui/settings/chromeos/device_pointer_handler.h index adc1b28..676b25c 100644 --- a/chrome/browser/ui/webui/settings/chromeos/device_pointer_handler.h +++ b/chrome/browser/ui/webui/settings/chromeos/device_pointer_handler.h
@@ -8,7 +8,7 @@ #include <memory> #include "base/macros.h" -#include "chrome/browser/chromeos/system/pointer_device_observer.h" +#include "chrome/browser/ash/system/pointer_device_observer.h" #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" namespace base {
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_section.cc b/chrome/browser/ui/webui/settings/chromeos/device_section.cc index 0b80910..b391c48 100644 --- a/chrome/browser/ui/webui/settings/chromeos/device_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/device_section.cc
@@ -198,6 +198,18 @@ return *tags; } +const std::vector<SearchConcept>& GetMouseScrollAccelerationSearchConcepts() { + static const base::NoDestructor<std::vector<SearchConcept>> tags({ + {IDS_OS_SETTINGS_TAG_MOUSE_SCROLL_ACCELERATION, + mojom::kPointersSubpagePath, + mojom::SearchResultIcon::kMouse, + mojom::SearchResultDefaultRank::kMedium, + mojom::SearchResultType::kSetting, + {.setting = mojom::Setting::kMouseScrollAcceleration}}, + }); + return *tags; +} + const std::vector<SearchConcept>& GetMouseSearchConcepts() { static const base::NoDestructor<std::vector<SearchConcept>> tags({ {IDS_OS_SETTINGS_TAG_MOUSE_ACCELERATION, @@ -230,12 +242,6 @@ mojom::SearchResultDefaultRank::kMedium, mojom::SearchResultType::kSubpage, {.subpage = mojom::Subpage::kPointers}}, - {IDS_OS_SETTINGS_TAG_MOUSE_SCROLL_ACCELERATION, - mojom::kPointersSubpagePath, - mojom::SearchResultIcon::kMouse, - mojom::SearchResultDefaultRank::kMedium, - mojom::SearchResultType::kSetting, - {.setting = mojom::Setting::kMouseScrollAcceleration}}, }); return *tags; } @@ -472,6 +478,11 @@ return *tags; } +bool AreScrollSettingsAllowed() { + return base::FeatureList::IsEnabled( + ::chromeos::features::kAllowScrollSettings); +} + bool IsUnifiedDesktopAvailable() { return base::CommandLine::ForCurrentProcess()->HasSwitch( ::switches::kEnableUnifiedDesktop); @@ -1020,11 +1031,14 @@ void DeviceSection::MouseExists(bool exists) { SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate(); + updater.RemoveSearchTags(GetMouseSearchConcepts()); + updater.RemoveSearchTags(GetMouseScrollAccelerationSearchConcepts()); - if (exists) + if (exists) { updater.AddSearchTags(GetMouseSearchConcepts()); - else - updater.RemoveSearchTags(GetMouseSearchConcepts()); + if (AreScrollSettingsAllowed()) + updater.AddSearchTags(GetMouseScrollAccelerationSearchConcepts()); + } } void DeviceSection::PointingStickExists(bool exists) { @@ -1213,9 +1227,7 @@ html_source->AddBoolean( "allowDisableMouseAcceleration", base::FeatureList::IsEnabled(::features::kAllowDisableMouseAcceleration)); - html_source->AddBoolean( - "allowScrollSettings", - base::FeatureList::IsEnabled(::chromeos::features::kAllowScrollSettings)); + html_source->AddBoolean("allowScrollSettings", AreScrollSettingsAllowed()); html_source->AddBoolean( "separatePointingStickSettings", base::FeatureList::IsEnabled(::features::kSeparatePointingStickSettings));
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_section.h b/chrome/browser/ui/webui/settings/chromeos/device_section.h index 47bae70..7f05679 100644 --- a/chrome/browser/ui/webui/settings/chromeos/device_section.h +++ b/chrome/browser/ui/webui/settings/chromeos/device_section.h
@@ -12,7 +12,7 @@ #include "base/memory/weak_ptr.h" #include "base/optional.h" #include "base/values.h" -#include "chrome/browser/chromeos/system/pointer_device_observer.h" +#include "chrome/browser/ash/system/pointer_device_observer.h" #include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h" #include "chromeos/dbus/power/power_manager_client.h" #include "mojo/public/cpp/bindings/associated_receiver.h"
diff --git a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.cc b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.cc index 09d0d158..19fc430 100644 --- a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.cc +++ b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.cc
@@ -41,6 +41,8 @@ "script-src chrome://resources chrome://test 'self';"); source->DisableTrustedTypesCSP(); source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); + source->AddResourcePath("test_loader_util.js", + IDR_WEBUI_JS_TEST_LOADER_UTIL_JS); source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc index 7975d7d..d22510b 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc +++ b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
@@ -24,7 +24,7 @@ #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/supervised_user/supervised_user_features.h" #include "chrome/browser/ui/browser_commands.h" -#include "chrome/browser/ui/webui/chromeos/edu_coexistence_state_tracker.h" +#include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h" #include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" #include "chrome/browser/ui/webui/signin/inline_login_handler.h" #include "chrome/browser/ui/webui/signin/signin_helper_chromeos.h"
diff --git a/chrome/browser/ui/webui/signin/inline_login_ui.cc b/chrome/browser/ui/webui/signin/inline_login_ui.cc index e96de2f0..748e71c 100644 --- a/chrome/browser/ui/webui/signin/inline_login_ui.cc +++ b/chrome/browser/ui/webui/signin/inline_login_ui.cc
@@ -41,7 +41,7 @@ #include "chrome/browser/supervised_user/supervised_user_features.h" #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h" -#include "chrome/browser/ui/webui/chromeos/edu_coexistence_login_handler_chromeos.h" +#include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h" #include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h" #include "chrome/browser/ui/webui/signin/inline_login_handler_chromeos.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ui/webui/signin/profile_customization_ui.cc b/chrome/browser/ui/webui/signin/profile_customization_ui.cc index af16c54..ef913d5 100644 --- a/chrome/browser/ui/webui/signin/profile_customization_ui.cc +++ b/chrome/browser/ui/webui/signin/profile_customization_ui.cc
@@ -29,6 +29,7 @@ customize_themes_factory_receiver_(this) { content::WebUIDataSource* source = content::WebUIDataSource::Create( chrome::kChromeUIProfileCustomizationHost); + webui::SetJSModuleDefaults(source); source->SetDefaultResource(IDR_PROFILE_CUSTOMIZATION_HTML); source->AddResourcePath("profile_customization_app.js", IDR_PROFILE_CUSTOMIZATION_APP_JS); @@ -38,8 +39,6 @@ source->AddResourcePath("signin_vars_css.js", IDR_SIGNIN_VARS_CSS_JS); // Localized strings. - source->UseStringsJs(); - source->EnableReplaceI18nInJS(); static constexpr webui::LocalizedString kLocalizedStrings[] = { {"profileCustomizationDoneLabel", IDS_PROFILE_CUSTOMIZATION_DONE_BUTTON_LABEL}, @@ -64,14 +63,6 @@ source->AddString("profileName", base::UTF16ToUTF8(entry->GetLocalProfileName())); - // Resources for testing. - source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::ScriptSrc, - "script-src chrome://resources chrome://test 'self';"); - source->DisableTrustedTypesCSP(); - source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); - source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); - content::WebUIDataSource::Add(profile, source); }
diff --git a/chrome/browser/ui/webui/signin/signin_reauth_ui.cc b/chrome/browser/ui/webui/signin/signin_reauth_ui.cc index 9b5f00e..35b666a 100644 --- a/chrome/browser/ui/webui/signin/signin_reauth_ui.cc +++ b/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
@@ -16,6 +16,7 @@ #include "chrome/browser/signin/reauth_util.h" #include "chrome/browser/ui/signin_reauth_view_controller.h" #include "chrome/browser/ui/webui/signin/signin_reauth_handler.h" +#include "chrome/browser/ui/webui/webui_util.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/browser_resources.h" #include "chrome/grit/generated_resources.h" @@ -62,8 +63,7 @@ Profile* profile = Profile::FromWebUI(web_ui); content::WebUIDataSource* source = content::WebUIDataSource::Create(chrome::kChromeUISigninReauthHost); - source->UseStringsJs(); - source->EnableReplaceI18nInJS(); + webui::SetJSModuleDefaults(source); source->SetDefaultResource(IDR_SIGNIN_REAUTH_HTML); source->AddResourcePath("signin_reauth_app.js", IDR_SIGNIN_REAUTH_APP_JS); source->AddResourcePath("signin_reauth_browser_proxy.js", @@ -71,14 +71,6 @@ source->AddResourcePath("signin_shared_css.js", IDR_SIGNIN_SHARED_CSS_JS); source->AddString("accountImageUrl", GetAccountImageURL(profile)); - // Resources for testing. - source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::ScriptSrc, - "script-src chrome://resources chrome://test 'self';"); - source->DisableTrustedTypesCSP(); - source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); - source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); - // Resources for the account passwords reauth. source->AddResourcePath( "images/signin_reauth_illustration.svg",
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc b/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc index 0562c53a..d491ad9 100644 --- a/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc +++ b/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
@@ -91,6 +91,8 @@ base::Optional<SkColor> profile_creation_flow_color) { // Resources for testing. source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); + source->AddResourcePath("test_loader_util.js", + IDR_WEBUI_JS_TEST_LOADER_UTIL_JS); source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); source->OverrideContentSecurityPolicy( network::mojom::CSPDirectiveName::ScriptSrc,
diff --git a/chrome/browser/ui/webui/tab_search/tab_search.mojom b/chrome/browser/ui/webui/tab_search/tab_search.mojom index e1721ec..e2f0d58 100644 --- a/chrome/browser/ui/webui/tab_search/tab_search.mojom +++ b/chrome/browser/ui/webui/tab_search/tab_search.mojom
@@ -6,14 +6,15 @@ import "mojo/public/mojom/base/time.mojom"; -// Collection of WindowTabs of a profile. -struct ProfileTabs { - array<WindowTabs> windows; +// Collection of window details associated with a profile. +struct ProfileData { + array<Window> windows; }; -// Collection of Tab of a window. -struct WindowTabs { +// Properties and tabs associated with a window. +struct Window { bool active; + uint32 height; array<Tab> tabs; }; @@ -83,8 +84,8 @@ // Close a specific tab. CloseTab(int32 tab_id); - // Get tabs grouped by windows for the current profile. - GetProfileTabs() => (ProfileTabs profile_tabs); + // Get window and tab data for the current profile. + GetProfileData() => (ProfileData profile_data); // Get tab groups for the current profile. GetTabGroups() => (TabGroups tab_groups); @@ -109,7 +110,7 @@ // moved or replaced. // `profile_tabs` is a collection of all open tabs in the current profile. // This is always populated with at least 1 (the currently active) tab. - TabsChanged(ProfileTabs profile_tabs); + TabsChanged(ProfileData profile_tabs); // Called when a tab's data has changed and we need only issue an update for // that specific tab in the JS's data structures. Typically used for url,
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc index 779859e1..93046beb 100644 --- a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc +++ b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc
@@ -87,9 +87,9 @@ // Do not add code past this point. } -void TabSearchPageHandler::GetProfileTabs(GetProfileTabsCallback callback) { +void TabSearchPageHandler::GetProfileData(GetProfileDataCallback callback) { TRACE_EVENT0("browser", "custom_metric:TabSearchPageHandler:GetProfileTabs"); - auto profile_tabs = CreateProfileTabs(); + auto profile_tabs = CreateProfileData(); // On first run record the number of windows and tabs open for the given // profile. if (!sent_initial_payload_) { @@ -159,21 +159,22 @@ embedder->ShowUI(); } -tab_search::mojom::ProfileTabsPtr TabSearchPageHandler::CreateProfileTabs() { - auto profile_tabs = tab_search::mojom::ProfileTabs::New(); +tab_search::mojom::ProfileDataPtr TabSearchPageHandler::CreateProfileData() { + auto profile_data = tab_search::mojom::ProfileData::New(); for (auto* browser : *BrowserList::GetInstance()) { if (!ShouldTrackBrowser(browser)) continue; TabStripModel* tab_strip_model = browser->tab_strip_model(); - auto window_tabs = tab_search::mojom::WindowTabs::New(); - window_tabs->active = (browser == browser_); + auto window = tab_search::mojom::Window::New(); + window->active = (browser == browser_); + window->height = browser->window()->GetContentsSize().height(); for (int i = 0; i < tab_strip_model->count(); ++i) { - window_tabs->tabs.push_back( + window->tabs.push_back( GetTabData(tab_strip_model, tab_strip_model->GetWebContentsAt(i), i)); } - profile_tabs->windows.push_back(std::move(window_tabs)); + profile_data->windows.push_back(std::move(window)); } - return profile_tabs; + return profile_data; } tab_search::mojom::TabPtr TabSearchPageHandler::GetTabData( @@ -250,7 +251,7 @@ } void TabSearchPageHandler::NotifyTabsChanged() { - page_->TabsChanged(CreateProfileTabs()); + page_->TabsChanged(CreateProfileData()); debounce_timer_->Stop(); }
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h index cac89c2..9f614f7c 100644 --- a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h +++ b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h
@@ -44,7 +44,7 @@ // tab_search::mojom::PageHandler: void CloseTab(int32_t tab_id) override; - void GetProfileTabs(GetProfileTabsCallback callback) override; + void GetProfileData(GetProfileDataCallback callback) override; void GetTabGroups(GetTabGroupsCallback callback) override; void ShowFeedbackPage() override; void SwitchToTab( @@ -80,7 +80,7 @@ int index; }; - tab_search::mojom::ProfileTabsPtr CreateProfileTabs(); + tab_search::mojom::ProfileDataPtr CreateProfileData(); tab_search::mojom::TabPtr GetTabData(TabStripModel* tab_strip_model, content::WebContents* contents,
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc b/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc index a145495..13839460 100644 --- a/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc +++ b/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc
@@ -50,7 +50,7 @@ } mojo::Receiver<tab_search::mojom::Page> receiver_{this}; - MOCK_METHOD1(TabsChanged, void(tab_search::mojom::ProfileTabsPtr)); + MOCK_METHOD1(TabsChanged, void(tab_search::mojom::ProfileDataPtr)); MOCK_METHOD1(TabUpdated, void(tab_search::mojom::TabPtr)); MOCK_METHOD1(TabsRemoved, void(const std::vector<int32_t>& tab_ids)); }; @@ -71,7 +71,7 @@ EXPECT_GT(tab->last_active_time_ticks, base::TimeTicks()); } -void ExpectProfileTabs(tab_search::mojom::ProfileTabs* profile_tabs) { +void ExpectProfileTabs(tab_search::mojom::ProfileData* profile_tabs) { ASSERT_EQ(2u, profile_tabs->windows.size()); auto* window1 = profile_tabs->windows[0].get(); ASSERT_EQ(2u, window1->tabs.size()); @@ -210,9 +210,9 @@ int32_t tab_id3 = 0; // Get Tabs. - tab_search::mojom::PageHandler::GetProfileTabsCallback callback1 = + tab_search::mojom::PageHandler::GetProfileDataCallback callback1 = base::BindLambdaForTesting( - [&](tab_search::mojom::ProfileTabsPtr profile_tabs) { + [&](tab_search::mojom::ProfileDataPtr profile_tabs) { ASSERT_EQ(2u, profile_tabs->windows.size()); auto* window1 = profile_tabs->windows[0].get(); ASSERT_TRUE(window1->active); @@ -237,7 +237,7 @@ tab_id2 = tab2->tab_id; tab_id3 = tab3->tab_id; }); - handler()->GetProfileTabs(std::move(callback1)); + handler()->GetProfileData(std::move(callback1)); // Switch to 2nd tab. auto switch_to_tab_info = tab_search::mojom::SwitchToTabInfo::New(); @@ -245,12 +245,12 @@ handler()->SwitchToTab(std::move(switch_to_tab_info)); // Get Tabs again to verify tab switch. - tab_search::mojom::PageHandler::GetProfileTabsCallback callback2 = + tab_search::mojom::PageHandler::GetProfileDataCallback callback2 = base::BindLambdaForTesting( - [&](tab_search::mojom::ProfileTabsPtr profile_tabs) { + [&](tab_search::mojom::ProfileDataPtr profile_tabs) { ExpectProfileTabs(profile_tabs.get()); }); - handler()->GetProfileTabs(std::move(callback2)); + handler()->GetProfileData(std::move(callback2)); // Switch to 3rd tab. switch_to_tab_info = tab_search::mojom::SwitchToTabInfo::New(); @@ -258,12 +258,12 @@ handler()->SwitchToTab(std::move(switch_to_tab_info)); // Get Tabs again to verify tab switch. - tab_search::mojom::PageHandler::GetProfileTabsCallback callback3 = + tab_search::mojom::PageHandler::GetProfileDataCallback callback3 = base::BindLambdaForTesting( - [&](tab_search::mojom::ProfileTabsPtr profile_tabs) { + [&](tab_search::mojom::ProfileDataPtr profile_tabs) { ExpectProfileTabs(profile_tabs.get()); }); - handler()->GetProfileTabs(std::move(callback3)); + handler()->GetProfileData(std::move(callback3)); } // Ensure that repeated tab model changes do not result in repeated calls to
diff --git a/chrome/browser/ui/webui/test_data_source.cc b/chrome/browser/ui/webui/test_data_source.cc index 4c8a72b..15a78cb 100644 --- a/chrome/browser/ui/webui/test_data_source.cc +++ b/chrome/browser/ui/webui/test_data_source.cc
@@ -44,6 +44,7 @@ {"/mocha.js", "third_party/mocha/mocha.js"}, {"/test_loader.html", "ui/webui/resources/html/test_loader.html"}, {"/test_loader.js", "ui/webui/resources/js/test_loader.js"}, + {"/test_loader_util.js", "ui/webui/resources/js/test_loader_util.js"}, }; }
diff --git a/chrome/browser/ui/webui/version/version_util_win.cc b/chrome/browser/ui/webui/version/version_util_win.cc index e8af2eb..5eb0bcf 100644 --- a/chrome/browser/ui/webui/version/version_util_win.cc +++ b/chrome/browser/ui/webui/version/version_util_win.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/webui/version/version_util_win.h" #include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" #include "base/win/windows_version.h" #include "chrome/install_static/install_details.h" #include "components/strings/grit/components_strings.h" @@ -74,11 +75,11 @@ } base::string16 GetCohortVersionInfo() { - base::string16 update_cohort_name = + std::wstring update_cohort_name = install_static::InstallDetails::Get().update_cohort_name(); if (!update_cohort_name.empty()) { return l10n_util::GetStringFUTF16(IDS_VERSION_UI_COHORT_NAME, - update_cohort_name); + base::WideToUTF16(update_cohort_name)); } return base::string16();
diff --git a/chrome/browser/ui/webui/webui_util.cc b/chrome/browser/ui/webui/webui_util.cc index 1fe5d9b..60410989 100644 --- a/chrome/browser/ui/webui/webui_util.cc +++ b/chrome/browser/ui/webui/webui_util.cc
@@ -23,9 +23,7 @@ namespace webui { -namespace { - -void SetupPolymer3Defaults(content::WebUIDataSource* source) { +void SetJSModuleDefaults(content::WebUIDataSource* source) { source->OverrideContentSecurityPolicy( network::mojom::CSPDirectiveName::ScriptSrc, "script-src chrome://resources chrome://test 'self';"); @@ -34,15 +32,15 @@ source->UseStringsJs(); source->EnableReplaceI18nInJS(); source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); + source->AddResourcePath("test_loader_util.js", + IDR_WEBUI_JS_TEST_LOADER_UTIL_JS); source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); } -} // namespace - void SetupWebUIDataSource(content::WebUIDataSource* source, base::span<const GritResourceMap> resources, int default_resource) { - SetupPolymer3Defaults(source); + SetJSModuleDefaults(source); for (const GritResourceMap& resource : resources) { source->AddResourcePath(resource.name, resource.value); }
diff --git a/chrome/browser/ui/webui/webui_util.h b/chrome/browser/ui/webui/webui_util.h index 9a70f36..b7d4b24 100644 --- a/chrome/browser/ui/webui/webui_util.h +++ b/chrome/browser/ui/webui/webui_util.h
@@ -22,10 +22,15 @@ int id; }; -// Performs common setup steps for |source|, assuming it is using Polymer 3, -// by adding all resources, setting the default resource, setting up i18n, -// and ensuring that tests work correctly by updating the CSP and adding the -// test loader files. +// Performs common setup steps for a |source| using JS modules: enable i18n +// string replacements, adding test resources, and updating CSP/trusted types to +// allow tests to work. +// UIs that don't have a dedicated grd file should generally use this utility. +void SetJSModuleDefaults(content::WebUIDataSource* source); + +// Calls SetJSModuleDefaults(), and additionally adds all resources in the +// resource map to |source| and sets |default_resource| as the default resource. +// UIs that have a dedicated grd file should generally use this utility. void SetupWebUIDataSource(content::WebUIDataSource* source, base::span<const GritResourceMap> resources, int default_resource);
diff --git a/chrome/browser/web_applications/components/app_registrar.h b/chrome/browser/web_applications/components/app_registrar.h index 14c3d13..e542002 100644 --- a/chrome/browser/web_applications/components/app_registrar.h +++ b/chrome/browser/web_applications/components/app_registrar.h
@@ -98,6 +98,8 @@ const AppId& app_id) const = 0; virtual const apps::ShareTarget* GetAppShareTarget( const AppId& app_id) const = 0; + virtual blink::mojom::CaptureLinks GetAppCaptureLinks( + const AppId& app_id) const = 0; // Returns the start_url with launch_query_params appended to the end if any. GURL GetAppLaunchUrl(const AppId& app_id) const;
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_registrar.cc b/chrome/browser/web_applications/extensions/bookmark_app_registrar.cc index 40c449f..e200b66f 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_registrar.cc +++ b/chrome/browser/web_applications/extensions/bookmark_app_registrar.cc
@@ -158,6 +158,12 @@ return nullptr; } +// Only implemented for WebApp. Bookmark apps are going away. +blink::mojom::CaptureLinks BookmarkAppRegistrar::GetAppCaptureLinks( + const web_app::AppId& app_id) const { + return blink::mojom::CaptureLinks::kUndefined; +} + base::Optional<GURL> BookmarkAppRegistrar::GetAppScopeInternal( const web_app::AppId& app_id) const { const Extension* extension = GetBookmarkAppDchecked(app_id);
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_registrar.h b/chrome/browser/web_applications/extensions/bookmark_app_registrar.h index af2739df..02078cd 100644 --- a/chrome/browser/web_applications/extensions/bookmark_app_registrar.h +++ b/chrome/browser/web_applications/extensions/bookmark_app_registrar.h
@@ -50,6 +50,8 @@ const web_app::AppId& app_id) const override; const apps::ShareTarget* GetAppShareTarget( const web_app::AppId& app_id) const override; + blink::mojom::CaptureLinks GetAppCaptureLinks( + const web_app::AppId& app_id) const override; base::Optional<GURL> GetAppScopeInternal( const web_app::AppId& app_id) const override; web_app::DisplayMode GetAppDisplayMode(
diff --git a/chrome/browser/web_applications/external_web_app_manager.cc b/chrome/browser/web_applications/external_web_app_manager.cc index 4b90edee..fb3e25d 100644 --- a/chrome/browser/web_applications/external_web_app_manager.cc +++ b/chrome/browser/web_applications/external_web_app_manager.cc
@@ -145,8 +145,14 @@ base::Optional<std::string> GetDisableReason( const ExternalInstallOptions& options, Profile* profile, + bool default_apps_enabled_in_prefs, bool is_new_user, const std::string& user_type) { + if (!default_apps_enabled_in_prefs) { + return options.install_url.spec() + + " disabled by default_apps pref setting."; + } + // Remove if not applicable to current user type. DCHECK_GT(options.user_type_allowlist.size(), 0u); if (!base::Contains(options.user_type_allowlist, user_type)) { @@ -369,13 +375,18 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) } + // TODO(crbug.com/1175196): Move this constant into some shared constants.h + // file. + bool default_apps_enabled_in_prefs = + profile_->GetPrefs()->GetString(prefs::kDefaultApps) == "install"; bool is_new_user = IsNewUser(); std::string user_type = apps::DetermineUserType(profile_); size_t disabled_count = 0; base::EraseIf( parsed_configs.options_list, [&](const ExternalInstallOptions& options) { base::Optional<std::string> disable_reason = - GetDisableReason(options, profile_, is_new_user, user_type); + GetDisableReason(options, profile_, default_apps_enabled_in_prefs, + is_new_user, user_type); if (disable_reason) { VLOG(1) << *disable_reason; ++disabled_count;
diff --git a/chrome/browser/web_applications/external_web_app_manager_browsertest.cc b/chrome/browser/web_applications/external_web_app_manager_browsertest.cc index 61439015..d0f245ce 100644 --- a/chrome/browser/web_applications/external_web_app_manager_browsertest.cc +++ b/chrome/browser/web_applications/external_web_app_manager_browsertest.cc
@@ -18,7 +18,9 @@ #include "chrome/browser/web_applications/test/test_file_utils.h" #include "chrome/browser/web_applications/test/test_os_integration_manager.h" #include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" +#include "components/prefs/pref_service.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_launcher.h" #include "extensions/browser/extension_registry.h" @@ -285,6 +287,40 @@ EXPECT_EQ(app, uninstalled_app.get()); } +IN_PROC_BROWSER_TEST_F(ExternalWebAppManagerBrowserTest, + DefaultAppsPrefInstall) { + ExternalWebAppManager::BypassOfflineManifestRequirementForTesting(); + ASSERT_TRUE(embedded_test_server()->Start()); + profile()->GetPrefs()->SetString(prefs::kDefaultApps, "install"); + + EXPECT_EQ( + SyncDefaultAppConfig(GetAppUrl(), base::ReplaceStringPlaceholders( + R"({ + "app_url": "$1", + "launch_container": "window", + "user_type": ["unmanaged"] + })", + {GetAppUrl().spec()}, nullptr)), + InstallResultCode::kSuccessNewInstall); +} + +IN_PROC_BROWSER_TEST_F(ExternalWebAppManagerBrowserTest, + DefaultAppsPrefNoinstall) { + ExternalWebAppManager::BypassOfflineManifestRequirementForTesting(); + ASSERT_TRUE(embedded_test_server()->Start()); + profile()->GetPrefs()->SetString(prefs::kDefaultApps, "noinstall"); + + EXPECT_EQ( + SyncDefaultAppConfig(GetAppUrl(), base::ReplaceStringPlaceholders( + R"({ + "app_url": "$1", + "launch_container": "window", + "user_type": ["unmanaged"] + })", + {GetAppUrl().spec()}, nullptr)), + base::nullopt); +} + // The offline manifest JSON config functionality is only available on Chrome // OS. #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc index bfeaa85..703cefd 100644 --- a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc +++ b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
@@ -48,6 +48,7 @@ #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/manifest/manifest.h" #include "third_party/skia/include/core/SkColor.h" @@ -1111,6 +1112,45 @@ SK_ColorBLACK); } +class ManifestUpdateManagerCaptureLinksBrowserTest + : public ManifestUpdateManagerBrowserTest { + public: + ManifestUpdateManagerCaptureLinksBrowserTest() { + scoped_feature_list_.InitAndEnableFeature( + blink::features::kWebAppEnableLinkCapturing); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(ManifestUpdateManagerCaptureLinksBrowserTest, + CheckFindsCaptureLinksChange) { + constexpr char kManifestTemplate[] = R"( + { + "name": "Test app name", + "start_url": ".", + "scope": "/", + "display": "standalone", + "icons": $1, + "capture_links": "$2" + } + )"; + OverrideManifest(kManifestTemplate, {kInstallableIconList, "none"}); + AppId app_id = InstallWebApp(); + EXPECT_EQ(GetProvider().registrar().GetAppCaptureLinks(app_id), + blink::mojom::CaptureLinks::kNone); + + OverrideManifest(kManifestTemplate, {kInstallableIconList, "new-client"}); + EXPECT_EQ(GetResultAfterPageLoad(GetAppURL(), &app_id), + ManifestUpdateResult::kAppUpdated); + histogram_tester_.ExpectBucketCount(kUpdateHistogramName, + ManifestUpdateResult::kAppUpdated, 1); + CheckShortcutInfoUpdated(app_id, kInstallableIconTopLeftColor); + EXPECT_EQ(GetProvider().registrar().GetAppCaptureLinks(app_id), + blink::mojom::CaptureLinks::kNewClient); +} + class ManifestUpdateManagerSystemAppBrowserTest : public ManifestUpdateManagerBrowserTest { public:
diff --git a/chrome/browser/web_applications/manifest_update_task.cc b/chrome/browser/web_applications/manifest_update_task.cc index fe03d32..3102e4ac 100644 --- a/chrome/browser/web_applications/manifest_update_task.cc +++ b/chrome/browser/web_applications/manifest_update_task.cc
@@ -22,6 +22,7 @@ #include "chrome/common/chrome_features.h" #include "components/webapps/browser/installable/installable_manager.h" #include "content/public/common/content_features.h" +#include "third_party/blink/public/common/features.h" #include "ui/gfx/skia_util.h" namespace web_app { @@ -198,6 +199,13 @@ return true; } + if (base::FeatureList::IsEnabled( + blink::features::kWebAppEnableLinkCapturing) && + web_application_info_->capture_links != + registrar_.GetAppCaptureLinks(app_id_)) { + return true; + } + // TODO(crbug.com/1072058): Check the manifest URL. // TODO(crbug.com/926083): Check more manifest fields. return false;
diff --git a/chrome/browser/web_applications/test/test_app_registrar.cc b/chrome/browser/web_applications/test/test_app_registrar.cc index aebe252b..f57d115 100644 --- a/chrome/browser/web_applications/test/test_app_registrar.cc +++ b/chrome/browser/web_applications/test/test_app_registrar.cc
@@ -122,6 +122,11 @@ return nullptr; } +blink::mojom::CaptureLinks TestAppRegistrar::GetAppCaptureLinks( + const web_app::AppId& app_id) const { + return blink::mojom::CaptureLinks::kUndefined; +} + base::Optional<GURL> TestAppRegistrar::GetAppScopeInternal( const AppId& app_id) const { const auto& result = installed_apps_.find(app_id);
diff --git a/chrome/browser/web_applications/test/test_app_registrar.h b/chrome/browser/web_applications/test/test_app_registrar.h index ed6f53e3..6899011 100644 --- a/chrome/browser/web_applications/test/test_app_registrar.h +++ b/chrome/browser/web_applications/test/test_app_registrar.h
@@ -64,6 +64,8 @@ const AppId& app_id) const override; const apps::ShareTarget* GetAppShareTarget( const AppId& app_id) const override; + blink::mojom::CaptureLinks GetAppCaptureLinks( + const web_app::AppId& app_id) const override; base::Optional<GURL> GetAppScopeInternal(const AppId& app_id) const override; DisplayMode GetAppDisplayMode(const AppId& app_id) const override; DisplayMode GetAppUserDisplayMode(const AppId& app_id) const override;
diff --git a/chrome/browser/web_applications/web_app_registrar.cc b/chrome/browser/web_applications/web_app_registrar.cc index 64f01c5..80e40f7 100644 --- a/chrome/browser/web_applications/web_app_registrar.cc +++ b/chrome/browser/web_applications/web_app_registrar.cc
@@ -105,6 +105,13 @@ : nullptr; } +blink::mojom::CaptureLinks WebAppRegistrar::GetAppCaptureLinks( + const AppId& app_id) const { + auto* web_app = GetAppById(app_id); + return web_app ? web_app->capture_links() + : blink::mojom::CaptureLinks::kUndefined; +} + base::Optional<GURL> WebAppRegistrar::GetAppScopeInternal( const AppId& app_id) const { auto* web_app = GetAppById(app_id);
diff --git a/chrome/browser/web_applications/web_app_registrar.h b/chrome/browser/web_applications/web_app_registrar.h index 47d7ff8..6b210ba 100644 --- a/chrome/browser/web_applications/web_app_registrar.h +++ b/chrome/browser/web_applications/web_app_registrar.h
@@ -54,6 +54,8 @@ const AppId& app_id) const override; const apps::ShareTarget* GetAppShareTarget( const AppId& app_id) const override; + blink::mojom::CaptureLinks GetAppCaptureLinks( + const web_app::AppId& app_id) const override; base::Optional<GURL> GetAppScopeInternal(const AppId& app_id) const override; DisplayMode GetAppDisplayMode(const AppId& app_id) const override; DisplayMode GetAppUserDisplayMode(const AppId& app_id) const override;
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc index 8f7be381..4b5c2c5 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -109,7 +109,19 @@ } void AuthenticatorRequestDialogModel::SetCurrentStep(Step step) { + auto_advance_.reset(); current_step_ = step; + + if (current_step_ == Step::kCableActivate && cable_is_serverlink()) { + // Server-linked caBLEv2 automatically shows the USB hint if idle for 30 + // seconds. This mirrors behaviour on the mobile side. + auto_advance_.emplace(); + auto_advance_->Start( + FROM_HERE, base::TimeDelta::FromSeconds(30), + base::BindOnce(&AuthenticatorRequestDialogModel::SetCurrentStep, + GetWeakPtr(), Step::kAndroidAccessory)); + } + for (auto& observer : observers_) observer.OnStepTransition(); }
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.h b/chrome/browser/webauthn/authenticator_request_dialog_model.h index 55918cc1..55e1616 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.h +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.h
@@ -15,6 +15,7 @@ #include "base/optional.h" #include "base/strings/string16.h" #include "base/strings/string_piece.h" +#include "base/timer/timer.h" #include "base/values.h" #include "build/build_config.h" #include "chrome/browser/webauthn/authenticator_reference.h" @@ -509,6 +510,9 @@ // displayed already and the user cancelled it. In this case, we shouldn't // jump straight to showing it again. bool win_native_api_already_tried_ = false; + // auto_advance_ will move the dialog to some |Step| when it triggers. + // Any transition prior to that will cancel |auto_advance_|. + base::Optional<base::OneShotTimer> auto_advance_; base::WeakPtrFactory<AuthenticatorRequestDialogModel> weak_factory_{this};
diff --git a/chrome/browser/win/chrome_elf_init.cc b/chrome/browser/win/chrome_elf_init.cc index 5f3ae0e..e9897ca 100644 --- a/chrome/browser/win/chrome_elf_init.cc +++ b/chrome/browser/win/chrome_elf_init.cc
@@ -63,7 +63,7 @@ BLACKLIST_SETUP_EVENT_MAX); } -base::string16 GetBeaconRegistryPath() { +std::wstring GetBeaconRegistryPath() { return install_static::GetRegistryPath().append( blacklist::kRegistryBeaconKeyName); } @@ -84,7 +84,7 @@ // sandbox::MITIGATION_EXTENSION_POINT_DISABLE is set properly in reg. // Note: the very existence of this key signals elf to not enable // this mitigation on browser next start. - const base::string16 finch_path(install_static::GetRegistryPath().append( + const std::wstring finch_path(install_static::GetRegistryPath().append( elf_sec::kRegSecurityFinchKeyName)); base::win::RegKey finch_security_registry_key(HKEY_CURRENT_USER, finch_path.c_str(), KEY_READ); @@ -143,7 +143,7 @@ } // Find the last recorded blacklist version. - base::string16 blacklist_version; + std::wstring blacklist_version; blacklist_registry_key.ReadValue(blacklist::kBeaconVersion, &blacklist_version);
diff --git a/chrome/browser/win/conflicts/enumerate_input_method_editors.cc b/chrome/browser/win/conflicts/enumerate_input_method_editors.cc index ab40b5a..5ff3ab9e 100644 --- a/chrome/browser/win/conflicts/enumerate_input_method_editors.cc +++ b/chrome/browser/win/conflicts/enumerate_input_method_editors.cc
@@ -63,9 +63,9 @@ // Returns the path to the in-proc server DLL for |guid|, or an empty path if // none is found. base::FilePath GetInprocServerDllPath(const wchar_t* guid) { - base::string16 key_name = base::StringPrintf(kClassIdRegistryKeyFormat, guid); + std::wstring key_name = base::StringPrintf(kClassIdRegistryKeyFormat, guid); base::win::RegKey registry_key; - base::string16 value; + std::wstring value; if (registry_key.Open(HKEY_CLASSES_ROOT, key_name.c_str(), KEY_QUERY_VALUE) == ERROR_SUCCESS && registry_key.ReadValue(L"", &value) == ERROR_SUCCESS) {
diff --git a/chrome/browser/win/conflicts/enumerate_shell_extensions.cc b/chrome/browser/win/conflicts/enumerate_shell_extensions.cc index 08a516c2..8edbe8b 100644 --- a/chrome/browser/win/conflicts/enumerate_shell_extensions.cc +++ b/chrome/browser/win/conflicts/enumerate_shell_extensions.cc
@@ -43,15 +43,15 @@ // Retrieves the path to the registry key that contains all the shell extensions // of type |shell_extension_type| that apply to |shell_object_type|. -base::string16 GetShellExtensionTypePath(const wchar_t* shell_extension_type, - const wchar_t* shell_object_type) { +std::wstring GetShellExtensionTypePath(const wchar_t* shell_extension_type, + const wchar_t* shell_object_type) { return base::StringPrintf(L"%ls\\shellex\\%ls", shell_object_type, shell_extension_type); } // Returns the path to the DLL for an InProcServer32 registration. base::FilePath GetInProcServerPath(const wchar_t* guid) { - base::string16 key = base::StringPrintf(kClassIdRegistryKeyFormat, guid); + std::wstring key = base::StringPrintf(kClassIdRegistryKeyFormat, guid); base::win::RegKey clsid; if (clsid.Open(HKEY_CLASSES_ROOT, key.c_str(), KEY_QUERY_VALUE) != @@ -59,7 +59,7 @@ return base::FilePath(); } - base::string16 dll_path; + std::wstring dll_path; if (clsid.ReadValue(L"", &dll_path) != ERROR_SUCCESS) return base::FilePath(); @@ -72,15 +72,15 @@ const wchar_t* shell_extension_type, const wchar_t* shell_object_type, const base::RepeatingCallback<void(const base::FilePath&)>& callback) { - base::string16 path = + std::wstring path = GetShellExtensionTypePath(shell_extension_type, shell_object_type); DCHECK_NE(path.back(), L'\\'); - base::string16 guid; + std::wstring guid; for (base::win::RegistryKeyIterator iter(HKEY_CLASSES_ROOT, path.c_str()); iter.Valid(); ++iter) { - base::string16 shell_extension_reg_path = path + L"\\" + iter.Name(); + std::wstring shell_extension_reg_path = path + L"\\" + iter.Name(); base::win::RegKey reg_key( HKEY_CLASSES_ROOT, shell_extension_reg_path.c_str(), KEY_QUERY_VALUE); if (!reg_key.Valid())
diff --git a/chrome/browser/win/conflicts/module_event_sink_impl.cc b/chrome/browser/win/conflicts/module_event_sink_impl.cc index 4558b56..32c7e7a 100644 --- a/chrome/browser/win/conflicts/module_event_sink_impl.cc +++ b/chrome/browser/win/conflicts/module_event_sink_impl.cc
@@ -45,7 +45,7 @@ temp_path.resize(2 * temp_path.size()); } - *path = base::FilePath(base::StringPiece16(temp_path.data(), length)); + *path = base::FilePath(base::WStringPiece(temp_path.data(), length)); return true; }
diff --git a/chrome/browser/win/conflicts/module_info_util.cc b/chrome/browser/win/conflicts/module_info_util.cc index 710a4151..1e6e603 100644 --- a/chrome/browser/win/conflicts/module_info_util.cc +++ b/chrome/browser/win/conflicts/module_info_util.cc
@@ -259,13 +259,13 @@ } StringMapping GetEnvironmentVariablesMapping( - const std::vector<base::string16>& environment_variables) { + const std::vector<std::wstring>& environment_variables) { std::unique_ptr<base::Environment> environment(base::Environment::Create()); StringMapping string_mapping; - for (const base::string16& variable : environment_variables) { + for (const std::wstring& variable : environment_variables) { std::string value; - if (environment->GetVar(base::UTF16ToASCII(variable).c_str(), &value)) { + if (environment->GetVar(base::WideToASCII(variable).c_str(), &value)) { value = base::TrimString(value, "\\", base::TRIM_TRAILING).as_string(); string_mapping.push_back( std::make_pair(base::i18n::ToLower(base::UTF8ToUTF16(value)),
diff --git a/chrome/browser/win/conflicts/module_info_util.h b/chrome/browser/win/conflicts/module_info_util.h index 84f5b5a..989dd0c 100644 --- a/chrome/browser/win/conflicts/module_info_util.h +++ b/chrome/browser/win/conflicts/module_info_util.h
@@ -61,7 +61,7 @@ // e.g. c:\windows\system32 -> %systemroot% using StringMapping = std::vector<std::pair<base::string16, base::string16>>; StringMapping GetEnvironmentVariablesMapping( - const std::vector<base::string16>& environment_variables); + const std::vector<std::wstring>& environment_variables); // If |prefix_mapping| contains a matching prefix with |path|, substitutes that // prefix with its associated value. If multiple matches are found, the longest
diff --git a/chrome/browser/win/conflicts/module_info_util_unittest.cc b/chrome/browser/win/conflicts/module_info_util_unittest.cc index e9c06e8..ae743c64 100644 --- a/chrome/browser/win/conflicts/module_info_util_unittest.cc +++ b/chrome/browser/win/conflicts/module_info_util_unittest.cc
@@ -83,7 +83,7 @@ "C:\\bar\\"); // The mapping for these variables will be retrieved. - std::vector<base::string16> environment_variables = { + std::vector<std::wstring> environment_variables = { L"foo", L"SYSTEMROOT", };
diff --git a/chrome/browser/win/conflicts/uninstall_application.cc b/chrome/browser/win/conflicts/uninstall_application.cc index bec37f5..28d70c00 100644 --- a/chrome/browser/win/conflicts/uninstall_application.cc +++ b/chrome/browser/win/conflicts/uninstall_application.cc
@@ -196,7 +196,7 @@ void UninstallAppController::AutomationControllerDelegate::OnFocusChangedEvent( IUIAutomation* automation, IUIAutomationElement* sender) const { - base::string16 combo_box_id( + std::wstring combo_box_id( GetCachedBstrValue(sender, UIA_AutomationIdPropertyId)); if (combo_box_id != L"SystemSettings_AppsFeatures_AppControl_ComboBox") return;
diff --git a/chrome/browser/win/settings_app_monitor.cc b/chrome/browser/win/settings_app_monitor.cc index 0dc60ed..999862b 100644 --- a/chrome/browser/win/settings_app_monitor.cc +++ b/chrome/browser/win/settings_app_monitor.cc
@@ -16,6 +16,7 @@ #include "base/sequenced_task_runner.h" #include "base/strings/pattern.h" #include "base/strings/string16.h" +#include "base/strings/string_util.h" #include "base/synchronization/lock.h" #include "base/threading/sequenced_task_runner_handle.h" #include "base/win/scoped_variant.h" @@ -51,8 +52,8 @@ // Helper function to get the parent element with class name "Flyout". Used to // determine the |element|'s type. -base::string16 GetFlyoutParentAutomationId(IUIAutomation* automation, - IUIAutomationElement* element) { +std::wstring GetFlyoutParentAutomationId(IUIAutomation* automation, + IUIAutomationElement* element) { // Create a condition that will include only elements with the right class // name in the tree view. base::win::ScopedVariant class_name(L"Flyout"); @@ -60,17 +61,17 @@ HRESULT result = automation->CreatePropertyCondition(UIA_ClassNamePropertyId, class_name, &condition); if (FAILED(result)) - return base::string16(); + return std::wstring(); Microsoft::WRL::ComPtr<IUIAutomationTreeWalker> tree_walker; result = automation->CreateTreeWalker(condition.Get(), &tree_walker); if (FAILED(result)) - return base::string16(); + return std::wstring(); Microsoft::WRL::ComPtr<IUIAutomationCacheRequest> cache_request; result = automation->CreateCacheRequest(&cache_request); if (FAILED(result)) - return base::string16(); + return std::wstring(); ConfigureCacheRequest(cache_request.Get()); // From MSDN, NormalizeElementBuildCache() "Retrieves the ancestor element @@ -79,7 +80,7 @@ result = tree_walker->NormalizeElementBuildCache(element, cache_request.Get(), &flyout_element); if (FAILED(result) || !flyout_element) - return base::string16(); + return std::wstring(); return GetCachedBstrValue(flyout_element, UIA_AutomationIdPropertyId); } @@ -88,14 +89,16 @@ IUIAutomationElement* sender) { DCHECK(automation); DCHECK(sender); - base::string16 aid(GetCachedBstrValue(sender, UIA_AutomationIdPropertyId)); + std::wstring aid(GetCachedBstrValue(sender, UIA_AutomationIdPropertyId)); if (aid == L"SystemSettings_DefaultApps_Browser_Button") return ElementType::DEFAULT_BROWSER; if (aid == L"SystemSettings_DefaultApps_Browser_App0_HyperlinkButton") return ElementType::SWITCH_ANYWAY; - if (base::MatchPattern(aid, L"SystemSettings_DefaultApps_Browser_*_Button")) { + if (base::MatchPattern( + base::AsString16(aid), + STRING16_LITERAL("SystemSettings_DefaultApps_Browser_*_Button"))) { // This element type depends on the automation id of one of its ancestors. - base::string16 automation_id = + std::wstring automation_id = GetFlyoutParentAutomationId(automation, sender); if (automation_id == L"settingsFlyout") return ElementType::CHECK_IT_OUT; @@ -185,8 +188,7 @@ base::BindOnce(&SettingsAppMonitor::OnChooserInvoked, monitor_)); break; case ElementType::BROWSER_BUTTON: { - base::string16 browser_name( - GetCachedBstrValue(sender, UIA_NamePropertyId)); + std::wstring browser_name(GetCachedBstrValue(sender, UIA_NamePropertyId)); if (!browser_name.empty()) { monitor_runner_->PostTask( FROM_HERE, base::BindOnce(&SettingsAppMonitor::OnBrowserChosen, @@ -286,7 +288,7 @@ delegate_->OnChooserInvoked(); } -void SettingsAppMonitor::OnBrowserChosen(const base::string16& browser_name) { +void SettingsAppMonitor::OnBrowserChosen(const std::wstring& browser_name) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); delegate_->OnBrowserChosen(browser_name); }
diff --git a/chrome/browser/win/settings_app_monitor.h b/chrome/browser/win/settings_app_monitor.h index 4177628..735a95c 100644 --- a/chrome/browser/win/settings_app_monitor.h +++ b/chrome/browser/win/settings_app_monitor.h
@@ -39,7 +39,7 @@ virtual void OnChooserInvoked() = 0; // Invoked when the user has chosen a particular Web browser. - virtual void OnBrowserChosen(const base::string16& browser_name) = 0; + virtual void OnBrowserChosen(const std::wstring& browser_name) = 0; // Invoked when the Edge promo has received keyboard focus. virtual void OnPromoFocused() = 0; @@ -59,7 +59,7 @@ void OnInitialized(HRESULT result); void OnAppFocused(); void OnChooserInvoked(); - void OnBrowserChosen(const base::string16& browser_name); + void OnBrowserChosen(const std::wstring& browser_name); void OnPromoFocused(); void OnPromoChoiceMade(bool accept_promo);
diff --git a/chrome/browser/win/ui_automation_util.cc b/chrome/browser/win/ui_automation_util.cc index 5a15738..2e63fac 100644 --- a/chrome/browser/win/ui_automation_util.cc +++ b/chrome/browser/win/ui_automation_util.cc
@@ -12,22 +12,22 @@ #include "base/strings/string_util.h" #include "base/win/scoped_variant.h" -base::string16 GetCachedBstrValue(IUIAutomationElement* element, - PROPERTYID property_id) { +std::wstring GetCachedBstrValue(IUIAutomationElement* element, + PROPERTYID property_id) { HRESULT result = S_OK; base::win::ScopedVariant var; result = element->GetCachedPropertyValueEx(property_id, TRUE, var.Receive()); if (FAILED(result)) - return base::string16(); + return std::wstring(); if (V_VT(var.ptr()) != VT_BSTR) { LOG_IF(ERROR, V_VT(var.ptr()) != VT_UNKNOWN) << __func__ << " property is not a BSTR: " << V_VT(var.ptr()); - return base::string16(); + return std::wstring(); } - return base::string16(V_BSTR(var.ptr())); + return std::wstring(V_BSTR(var.ptr())); } bool GetCachedBoolValue(IUIAutomationElement* element, PROPERTYID property_id) {
diff --git a/chrome/browser/win/ui_automation_util.h b/chrome/browser/win/ui_automation_util.h index f3fdcd24..125988f 100644 --- a/chrome/browser/win/ui_automation_util.h +++ b/chrome/browser/win/ui_automation_util.h
@@ -20,8 +20,8 @@ #include "base/strings/string16.h" // Returns a cached BSTR property of |element|. -base::string16 GetCachedBstrValue(IUIAutomationElement* element, - PROPERTYID property_id); +std::wstring GetCachedBstrValue(IUIAutomationElement* element, + PROPERTYID property_id); // Debug utilities. They are not used in release builds to avoid adding a lot of // unnecessary strings into executable. If DCHECK are disabled, these are dummy
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index c7cae7f4..2b0b88c 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-master-1612893594-29777cd5c2d7491b296bc41b175b30126012ae9e.profdata +chrome-linux-master-1612936620-f10a3cc43faa6eacf024a8ad0ca834e1b289c130.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 576ab4e..53416fa8 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-master-1612893594-d6bef2dab7e9387599496a21d4c41d44cc8e464d.profdata +chrome-mac-master-1612936620-916ae6a72bbb84b4ff8b8edae9e7936a4a8cc83d.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index c24bfec..a1662f1 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-master-1612817998-0b2311d45b7d0c69ad0de53ecaa27316a0b8d468.profdata +chrome-win32-master-1612936620-5938c94e9976fa8570fac4977a41db2d5b0c3f3f.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index c326059..05c5fe79 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-master-1612817998-374af16dd2c1aa06e8d81cf922095c198b3e1d14.profdata +chrome-win64-master-1612925989-93e1219af687f337c15db98178231c8ee649131f.profdata
diff --git a/chrome/services/mac_notifications/BUILD.gn b/chrome/services/mac_notifications/BUILD.gn index 086ee88c..2c2792b3 100644 --- a/chrome/services/mac_notifications/BUILD.gn +++ b/chrome/services/mac_notifications/BUILD.gn
@@ -16,6 +16,7 @@ ] public_deps = [ + "//chrome/services/mac_notifications/public/cpp", "//chrome/services/mac_notifications/public/mojom", "//mojo/public/mojom/base", ]
diff --git a/chrome/services/mac_notifications/public/cpp/BUILD.gn b/chrome/services/mac_notifications/public/cpp/BUILD.gn new file mode 100644 index 0000000..675696f6 --- /dev/null +++ b/chrome/services/mac_notifications/public/cpp/BUILD.gn
@@ -0,0 +1,16 @@ +# Copyright 2021 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. + +source_set("cpp") { + sources = [ + "notification_constants_mac.h", + "notification_constants_mac.mm", + "notification_utils_mac.cc", + "notification_utils_mac.h", + ] + + frameworks = [ "Foundation.framework" ] + + deps = [ "//base" ] +}
diff --git a/chrome/browser/ui/cocoa/notifications/notification_constants_mac.h b/chrome/services/mac_notifications/public/cpp/notification_constants_mac.h similarity index 85% rename from chrome/browser/ui/cocoa/notifications/notification_constants_mac.h rename to chrome/services/mac_notifications/public/cpp/notification_constants_mac.h index 20a990c53..d3301b3 100644 --- a/chrome/browser/ui/cocoa/notifications/notification_constants_mac.h +++ b/chrome/services/mac_notifications/public/cpp/notification_constants_mac.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_NOTIFICATION_CONSTANTS_MAC_H_ -#define CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_NOTIFICATION_CONSTANTS_MAC_H_ +#ifndef CHROME_SERVICES_MAC_NOTIFICATIONS_PUBLIC_CPP_NOTIFICATION_CONSTANTS_MAC_H_ +#define CHROME_SERVICES_MAC_NOTIFICATIONS_PUBLIC_CPP_NOTIFICATION_CONSTANTS_MAC_H_ #import <Foundation/Foundation.h> @@ -40,4 +40,4 @@ } // notification_constants -#endif // CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_NOTIFICATION_CONSTANTS_MAC_H_ +#endif // CHROME_SERVICES_MAC_NOTIFICATIONS_PUBLIC_CPP_NOTIFICATION_CONSTANTS_MAC_H_
diff --git a/chrome/browser/ui/cocoa/notifications/notification_constants_mac.mm b/chrome/services/mac_notifications/public/cpp/notification_constants_mac.mm similarity index 95% rename from chrome/browser/ui/cocoa/notifications/notification_constants_mac.mm rename to chrome/services/mac_notifications/public/cpp/notification_constants_mac.mm index adbdaf3..7bc313b 100644 --- a/chrome/browser/ui/cocoa/notifications/notification_constants_mac.mm +++ b/chrome/services/mac_notifications/public/cpp/notification_constants_mac.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" +#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h" namespace notification_constants {
diff --git a/chrome/services/mac_notifications/public/cpp/notification_utils_mac.cc b/chrome/services/mac_notifications/public/cpp/notification_utils_mac.cc new file mode 100644 index 0000000..4a954a1 --- /dev/null +++ b/chrome/services/mac_notifications/public/cpp/notification_utils_mac.cc
@@ -0,0 +1,15 @@ +// Copyright 2021 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/services/mac_notifications/public/cpp/notification_utils_mac.h" + +#include "base/strings/strcat.h" + +std::string DeriveMacNotificationId(bool incognito, + const std::string& profile_id, + const std::string& notification_id) { + // i: incognito, r: regular profile + return base::StrCat( + {incognito ? "i" : "r", "|", profile_id, "|", notification_id}); +}
diff --git a/chrome/services/mac_notifications/public/cpp/notification_utils_mac.h b/chrome/services/mac_notifications/public/cpp/notification_utils_mac.h new file mode 100644 index 0000000..aaff8ee9 --- /dev/null +++ b/chrome/services/mac_notifications/public/cpp/notification_utils_mac.h
@@ -0,0 +1,16 @@ +// Copyright 2021 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_SERVICES_MAC_NOTIFICATIONS_PUBLIC_CPP_NOTIFICATION_UTILS_MAC_H_ +#define CHROME_SERVICES_MAC_NOTIFICATIONS_PUBLIC_CPP_NOTIFICATION_UTILS_MAC_H_ + +#include <string> + +// Derives a unique notification identifier to be used by the macOS system +// notification center to uniquely identify a notification. +std::string DeriveMacNotificationId(bool incognito, + const std::string& profile_id, + const std::string& notification_id); + +#endif // CHROME_SERVICES_MAC_NOTIFICATIONS_PUBLIC_CPP_NOTIFICATION_UTILS_MAC_H_
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index c1114bad..bf8cda8c 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1147,7 +1147,7 @@ "../browser/metrics/oom/out_of_memory_reporter_browsertest.cc", "../browser/metrics/process_memory_metrics_emitter_browsertest.cc", "../browser/metrics/startup_metrics_browsertest.cc", - "../browser/metrics/tab_stats_tracker_browsertest.cc", + "../browser/metrics/tab_stats/tab_stats_tracker_browsertest.cc", "../browser/metrics/ukm_background_recorder_browsertest.cc", "../browser/metrics/ukm_browsertest.cc", "../browser/metrics/variations/force_field_trials_browsertest.cc", @@ -2432,6 +2432,8 @@ "../browser/ash/app_mode/kiosk_crash_restore_browsertest.cc", "../browser/ash/app_mode/web_app/web_kiosk_app_data_browsertest.cc", "../browser/ash/profiles/profile_helper_browsertest.cc", + "../browser/ash/system/device_disabling_browsertest.cc", + "../browser/ash/system/tray_accessibility_browsertest.cc", "../browser/chrome_main_browsertest.cc", "../browser/chromeos/apps/apk_web_app_installer_browsertest.cc", "../browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc", @@ -2741,8 +2743,6 @@ "../browser/chromeos/scoped_test_system_nss_key_slot_mixin.h", "../browser/chromeos/shutdown_policy_browsertest.cc", "../browser/chromeos/startup_settings_cache_browsertest.cc", - "../browser/chromeos/system/device_disabling_browsertest.cc", - "../browser/chromeos/system/tray_accessibility_browsertest.cc", "../browser/chromeos/web_applications/camera_app_integration_browsertest.cc", "../browser/chromeos/web_applications/diagnostics_app_integration_browsertest.cc", "../browser/chromeos/web_applications/eche_app_integration_browsertest.cc", @@ -2841,7 +2841,7 @@ "../browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc", "../browser/ui/webui/chromeos/bluetooth_pairing_dialog_browsertest-inl.h", "../browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_dialog_browsertest.cc", - "../browser/ui/webui/chromeos/edu_coexistence_login_handler_browsertest.cc", + "../browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_browsertest.cc", "../browser/ui/webui/chromeos/login/js_calls_container_test_api.cc", "../browser/ui/webui/chromeos/login/js_calls_container_test_api.h", "../browser/ui/webui/chromeos/login/oobe_display_chooser_browsertest.cc", @@ -4271,7 +4271,10 @@ if (is_mac) { data_deps += [ "//chrome:chrome_framework" ] - deps += [ "//chrome/services/mac_notifications:unit_tests" ] + deps += [ + "//chrome/services/mac_notifications:unit_tests", + "//chrome/services/mac_notifications/public/cpp", + ] } if (is_win) { @@ -4495,8 +4498,8 @@ "../browser/memory/enterprise_memory_limit_evaluator_unittest.cc", "../browser/metrics/desktop_session_duration/desktop_session_duration_tracker_unittest.cc", "../browser/metrics/desktop_session_duration/touch_mode_stats_tracker_unittest.cc", - "../browser/metrics/tab_stats_data_store_unittest.cc", - "../browser/metrics/tab_stats_tracker_unittest.cc", + "../browser/metrics/tab_stats/tab_stats_data_store_unittest.cc", + "../browser/metrics/tab_stats/tab_stats_tracker_unittest.cc", "../browser/page_load_metrics/observers/session_restore_page_load_metrics_observer_unittest.cc", "../browser/resource_coordinator/background_tab_navigation_throttle_unittest.cc", "../browser/resource_coordinator/decision_details_unittest.cc", @@ -6060,8 +6063,8 @@ "../browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc", "../browser/ui/views/bookmarks/bookmark_editor_view_unittest.cc", "../browser/ui/views/bookmarks/bookmark_menu_delegate_unittest.cc", + "../browser/ui/views/bubble/bubble_contents_wrapper_unittest.cc", "../browser/ui/views/bubble/webui_bubble_dialog_view_unittest.cc", - "../browser/ui/views/bubble/webui_bubble_view_unittest.cc", "../browser/ui/views/confirm_bubble_views_unittest.cc", "../browser/ui/views/content_setting_bubble_contents_unittest.cc", "../browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/MockTab.java b/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/MockTab.java index 0867f8b..f1bfa57 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/MockTab.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/MockTab.java
@@ -19,14 +19,14 @@ */ public static Tab createAndInitialize(int id, boolean incognito) { TabImpl tab = new MockTab(id, incognito); - tab.initialize(null, null, null, null, null, false, null, null); + tab.initialize(null, null, null, null, null, false, null); return tab; } public static TabImpl initializeWithCriticalPersistedTabData( TabImpl tab, CriticalPersistedTabData criticalPersistedTabData) { tab.getUserDataHost().setUserData(CriticalPersistedTabData.class, criticalPersistedTabData); - tab.initialize(null, null, null, null, null, false, null, null); + tab.initialize(null, null, null, null, null, false, null); return tab; } @@ -35,18 +35,18 @@ * these two fields only. */ public MockTab(int id, boolean incognito) { - super(id, null, incognito, null); + super(id, incognito, null, null); } public MockTab(int id, boolean incognito, @TabLaunchType Integer type) { - super(id, null, incognito, type); + super(id, incognito, type, null); } @Override public void initialize(Tab parent, @Nullable @TabCreationState Integer creationState, LoadUrlParams loadUrlParams, WebContents webContents, @Nullable TabDelegateFactory delegateFactory, boolean initiallyHidden, - TabState tabState, byte[] serializedCriticalPersistedTabData) { + TabState tabState) { TabHelpers.initTabHelpers(this, parent); } }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabCreator.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabCreator.java index 061983d..a602b80 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabCreator.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabCreator.java
@@ -52,7 +52,8 @@ } @Override - public Tab createFrozenTab(TabState state, byte[] criticalPersistedTabData, int id, int index) { + public Tab createFrozenTab(TabState state, byte[] criticalPersistedTabData, int id, + boolean isIncognito, int index) { Tab tab = new MockTab(id, state.isIncognito(), TabLaunchType.FROM_RESTORE); TabTestUtils.restoreFieldsFromState(tab, state); mSelector.getModel(mIsIncognito)
diff --git a/chrome/test/base/testing_profile.cc b/chrome/test/base/testing_profile.cc index 1c76cb1f..74ec6f43 100644 --- a/chrome/test/base/testing_profile.cc +++ b/chrome/test/base/testing_profile.cc
@@ -964,6 +964,7 @@ } void TestingProfile::SetCorsOriginAccessListForOrigin( + TargetBrowserContexts target_mode, const url::Origin& source_origin, std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
diff --git a/chrome/test/base/testing_profile.h b/chrome/test/base/testing_profile.h index 0751c92..05ef70e 100644 --- a/chrome/test/base/testing_profile.h +++ b/chrome/test/base/testing_profile.h
@@ -317,6 +317,7 @@ content::BrowsingDataRemoverDelegate* GetBrowsingDataRemoverDelegate() override; void SetCorsOriginAccessListForOrigin( + TargetBrowserContexts target_mode, const url::Origin& source_origin, std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
diff --git a/chrome/test/data/extensions/api_test/content_scripts/css_injection/content_styles.css b/chrome/test/data/extensions/api_test/content_scripts/css_injection/content_styles.css index 4fad41d..c41dd05 100644 --- a/chrome/test/data/extensions/api_test/content_scripts/css_injection/content_styles.css +++ b/chrome/test/data/extensions/api_test/content_scripts/css_injection/content_styles.css
@@ -3,5 +3,17 @@ * found in the LICENSE file. */ body { - display: none; + background-color: blue; +} + +body #div1 { + background-color: blue; +} + +body #div2 { + background-color: blue; +} + +body #div3 { + background-color: blue; }
diff --git a/chrome/test/data/extensions/test_file_with_style.css b/chrome/test/data/extensions/test_file_with_style.css new file mode 100644 index 0000000..7749e3c --- /dev/null +++ b/chrome/test/data/extensions/test_file_with_style.css
@@ -0,0 +1,7 @@ +/* Copyright 2021 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. */ + +#div2 { + background-color: red; +}
diff --git a/chrome/test/data/extensions/test_file_with_style.html b/chrome/test/data/extensions/test_file_with_style.html new file mode 100644 index 0000000..a4faa72 --- /dev/null +++ b/chrome/test/data/extensions/test_file_with_style.html
@@ -0,0 +1,20 @@ +<!doctype html> +<html> + <head> + <style> + div { + background-color: red; + } + #div1 { + background-color: red; + } + </style> + <link href="test_file_with_style.css" rel="stylesheet" type="text/css"> + </head> + <body> + <div id="div1">DIV 1</div> + <div id="div2">DIV 2</div> + <div id="div3">DIV 3</div> + <div id="div4">DIV 4</div> + </body> +</html>
diff --git a/chrome/test/data/extensions/test_file_with_style2.css b/chrome/test/data/extensions/test_file_with_style2.css new file mode 100644 index 0000000..6cb9020 --- /dev/null +++ b/chrome/test/data/extensions/test_file_with_style2.css
@@ -0,0 +1,7 @@ +/* Copyright 2021 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. */ + +#div3 { + background-color: red; +}
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn index 29dba58..387bf22 100644 --- a/chrome/test/data/webui/BUILD.gn +++ b/chrome/test/data/webui/BUILD.gn
@@ -76,7 +76,6 @@ sources = [ "../../../browser/ui/webui/identity_internals_ui_browsertest.js", "../../../browser/ui/webui/sync_internals/sync_internals_browsertest.js", - "about_invalidations_browsertest.js", "assertions.js", "async_gen.js", "bookmarks/bookmarks_browsertest.js", @@ -86,6 +85,7 @@ "cr_elements/cr_elements_v3_browsertest.js", "histograms/histograms_internals_ui_browsertest.js", "history/history_browsertest.js", + "invalidations/about_invalidations_browsertest.js", "js/webui_resource_module_async_browsertest.js", "js2gtest_browsertest.js", "load_time_data_browsertest.js",
diff --git a/chrome/test/data/webui/about_invalidations_browsertest.js b/chrome/test/data/webui/about_invalidations_browsertest.js deleted file mode 100644 index 7038bcd..0000000 --- a/chrome/test/data/webui/about_invalidations_browsertest.js +++ /dev/null
@@ -1,125 +0,0 @@ -// Copyright 2014 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. - -GEN('#include "content/public/test/browser_test.h"'); - -/** - * TestFixture for Invalidations WebUI testing. - * @extends {testing.Test} - * @constructor - */ -function InvalidationsWebUITest() {} - -InvalidationsWebUITest.prototype = { - __proto__: testing.Test.prototype, - - /** - * Browse to the Invalidations page. - */ - browsePreload: 'chrome://invalidations', -}; - -// Test that registering an invalidations appears properly on the textarea. -TEST_F('InvalidationsWebUITest', 'testRegisteringNewInvalidation', function() { - var invalidationsLog = $('invalidations-log'); - var invalidation = [ - {isUnknownVersion: 'true', objectId: {name: 'EXTENSIONS', source: 1004}} - ]; - invalidationsLog.value = ''; - chrome.invalidations.logInvalidations(invalidation); - var isContained = - invalidationsLog.value.indexOf( - 'Received Invalidation with type ' + - '"EXTENSIONS" version "Unknown" with payload "undefined"') !== -1; - expectTrue(isContained, 'Actual log is:' + invalidationsLog.value); - -}); - -// Test that changing the Invalidations Service state appears both in the -// span and in the textarea. -TEST_F('InvalidationsWebUITest', 'testChangingInvalidationsState', function() { - var invalidationsState = $('invalidations-state'); - var invalidationsLog = $('invalidations-log'); - var newState = 'INVALIDATIONS_ENABLED'; - var newNewState = 'TRANSIENT_INVALIDATION_ERROR'; - - chrome.invalidations.updateInvalidatorState(newState); - var isContainedState = - invalidationsState.textContent.indexOf('INVALIDATIONS_ENABLED') !== -1; - expectTrue(isContainedState, 'could not change the invalidations text'); - - invalidationsLog.value = ''; - chrome.invalidations.updateInvalidatorState(newNewState); - var isContainedState2 = invalidationsState.textContent.indexOf( - 'TRANSIENT_INVALIDATION_ERROR') !== -1; - expectTrue(isContainedState2, 'could not change the invalidations text'); - var isContainedLog = invalidationsLog.value.indexOf( - 'Invalidations service state changed to ' + - '"TRANSIENT_INVALIDATION_ERROR"') !== -1; - expectTrue(isContainedLog, 'Actual log is:' + invalidationsLog.value); -}); - -// Test that objects ids appear on the table. -TEST_F('InvalidationsWebUITest', 'testRegisteringNewIds', function() { - var newDataType = [ - {name: 'EXTENSIONS', source: 1004, totalCount: 0}, - {name: 'FAVICON_IMAGE', source: 1004, totalCount: 0} - ]; - var pattern1 = ['Fake', '1004', 'EXTENSIONS', '0', '0', '', '', '']; - var pattern2 = ['Fake', '1004', 'FAVICON_IMAGE', '0', '0', '', '', '']; - // Register two objects ID with 'Fake' registrar - chrome.invalidations.updateIds('Fake', newDataType); - // Disable the Extensions ObjectId by only sending FAVICON_IMAGE - newDataType = [{name: 'FAVICON_IMAGE', source: 1004}]; - chrome.invalidations.updateIds('Fake', newDataType); - - // Test that the two patterns are contained in the table. - var oidTable = $('objectsid-table-container'); - var foundPattern1 = false; - var foundPattern2 = false; - for (var row = 0; row < oidTable.rows.length; row++) { - var pattern1Test = true; - var pattern2Test = true; - for (var cell = 0; cell < oidTable.rows[row].cells.length; cell++) { - pattern1Test = pattern1Test && - (pattern1[cell] === oidTable.rows[row].cells[cell].textContent); - pattern2Test = pattern2Test && - (pattern2[cell] === oidTable.rows[row].cells[cell].textContent); - } - if (pattern1Test) { - expectEquals('greyed', oidTable.rows[row].className); - } - if (pattern2Test) { - expectEquals('content', oidTable.rows[row].className); - } - - foundPattern1 = foundPattern1 || pattern1Test; - foundPattern2 = foundPattern2 || pattern2Test; - if (foundPattern2) { - expectTrue(foundPattern1, 'The entries were not ordererd'); - } - } - expectTrue(foundPattern1 && foundPattern2, 'couldn\'t find both objects ids'); -}); - -// Test that registering new handlers appear on the website. -TEST_F('InvalidationsWebUITest', 'testUpdatingRegisteredHandlers', function() { - function text() { - return $('registered-handlers').textContent; - } - chrome.invalidations.updateHandlers(['FakeApi', 'FakeClient']); - expectNotEquals(text().indexOf('FakeApi'), -1); - expectNotEquals(text().indexOf('FakeClient'), -1); - - chrome.invalidations.updateHandlers(['FakeClient']); - expectEquals(text().indexOf('FakeApi'), -1); - expectNotEquals(text().indexOf('FakeClient'), -1); -}); - -// Test that an object showing internal state is correctly displayed. -TEST_F('InvalidationsWebUITest', 'testUpdatingInternalDisplay', function() { - var newDetailedStatus = {MessagesSent: 1}; - chrome.invalidations.updateDetailedStatus(newDetailedStatus); - expectEquals($('internal-display').value, '{\n \"MessagesSent\": 1\n}'); -});
diff --git a/chrome/test/data/webui/bluetooth_internals/bluetooth_internals_browsertest.js b/chrome/test/data/webui/bluetooth_internals/bluetooth_internals_browsertest.js index b972a2f9..2e91a40 100644 --- a/chrome/test/data/webui/bluetooth_internals/bluetooth_internals_browsertest.js +++ b/chrome/test/data/webui/bluetooth_internals/bluetooth_internals_browsertest.js
@@ -20,7 +20,7 @@ /** @override */ browsePreload: - 'chrome://bluetooth-internals/bluetooth_internals.html?test=bluetooth_internals_test.js', + 'chrome://bluetooth-internals/bluetooth_internals.html?module=bluetooth_internals/bluetooth_internals_test.js', /** @override */ isAsync: true,
diff --git a/chrome/test/data/webui/chromeos/scanning/loading_page_test.js b/chrome/test/data/webui/chromeos/scanning/loading_page_test.js index ca13508..9be5306 100644 --- a/chrome/test/data/webui/chromeos/scanning/loading_page_test.js +++ b/chrome/test/data/webui/chromeos/scanning/loading_page_test.js
@@ -38,4 +38,28 @@ assertTrue(isVisible( /** @type {!HTMLElement} */ (loadingPage.$$('#noScannersDiv')))); }); + + test('retryClick', () => { + loadingPage.appState = AppState.NO_SCANNERS; + + let retryEventFired = false; + loadingPage.addEventListener('retry-click', function() { + retryEventFired = true; + }); + + loadingPage.$$('#retryButton').click(); + assertTrue(retryEventFired); + }); + + test('learnMoreClick', () => { + loadingPage.appState = AppState.NO_SCANNERS; + + let learnMoreEventFired = false; + loadingPage.addEventListener('learn-more-click', function() { + learnMoreEventFired = true; + }); + + loadingPage.$$('#learnMoreButton').click(); + assertTrue(learnMoreEventFired); + }); }
diff --git a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js index 6451462..96eb0165 100644 --- a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js +++ b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
@@ -765,4 +765,25 @@ /** @type {!HTMLElement} */ (scanningApp.$$('#panelContainer')))); }); }); + + test('RetryClickLoadsScanners', () => { + return initializeScanningApp(/*scanners=*/[], /*capabilities=*/ new Map()) + .then(() => { + assertTrue(isVisible( + /** @type {!HTMLElement} */ (scanningApp.$$('loading-page')))); + assertFalse(isVisible( + /** @type {!HTMLElement} */ (scanningApp.$$('#panelContainer')))); + + fakeScanService_.setScanners(expectedScanners); + fakeScanService_.setCapabilities(capabilities); + scanningApp.$$('loading-page').$$('#retryButton').click(); + return fakeScanService_.whenCalled('getScanners'); + }) + .then(() => { + assertFalse(isVisible( + /** @type {!HTMLElement} */ (scanningApp.$$('loading-page')))); + assertTrue(isVisible( + /** @type {!HTMLElement} */ (scanningApp.$$('#panelContainer')))); + }); + }); }
diff --git a/chrome/test/data/webui/invalidations/about_invalidations_browsertest.js b/chrome/test/data/webui/invalidations/about_invalidations_browsertest.js new file mode 100644 index 0000000..20504df --- /dev/null +++ b/chrome/test/data/webui/invalidations/about_invalidations_browsertest.js
@@ -0,0 +1,60 @@ +// Copyright 2014 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. + +GEN('#include "content/public/test/browser_test.h"'); + +/** + * TestFixture for Invalidations WebUI testing. + * @extends {testing.Test} + * @constructor + */ +function InvalidationsWebUITest() {} + +InvalidationsWebUITest.prototype = { + __proto__: testing.Test.prototype, + + /** + * Browse to the Invalidations page. + */ + browsePreload: + 'chrome://invalidations/invalidations.html?module=invalidations/invalidations_test.js', + + extraLibraries: [ + '//third_party/mocha/mocha.js', + '//chrome/test/data/webui/mocha_adapter.js', + ], + + suiteName: 'invalidations_test', + + /** @param {string} testName The name of the test to run. */ + runMochaTest: function(testName) { + runMochaTest(this.suiteName, testName); + }, +}; + +// Test that registering an invalidations appears properly on the textarea. +TEST_F('InvalidationsWebUITest', 'testRegisteringNewInvalidation', function() { + this.runMochaTest(invalidations_test.TestNames.RegisterNewInvalidation); +}); + +// Test that changing the Invalidations Service state appears both in the +// span and in the textarea. +TEST_F('InvalidationsWebUITest', 'testChangingInvalidationsState', function() { + this.runMochaTest(invalidations_test.TestNames.ChangeInvalidationsState); +}); + +// Test that objects ids appear on the table. +TEST_F('InvalidationsWebUITest', 'testRegisteringNewIds', function() { + this.runMochaTest(invalidations_test.TestNames.RegisterNewIds); +}); + +// Test that registering new handlers appear on the website. +TEST_F('InvalidationsWebUITest', 'testUpdatingRegisteredHandlers', function() { + this.runMochaTest(invalidations_test.TestNames.UpdateRegisteredHandlers); +}); + +// Test that an object showing internal state is correctly displayed. +TEST_F('InvalidationsWebUITest', 'testUpdatingInternalDisplay', function() { + this.runMochaTest(invalidations_test.TestNames.UpdateInternalDisplay); +});
diff --git a/chrome/test/data/webui/invalidations/invalidations_test.js b/chrome/test/data/webui/invalidations/invalidations_test.js new file mode 100644 index 0000000..c02ef2b --- /dev/null +++ b/chrome/test/data/webui/invalidations/invalidations_test.js
@@ -0,0 +1,123 @@ +// Copyright 2021 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 {webUIListenerCallback} from 'chrome://resources/js/cr.m.js'; +import {$} from 'chrome://resources/js/util.m.js'; +import {assertEquals, assertNotEquals, assertTrue} from '../chai_assert.js'; + +window.invalidations_test = {}; +invalidations_test = window.invalidations_test; +invalidations_test.TestNames = { + RegisterNewInvalidation: 'register new invalidation', + ChangeInvalidationsState: 'change invalidations state', + RegisterNewIds: 'register new ids', + UpdateRegisteredHandlers: 'update registered handlers', + UpdateInternalDisplay: 'update internal display', +}; + +suite('invalidations_test', function() { + // Test that registering an invalidations appears properly on the textarea. + test(invalidations_test.TestNames.RegisterNewInvalidation, function() { + var invalidationsLog = $('invalidations-log'); + var invalidation = [ + {isUnknownVersion: 'true', objectId: {name: 'EXTENSIONS', source: 1004}} + ]; + invalidationsLog.value = ''; + webUIListenerCallback('log-invalidations', invalidation); + var isContained = + invalidationsLog.value.indexOf( + 'Received Invalidation with type ' + + '"EXTENSIONS" version "Unknown" with payload "undefined"') !== -1; + assertTrue(isContained, 'Actual log is:' + invalidationsLog.value); + }); + + // Test that changing the Invalidations Service state appears both in the + // span and in the textarea. + test(invalidations_test.TestNames.ChangeInvalidationsState, function() { + var invalidationsState = $('invalidations-state'); + var invalidationsLog = $('invalidations-log'); + var newState = 'INVALIDATIONS_ENABLED'; + var newNewState = 'TRANSIENT_INVALIDATION_ERROR'; + + webUIListenerCallback('state-updated', newState); + var isContainedState = + invalidationsState.textContent.indexOf('INVALIDATIONS_ENABLED') !== -1; + assertTrue(isContainedState, 'could not change the invalidations text'); + + invalidationsLog.value = ''; + webUIListenerCallback('state-updated', newNewState); + var isContainedState2 = invalidationsState.textContent.indexOf( + 'TRANSIENT_INVALIDATION_ERROR') !== -1; + assertTrue(isContainedState2, 'could not change the invalidations text'); + var isContainedLog = invalidationsLog.value.indexOf( + 'Invalidations service state changed to ' + + '"TRANSIENT_INVALIDATION_ERROR"') !== -1; + assertTrue(isContainedLog, 'Actual log is:' + invalidationsLog.value); + }); + + // Test that objects ids appear on the table. + test(invalidations_test.TestNames.RegisterNewIds, function() { + var newDataType = [ + {name: 'EXTENSIONS', source: 1004, totalCount: 0}, + {name: 'FAVICON_IMAGE', source: 1004, totalCount: 0} + ]; + var pattern1 = ['Fake', '1004', 'EXTENSIONS', '0', '0', '', '', '']; + var pattern2 = ['Fake', '1004', 'FAVICON_IMAGE', '0', '0', '', '', '']; + // Register two objects ID with 'Fake' registrar + webUIListenerCallback('ids-updated', newDataType); + // Disable the Extensions ObjectId by only sending FAVICON_IMAGE + newDataType = [{name: 'FAVICON_IMAGE', source: 1004}]; + webUIListenerCallback('ids-updated', newDataType); + + // Test that the two patterns are contained in the table. + var oidTable = $('objectsid-table-container'); + var foundPattern1 = false; + var foundPattern2 = false; + for (var row = 0; row < oidTable.rows.length; row++) { + var pattern1Test = true; + var pattern2Test = true; + for (var cell = 0; cell < oidTable.rows[row].cells.length; cell++) { + pattern1Test = pattern1Test && + (pattern1[cell] === oidTable.rows[row].cells[cell].textContent); + pattern2Test = pattern2Test && + (pattern2[cell] === oidTable.rows[row].cells[cell].textContent); + } + if (pattern1Test) { + assertEquals('greyed', oidTable.rows[row].className); + } + if (pattern2Test) { + assertEquals('content', oidTable.rows[row].className); + } + + foundPattern1 = foundPattern1 || pattern1Test; + foundPattern2 = foundPattern2 || pattern2Test; + if (foundPattern2) { + assertTrue(foundPattern1, 'The entries were not ordererd'); + } + } + assertTrue( + foundPattern1 && foundPattern2, 'couldn\'t find both objects ids'); + }); + + // Test that registering new handlers appear on the website. + test(invalidations_test.TestNames.UpdateRegisteredHandlers, function() { + function text() { + return $('registered-handlers').textContent; + } + webUIListenerCallback('handlers-updated', ['FakeApi', 'FakeClient']); + assertNotEquals(text().indexOf('FakeApi'), -1); + assertNotEquals(text().indexOf('FakeClient'), -1); + + webUIListenerCallback('handlers-updated', ['FakeClient']); + assertEquals(text().indexOf('FakeApi'), -1); + assertNotEquals(text().indexOf('FakeClient'), -1); + }); + + // Test that an object showing internal state is correctly displayed. + test(invalidations_test.TestNames.UpdateInternalDisplay, function() { + newDetailedStatus = {MessagesSent: 1}; + webUIListenerCallback('detailed-status-updated', newDetailedStatus); + assertEquals($('internal-display').value, '{\n \"MessagesSent\": 1\n}'); + }); +});
diff --git a/chrome/test/data/webui/multidevice_setup/integration_test.js b/chrome/test/data/webui/multidevice_setup/integration_test.js index 81873903..53141152 100644 --- a/chrome/test/data/webui/multidevice_setup/integration_test.js +++ b/chrome/test/data/webui/multidevice_setup/integration_test.js
@@ -3,376 +3,363 @@ // found in the LICENSE file. /** @fileoverview Suite of integration tests for MultiDevice setup WebUI. */ -cr.define('multidevice_setup', () => { - /** @implements {multidevice_setup.MultiDeviceSetupDelegate} */ - class FakeDelegate { - constructor() { - /** @private {boolean} */ - this.isPasswordRequiredToSetHost_ = true; +/** @implements {multidevice_setup.MultiDeviceSetupDelegate} */ +class FakeDelegate { + constructor() { + /** @private {boolean} */ + this.isPasswordRequiredToSetHost_ = true; - /** @private {boolean} */ - this.shouldSetHostSucceed_ = true; + /** @private {boolean} */ + this.shouldSetHostSucceed_ = true; - this.numSetHostDeviceCalls = 0; - } - - set isPasswordRequired(isPasswordRequired) { - this.isPasswordRequiredToSetHost_ = isPasswordRequired; - } - - /** @override */ - isPasswordRequiredToSetHost() { - return this.isPasswordRequiredToSetHost_; - } - - set shouldSetHostSucceed(shouldSetHostSucceed) { - this.shouldSetHostSucceed_ = shouldSetHostSucceed; - } - - /** @override */ - setHostDevice(hostInstanceIdOrLegacyDeviceId, opt_authToken) { - return new Promise((resolve) => { - this.numSetHostDeviceCalls++; - resolve({success: this.shouldSetHostSucceed_}); - }); - } - - set shouldExitSetupFlowAfterHostSet(shouldExitSetupFlowAfterHostSet) { - this.shouldExitSetupFlowAfterSettingHost_ = - shouldExitSetupFlowAfterHostSet; - } - - /** @override */ - shouldExitSetupFlowAfterSettingHost() { - return this.shouldExitSetupFlowAfterSettingHost_; - } - - /** @override */ - getStartSetupCancelButtonTextId() { - return 'cancel'; - } + this.numSetHostDeviceCalls = 0; } - /** @implements {multidevice_setup.MojoInterfaceProvider} */ - class FakeMojoInterfaceProviderImpl { - /** @param {!FakeMojoService} fakeMojoService */ - constructor(fakeMojoService) { - /** @private {!FakeMojoService} */ - this.fakeMojoService_ = fakeMojoService; - } - - /** @override */ - getInterfacePtr() { - return this.fakeMojoService_; - } + set isPasswordRequired(isPasswordRequired) { + this.isPasswordRequiredToSetHost_ = isPasswordRequired; } - function registerIntegrationTests() { - suite('MultiDeviceSetup', () => { - /** - * MultiDeviceSetup created before each test. Defined in setUp. - * @type {MultiDeviceSetup|undefined} - */ - let multiDeviceSetupElement; + /** @override */ + isPasswordRequiredToSetHost() { + return this.isPasswordRequiredToSetHost_; + } - /** - * Forward navigation button. Defined in setUp. - * @type {PaperButton|undefined} - */ - let forwardButton; + set shouldSetHostSucceed(shouldSetHostSucceed) { + this.shouldSetHostSucceed_ = shouldSetHostSucceed; + } - /** - * Cancel button. Defined in setUp. - * @type {PaperButton|undefined} - */ - let cancelButton; + /** @override */ + setHostDevice(hostInstanceIdOrLegacyDeviceId, opt_authToken) { + return new Promise((resolve) => { + this.numSetHostDeviceCalls++; + resolve({success: this.shouldSetHostSucceed_}); + }); + } - /** - * Backward navigation button. Defined in setUp. - * @type {PaperButton|undefined} - */ - let backwardButton; + set shouldExitSetupFlowAfterHostSet(shouldExitSetupFlowAfterHostSet) { + this.shouldExitSetupFlowAfterSettingHost_ = shouldExitSetupFlowAfterHostSet; + } - /** @type {!FakeMojoService} */ - let fakeMojoService; + /** @override */ + shouldExitSetupFlowAfterSettingHost() { + return this.shouldExitSetupFlowAfterSettingHost_; + } - /** @type {!settings.FakeQuickUnlockPrivate} */ - let fakeQuickUnlockPrivate; + /** @override */ + getStartSetupCancelButtonTextId() { + return 'cancel'; + } +} - /** @type {?TestMultideviceSetupBrowserProxy} */ - let browserProxy = null; +/** @implements {multidevice_setup.MojoInterfaceProvider} */ +class FakeMojoInterfaceProviderImpl { + /** @param {!FakeMojoService} fakeMojoService */ + constructor(fakeMojoService) { + /** @private {!FakeMojoService} */ + this.fakeMojoService_ = fakeMojoService; + } - const PASSWORD = 'password-page'; - const SUCCESS = 'setup-succeeded-page'; - const START = 'start-setup-page'; + /** @override */ + getInterfacePtr() { + return this.fakeMojoService_; + } +} - const CORRECT_PASSWORD = 'correctPassword'; - const WRONG_PASSWORD = 'wrongPassword'; +suite('MultiDeviceSetup', () => { + /** + * MultiDeviceSetup created before each test. Defined in setUp. + * @type {MultiDeviceSetup|undefined} + */ + let multiDeviceSetupElement; - setup(() => { - browserProxy = new TestMultideviceSetupBrowserProxy(); - multidevice_setup.BrowserProxyImpl.instance_ = browserProxy; + /** + * Forward navigation button. Defined in setUp. + * @type {PaperButton|undefined} + */ + let forwardButton; - multiDeviceSetupElement = document.createElement('multidevice-setup'); - multiDeviceSetupElement.delegate = new FakeDelegate(); - fakeMojoService = new FakeMojoService(); - multiDeviceSetupElement.mojoInterfaceProvider_ = - new FakeMojoInterfaceProviderImpl(fakeMojoService); + /** + * Cancel button. Defined in setUp. + * @type {PaperButton|undefined} + */ + let cancelButton; - document.body.appendChild(multiDeviceSetupElement); - Polymer.dom.flush(); + /** + * Backward navigation button. Defined in setUp. + * @type {PaperButton|undefined} + */ + let backwardButton; - forwardButton = multiDeviceSetupElement.$$('button-bar').$$('#forward'); - cancelButton = multiDeviceSetupElement.$$('button-bar').$$('#cancel'); - backwardButton = - multiDeviceSetupElement.$$('button-bar').$$('#backward'); + /** @type {!FakeMojoService} */ + let fakeMojoService; - fakeQuickUnlockPrivate = new settings.FakeQuickUnlockPrivate(); - fakeQuickUnlockPrivate.accountPassword = CORRECT_PASSWORD; - multiDeviceSetupElement.$$(PASSWORD).quickUnlockPrivate_ = - fakeQuickUnlockPrivate; - }); + /** @type {!settings.FakeQuickUnlockPrivate} */ + let fakeQuickUnlockPrivate; - /** @param {boolean} isOobeMode */ - function setMode(isOobeMode) { - multiDeviceSetupElement.delegate.isPasswordRequired = !isOobeMode; - multiDeviceSetupElement.delegate.shouldExitSetupFlowAfterHostSet = - isOobeMode; - } + /** @type {?TestMultideviceSetupBrowserProxy} */ + let browserProxy = null; - /** - * @param {string} visiblePageName - * @return {!Promise} Promise that resolves when the page renders. - */ - function setVisiblePage(visiblePageName) { - multiDeviceSetupElement.visiblePageName = visiblePageName; - Polymer.dom.flush(); - return test_util.waitBeforeNextRender( - multiDeviceSetupElement.$$(visiblePageName)); - } + const PASSWORD = 'password-page'; + const SUCCESS = 'setup-succeeded-page'; + const START = 'start-setup-page'; - /** - * @param {string} input - * @return {!Promise} Promise that resolves when the page renders. - */ - function enterPassword(input) { - multiDeviceSetupElement.$$(PASSWORD).$$('#passwordInput').value = input; - Polymer.dom.flush(); - return test_util.waitBeforeNextRender(multiDeviceSetupElement); - } + const CORRECT_PASSWORD = 'correctPassword'; + const WRONG_PASSWORD = 'wrongPassword'; - function getNumSetHostDeviceCalls() { - return multiDeviceSetupElement.delegate.numSetHostDeviceCalls; - } + setup(() => { + browserProxy = new TestMultideviceSetupBrowserProxy(); + multidevice_setup.BrowserProxyImpl.instance_ = browserProxy; - // *** From SetupSucceededPage *** + multiDeviceSetupElement = document.createElement('multidevice-setup'); + multiDeviceSetupElement.delegate = new FakeDelegate(); + fakeMojoService = new FakeMojoService(); + multiDeviceSetupElement.mojoInterfaceProvider_ = + new FakeMojoInterfaceProviderImpl(fakeMojoService); - test('SetupSucceededPage buttons: forward', () => { - return setVisiblePage(SUCCESS).then(() => { - assertFalse(forwardButton.hidden); - assertTrue(cancelButton.hidden); - assertTrue(backwardButton.hidden); - }); - }); + document.body.appendChild(multiDeviceSetupElement); + Polymer.dom.flush(); - test('SetupSucceededPage forward button closes UI', () => { - return setVisiblePage(SUCCESS).then(() => { + forwardButton = multiDeviceSetupElement.$$('button-bar').$$('#forward'); + cancelButton = multiDeviceSetupElement.$$('button-bar').$$('#cancel'); + backwardButton = multiDeviceSetupElement.$$('button-bar').$$('#backward'); + + fakeQuickUnlockPrivate = new settings.FakeQuickUnlockPrivate(); + fakeQuickUnlockPrivate.accountPassword = CORRECT_PASSWORD; + multiDeviceSetupElement.$$(PASSWORD).quickUnlockPrivate_ = + fakeQuickUnlockPrivate; + }); + + /** @param {boolean} isOobeMode */ + function setMode(isOobeMode) { + multiDeviceSetupElement.delegate.isPasswordRequired = !isOobeMode; + multiDeviceSetupElement.delegate.shouldExitSetupFlowAfterHostSet = + isOobeMode; + } + + /** + * @param {string} visiblePageName + * @return {!Promise} Promise that resolves when the page renders. + */ + function setVisiblePage(visiblePageName) { + multiDeviceSetupElement.visiblePageName = visiblePageName; + Polymer.dom.flush(); + return test_util.waitBeforeNextRender( + multiDeviceSetupElement.$$(visiblePageName)); + } + + /** + * @param {string} input + * @return {!Promise} Promise that resolves when the page renders. + */ + function enterPassword(input) { + multiDeviceSetupElement.$$(PASSWORD).$$('#passwordInput').value = input; + Polymer.dom.flush(); + return test_util.waitBeforeNextRender(multiDeviceSetupElement); + } + + function getNumSetHostDeviceCalls() { + return multiDeviceSetupElement.delegate.numSetHostDeviceCalls; + } + + // *** From SetupSucceededPage *** + + test('SetupSucceededPage buttons: forward', () => { + return setVisiblePage(SUCCESS).then(() => { + assertFalse(forwardButton.hidden); + assertTrue(cancelButton.hidden); + assertTrue(backwardButton.hidden); + }); + }); + + test('SetupSucceededPage forward button closes UI', () => { + return setVisiblePage(SUCCESS).then(() => { + const whenSetupExits = + test_util.eventToPromise('setup-exited', multiDeviceSetupElement); + forwardButton.click(); + return whenSetupExits; + }); + }); + + // Post-OOBE + + test('SetupSucceededPage Settings link closes UI (post-OOBE)', () => { + setMode(false /* isOobeMode */); + return setVisiblePage(SUCCESS).then(() => { + const whenSetupExits = + test_util.eventToPromise('setup-exited', multiDeviceSetupElement); + multiDeviceSetupElement.$$(SUCCESS).$$('#settings-link').click(); + return whenSetupExits; + }); + }); + + // *** From StartSetupPage *** + + test('StartSetupPage buttons: forward, cancel', () => { + return setVisiblePage(START).then(() => { + assertFalse(forwardButton.hidden); + assertFalse(cancelButton.hidden); + assertTrue(backwardButton.hidden); + }); + }); + + // OOBE + + test('StartSetupPage cancel button exits OOBE (OOBE)', () => { + setMode(true /* isOobeMode */); + + return setVisiblePage(START) + .then(() => { const whenSetupExits = test_util.eventToPromise('setup-exited', multiDeviceSetupElement); - forwardButton.click(); + cancelButton.click(); return whenSetupExits; + }) + .then(() => { + assertEquals(0, getNumSetHostDeviceCalls()); }); - }); + }); - // Post-OOBE - - test('SetupSucceededPage Settings link closes UI (post-OOBE)', () => { - setMode(false /* isOobeMode */); - return setVisiblePage(SUCCESS).then(() => { - const whenSetupExits = - test_util.eventToPromise('setup-exited', multiDeviceSetupElement); - multiDeviceSetupElement.$$(SUCCESS).$$('#settings-link').click(); - return whenSetupExits; - }); - }); - - // *** From StartSetupPage *** - - test('StartSetupPage buttons: forward, cancel', () => { - return setVisiblePage(START).then(() => { - assertFalse(forwardButton.hidden); - assertFalse(cancelButton.hidden); - assertTrue(backwardButton.hidden); - }); - }); - - // OOBE - - test('StartSetupPage cancel button exits OOBE (OOBE)', () => { + test( + 'StartSetupPage forward button sets host in background and ' + + 'exits OOBE (OOBE)', + () => { setMode(true /* isOobeMode */); return setVisiblePage(START) .then(() => { + multiDeviceSetupElement.delegate.shouldSetHostSucceed = true; const whenSetupExits = test_util.eventToPromise( 'setup-exited', multiDeviceSetupElement); - cancelButton.click(); + forwardButton.click(); return whenSetupExits; }) .then(() => { - assertEquals(0, getNumSetHostDeviceCalls()); + assertEquals(1, getNumSetHostDeviceCalls()); }); }); - test( - 'StartSetupPage forward button sets host in background and ' + - 'exits OOBE (OOBE)', - () => { - setMode(true /* isOobeMode */); + // Post-OOBE - return setVisiblePage(START) - .then(() => { - multiDeviceSetupElement.delegate.shouldSetHostSucceed = true; - const whenSetupExits = test_util.eventToPromise( - 'setup-exited', multiDeviceSetupElement); - forwardButton.click(); - return whenSetupExits; - }) - .then(() => { - assertEquals(1, getNumSetHostDeviceCalls()); - }); - }); + test('StartSetupPage cancel button closes UI (post-OOBE)', () => { + setMode(false /* isOobeMode */); - // Post-OOBE + return setVisiblePage(START) + .then(() => { + const whenSetupExits = + test_util.eventToPromise('setup-exited', multiDeviceSetupElement); + cancelButton.click(); + return whenSetupExits; + }) + .then(() => { + assertEquals(0, getNumSetHostDeviceCalls()); + }); + }); - test('StartSetupPage cancel button closes UI (post-OOBE)', () => { - setMode(false /* isOobeMode */); + // *** From PasswordPage *** - return setVisiblePage(START) - .then(() => { - const whenSetupExits = test_util.eventToPromise( - 'setup-exited', multiDeviceSetupElement); - cancelButton.click(); - return whenSetupExits; - }) - .then(() => { - assertEquals(0, getNumSetHostDeviceCalls()); - }); - }); + // Post-OOBE - // *** From PasswordPage *** + test('PasswordPage buttons: forward, cancel, backward (post-OOBE)', () => { + return setVisiblePage(PASSWORD).then(() => { + assertFalse(forwardButton.hidden); + assertFalse(cancelButton.hidden); + assertFalse(backwardButton.hidden); + }); + }); - // Post-OOBE + test('PasswordPage cancel button closes UI (post-OOBE)', () => { + setMode(false /* isOobeMode */); - test( - 'PasswordPage buttons: forward, cancel, backward (post-OOBE)', () => { - return setVisiblePage(PASSWORD).then(() => { - assertFalse(forwardButton.hidden); - assertFalse(cancelButton.hidden); - assertFalse(backwardButton.hidden); - }); - }); + return setVisiblePage(PASSWORD) + .then(() => { + const whenSetupExits = + test_util.eventToPromise('setup-exited', multiDeviceSetupElement); + cancelButton.click(); + return whenSetupExits; + }) + .then(() => { + assertEquals(0, getNumSetHostDeviceCalls()); + }); + }); - test('PasswordPage cancel button closes UI (post-OOBE)', () => { + test('PasswordPage backward button goes to start page (post-OOBE)', () => { + setMode(false /* isOobeMode */); + + return setVisiblePage(PASSWORD) + .then(() => { + const whenPageChanges = test_util.eventToPromise( + 'visible-page-name-changed', multiDeviceSetupElement); + backwardButton.click(); + return whenPageChanges; + }) + .then(() => { + assertEquals(START, multiDeviceSetupElement.visiblePageName); + assertEquals(0, getNumSetHostDeviceCalls()); + }); + }); + + test( + 'PasswordPage forward button goes to success page if mojo works ' + + '(post-OOBE)', + () => { setMode(false /* isOobeMode */); return setVisiblePage(PASSWORD) .then(() => { - const whenSetupExits = test_util.eventToPromise( - 'setup-exited', multiDeviceSetupElement); - cancelButton.click(); - return whenSetupExits; + return enterPassword(CORRECT_PASSWORD); }) .then(() => { + multiDeviceSetupElement.delegate.shouldSetHostSucceed = true; + const whenPageChanges = test_util.eventToPromise( + 'visible-page-name-changed', multiDeviceSetupElement); + forwardButton.click(); + return whenPageChanges; + }) + .then(() => { + assertEquals(SUCCESS, multiDeviceSetupElement.visiblePageName); + assertEquals(1, getNumSetHostDeviceCalls()); + }); + }); + + test( + 'PasswordPage forward button does nothing if invalid password ' + + '(post-OOBE)', + () => { + setMode(false /* isOobeMode */); + + return setVisiblePage(PASSWORD) + .then(() => { + return enterPassword(WRONG_PASSWORD); + }) + .then(() => { + multiDeviceSetupElement.delegate.shouldSetHostSucceed = true; + forwardButton.click(); + Polymer.dom.flush(); + return test_util.waitBeforeNextRender(multiDeviceSetupElement); + }) + .then(() => { + assertEquals(PASSWORD, multiDeviceSetupElement.visiblePageName); assertEquals(0, getNumSetHostDeviceCalls()); }); }); - test( - 'PasswordPage backward button goes to start page (post-OOBE)', () => { - setMode(false /* isOobeMode */); + test( + 'PasswordPage forward button is disabled if invalid password ' + + '(post-OOBE)', + () => { + const whenMultiDeviceSetupLoads = setMode(false /* isOobeMode */); - return setVisiblePage(PASSWORD) - .then(() => { - const whenPageChanges = test_util.eventToPromise( - 'visible-page-name-changed', multiDeviceSetupElement); - backwardButton.click(); - return whenPageChanges; - }) - .then(() => { - assertEquals(START, multiDeviceSetupElement.visiblePageName); - assertEquals(0, getNumSetHostDeviceCalls()); - }); - }); - - test( - 'PasswordPage forward button goes to success page if mojo works ' + - '(post-OOBE)', - () => { - setMode(false /* isOobeMode */); - - return setVisiblePage(PASSWORD) - .then(() => { - return enterPassword(CORRECT_PASSWORD); - }) - .then(() => { - multiDeviceSetupElement.delegate.shouldSetHostSucceed = true; - const whenPageChanges = test_util.eventToPromise( - 'visible-page-name-changed', multiDeviceSetupElement); - forwardButton.click(); - return whenPageChanges; - }) - .then(() => { - assertEquals( - SUCCESS, multiDeviceSetupElement.visiblePageName); - assertEquals(1, getNumSetHostDeviceCalls()); - }); - }); - - test( - 'PasswordPage forward button does nothing if invalid password ' + - '(post-OOBE)', - () => { - setMode(false /* isOobeMode */); - - return setVisiblePage(PASSWORD) - .then(() => { - return enterPassword(WRONG_PASSWORD); - }) - .then(() => { - multiDeviceSetupElement.delegate.shouldSetHostSucceed = true; - forwardButton.click(); - Polymer.dom.flush(); - return test_util.waitBeforeNextRender( - multiDeviceSetupElement); - }) - .then(() => { - assertEquals( - PASSWORD, multiDeviceSetupElement.visiblePageName); - assertEquals(0, getNumSetHostDeviceCalls()); - }); - }); - - test( - 'PasswordPage forward button is disabled if invalid password ' + - '(post-OOBE)', - () => { - const whenMultiDeviceSetupLoads = setMode(false /* isOobeMode */); - - return setVisiblePage(PASSWORD) - .then(() => { - return enterPassword(WRONG_PASSWORD); - }) - .then(() => { - forwardButton.click(); - Polymer.dom.flush(); - return test_util.waitBeforeNextRender( - multiDeviceSetupElement); - }) - .then(() => { - assertTrue(multiDeviceSetupElement.forwardButtonDisabled); - }); - }); - }); - } - return {registerIntegrationTests: registerIntegrationTests}; + return setVisiblePage(PASSWORD) + .then(() => { + return enterPassword(WRONG_PASSWORD); + }) + .then(() => { + forwardButton.click(); + Polymer.dom.flush(); + return test_util.waitBeforeNextRender(multiDeviceSetupElement); + }) + .then(() => { + assertTrue(multiDeviceSetupElement.forwardButtonDisabled); + }); + }); });
diff --git a/chrome/test/data/webui/multidevice_setup/multidevice_setup_browsertest.js b/chrome/test/data/webui/multidevice_setup/multidevice_setup_browsertest.js index 65e259150..b89ccbf2 100644 --- a/chrome/test/data/webui/multidevice_setup/multidevice_setup_browsertest.js +++ b/chrome/test/data/webui/multidevice_setup/multidevice_setup_browsertest.js
@@ -9,41 +9,37 @@ GEN('#include "content/public/test/browser_test.h"'); -/** - * Test fixture for MultiDeviceSetup elements. - * @constructor - * @extends {PolymerTest} - */ -function MultiDeviceSetupBrowserTest() {} +// clang-format off +[ + ['Integration', 'integration_test.js', []], + ['SetupSucceededPage', 'setup_succeeded_page_test.js', []], + ['StartSetupPage', 'start_setup_page_test.js', []], +] + .forEach( + test => registerTest('MultiDeviceSetup', ...test)); +// clang-format on -MultiDeviceSetupBrowserTest.prototype = { - __proto__: Polymer2DeprecatedTest.prototype, +function registerTest(componentName, testName, module, deps) { + const className = `${componentName}${testName}Test`; + this[className] = class extends Polymer2DeprecatedTest { + /** @override */ + get browsePreload() { + return `chrome://multidevice-setup/`; + } - browsePreload: 'chrome://multidevice-setup/', + /** @override */ + get extraLibraries() { + return [ + ...Polymer2DeprecatedTest.prototype.extraLibraries, + '../test_browser_proxy.js', + '../fake_chrome_event.js', // Necessary for + // fake_quick_unlock_private.js + '../settings/chromeos/fake_quick_unlock_private.js', + '../test_util.js', + 'setup_succeeded_page_test.js', + ]; + } + }; - extraLibraries: [ - ...Polymer2DeprecatedTest.prototype.extraLibraries, - '../test_browser_proxy.js', - '../fake_chrome_event.js', // Necessary for fake_quick_unlock_private.js - '../settings/chromeos/fake_quick_unlock_private.js', - '../test_util.js', - 'integration_test.js', - 'setup_succeeded_page_test.js', - 'start_setup_page_test.js', - ], -}; - -TEST_F('MultiDeviceSetupBrowserTest', 'Integration', function() { - multidevice_setup.registerIntegrationTests(); - mocha.run(); -}); - -TEST_F('MultiDeviceSetupBrowserTest', 'SetupSucceededPage', function() { - multidevice_setup.registerSetupSucceededPageTests(); - mocha.run(); -}); - -TEST_F('MultiDeviceSetupBrowserTest', 'StartSetupPage', function() { - multidevice_setup.registerStartSetupPageTests(); - mocha.run(); -}); + TEST_F(className, 'All', () => mocha.run()); +}
diff --git a/chrome/test/data/webui/multidevice_setup/setup_succeeded_page_test.js b/chrome/test/data/webui/multidevice_setup/setup_succeeded_page_test.js index 0223896..b9cbc35 100644 --- a/chrome/test/data/webui/multidevice_setup/setup_succeeded_page_test.js +++ b/chrome/test/data/webui/multidevice_setup/setup_succeeded_page_test.js
@@ -27,31 +27,25 @@ } } -cr.define('multidevice_setup', () => { - function registerSetupSucceededPageTests() { - suite('MultiDeviceSetup', () => { - /** - * SetupSucceededPage created before each test. Defined in setUp. - * @type {?SetupSucceededPage} - */ - let setupSucceededPageElement = null; - /** @type {?TestMultideviceSetupBrowserProxy} */ - let browserProxy = null; +suite('MultiDeviceSetup', () => { + /** + * SetupSucceededPage created before each test. Defined in setUp. + * @type {?SetupSucceededPage} + */ + let setupSucceededPageElement = null; + /** @type {?TestMultideviceSetupBrowserProxy} */ + let browserProxy = null; - setup(() => { - browserProxy = new TestMultideviceSetupBrowserProxy(); - multidevice_setup.BrowserProxyImpl.instance_ = browserProxy; + setup(() => { + browserProxy = new TestMultideviceSetupBrowserProxy(); + multidevice_setup.BrowserProxyImpl.instance_ = browserProxy; - setupSucceededPageElement = - document.createElement('setup-succeeded-page'); - document.body.appendChild(setupSucceededPageElement); - }); + setupSucceededPageElement = document.createElement('setup-succeeded-page'); + document.body.appendChild(setupSucceededPageElement); + }); - test('Settings link opens settings page', () => { - setupSucceededPageElement.$$('#settings-link').click(); - return browserProxy.whenCalled('openMultiDeviceSettings'); - }); - }); - } - return {registerSetupSucceededPageTests: registerSetupSucceededPageTests}; + test('Settings link opens settings page', () => { + setupSucceededPageElement.$$('#settings-link').click(); + return browserProxy.whenCalled('openMultiDeviceSettings'); + }); });
diff --git a/chrome/test/data/webui/multidevice_setup/start_setup_page_test.js b/chrome/test/data/webui/multidevice_setup/start_setup_page_test.js index 95b2329..12f2fbfb7 100644 --- a/chrome/test/data/webui/multidevice_setup/start_setup_page_test.js +++ b/chrome/test/data/webui/multidevice_setup/start_setup_page_test.js
@@ -3,11 +3,12 @@ // found in the LICENSE file. /** - * In the testing framework, a click on a select option does not cause a change - * in the select tag's attribute or trigger a change event so this method - * emulates that behavior. + * In the testing framework, a click on a select option does not cause a + * change in the select tag's attribute or trigger a change event so this + * method emulates that behavior. * - * @param {!HTMLSelectElement} Dropdown menu to endow with emulated behavior. + * @param {!HTMLSelectElement} Dropdown menu to endow with emulated + * behavior. */ let emulateDropdownBehavior = function(dropdown) { for (let i = 0; i < dropdown.length; i++) { @@ -21,100 +22,87 @@ /** * @fileoverview Suite of tests for page-specific behaviors of StartSetupPage. */ -cr.define('multidevice_setup', () => { - function registerStartSetupPageTests() { - suite('MultiDeviceSetup', () => { - /** - * StartSetupPage created before each test. Defined in setUp. - * @type {StartSetupPage|undefined} - */ - let startSetupPageElement; +suite('MultiDeviceSetup', () => { + /** + * StartSetupPage created before each test. Defined in setUp. + * @type {StartSetupPage|undefined} + */ + let startSetupPageElement; - const START = 'start-setup-page'; + const START = 'start-setup-page'; - // TODO(https://crbug.com/1019206): When v1 DeviceSync is turned off, all - // devices should have an Instance ID. - const DEVICES = [ - { - remoteDevice: {deviceName: 'Pixel XL', deviceId: 'legacy-id-1'}, - connectivityStatus: - chromeos.deviceSync.mojom.ConnectivityStatus.kOnline - }, - { - remoteDevice: {deviceName: 'Nexus 6P', instanceId: 'iid-2'}, - connectivityStatus: - chromeos.deviceSync.mojom.ConnectivityStatus.kOffline - }, - { - remoteDevice: { - deviceName: 'Nexus 5', - deviceId: 'legacy-id-3', - instanceId: 'iid-3' - }, - connectivityStatus: - chromeos.deviceSync.mojom.ConnectivityStatus.kUnknownConnectivity - }, - { - remoteDevice: - {deviceName: 'Pixel 4', deviceId: 'legacy-id-4', instanceId: ''}, - connectivityStatus: - chromeos.deviceSync.mojom.ConnectivityStatus.kOnline - }, - ]; + // TODO(https://crbug.com/1019206): When v1 DeviceSync is turned off, all + // devices should have an Instance ID. + const DEVICES = [ + { + remoteDevice: {deviceName: 'Pixel XL', deviceId: 'legacy-id-1'}, + connectivityStatus: chromeos.deviceSync.mojom.ConnectivityStatus.kOnline + }, + { + remoteDevice: {deviceName: 'Nexus 6P', instanceId: 'iid-2'}, + connectivityStatus: chromeos.deviceSync.mojom.ConnectivityStatus.kOffline + }, + { + remoteDevice: + {deviceName: 'Nexus 5', deviceId: 'legacy-id-3', instanceId: 'iid-3'}, + connectivityStatus: + chromeos.deviceSync.mojom.ConnectivityStatus.kUnknownConnectivity + }, + { + remoteDevice: + {deviceName: 'Pixel 4', deviceId: 'legacy-id-4', instanceId: ''}, + connectivityStatus: chromeos.deviceSync.mojom.ConnectivityStatus.kOnline + }, + ]; - setup(() => { - startSetupPageElement = document.createElement('start-setup-page'); - document.body.appendChild(startSetupPageElement); - startSetupPageElement.devices = DEVICES; - Polymer.dom.flush(); - emulateDropdownBehavior(startSetupPageElement.$.deviceDropdown); - }); + setup(() => { + startSetupPageElement = document.createElement('start-setup-page'); + document.body.appendChild(startSetupPageElement); + startSetupPageElement.devices = DEVICES; + Polymer.dom.flush(); + emulateDropdownBehavior(startSetupPageElement.$.deviceDropdown); + }); - let selectOptionByTextContent = function(optionText) { - const optionNodeList = - startSetupPageElement.$.deviceDropdown.querySelectorAll('option'); - for (option of optionNodeList.values()) { - if (option.textContent.trim() === optionText) { - option.click(); - return; - } - } - }; + let selectOptionByTextContent = function(optionText) { + const optionNodeList = + startSetupPageElement.$.deviceDropdown.querySelectorAll('option'); + for (option of optionNodeList.values()) { + if (option.textContent.trim() === optionText) { + option.click(); + return; + } + } + }; - // TODO(https://crbug.com/1019206): When v1 DeviceSync is turned off, all - // selected IDs will be Instance IDs. - test( - 'Finding devices populates dropdown and defines selected device', - () => { - assertEquals( - startSetupPageElement.$.deviceDropdown - .querySelectorAll('option') - .length, - DEVICES.length); - assertEquals( - startSetupPageElement.selectedInstanceIdOrLegacyDeviceId, - 'legacy-id-1'); - }); - - // TODO(https://crbug.com/1019206): When v1 DeviceSync is turned off, all - // selected IDs will be Instance IDs. - test('Selected ID changes when dropdown options are selected', () => { - selectOptionByTextContent('Nexus 6P (offline)'); + // TODO(https://crbug.com/1019206): When v1 DeviceSync is turned off, all + // selected IDs will be Instance IDs. + test( + 'Finding devices populates dropdown and defines selected device', () => { assertEquals( - startSetupPageElement.selectedInstanceIdOrLegacyDeviceId, 'iid-2'); - selectOptionByTextContent('Nexus 5'); - assertEquals( - startSetupPageElement.selectedInstanceIdOrLegacyDeviceId, 'iid-3'); - selectOptionByTextContent('Pixel 4'); - assertEquals( - startSetupPageElement.selectedInstanceIdOrLegacyDeviceId, - 'legacy-id-4'); - selectOptionByTextContent('Pixel XL'); + startSetupPageElement.$.deviceDropdown.querySelectorAll('option') + .length, + DEVICES.length); assertEquals( startSetupPageElement.selectedInstanceIdOrLegacyDeviceId, 'legacy-id-1'); }); - }); - } - return {registerStartSetupPageTests: registerStartSetupPageTests}; + + // TODO(https://crbug.com/1019206): When v1 DeviceSync is turned off, all + // selected IDs will be Instance IDs. + test('Selected ID changes when dropdown options are selected', () => { + selectOptionByTextContent('Nexus 6P (offline)'); + assertEquals( + startSetupPageElement.selectedInstanceIdOrLegacyDeviceId, 'iid-2'); + selectOptionByTextContent('Nexus 5'); + assertEquals( + startSetupPageElement.selectedInstanceIdOrLegacyDeviceId, 'iid-3'); + selectOptionByTextContent('Pixel 4'); + assertEquals( + startSetupPageElement.selectedInstanceIdOrLegacyDeviceId, + 'legacy-id-4'); + selectOptionByTextContent('Pixel XL'); + assertEquals( + startSetupPageElement.selectedInstanceIdOrLegacyDeviceId, + 'legacy-id-1'); + }); });
diff --git a/chrome/test/data/webui/net_internals/net_internals_browsertest.js b/chrome/test/data/webui/net_internals/net_internals_browsertest.js index bad2a92..efc9408 100644 --- a/chrome/test/data/webui/net_internals/net_internals_browsertest.js +++ b/chrome/test/data/webui/net_internals/net_internals_browsertest.js
@@ -57,7 +57,8 @@ NetInternalsDnsViewTest.prototype = { __proto__: NetInternalsBrowserTest.prototype, - browsePreload: 'chrome://net-internals/index.html?test=dns_view_test.js', + browsePreload: + 'chrome://net-internals/index.html?module=net_internals/dns_view_test.js', }; TEST_F('NetInternalsDnsViewTest', 'ClearCache', function() { @@ -73,7 +74,8 @@ NetInternalsMainTest.prototype = { __proto__: NetInternalsBrowserTest.prototype, - browsePreload: 'chrome://net-internals/index.html?test=main_test.js', + browsePreload: + 'chrome://net-internals/index.html?module=net_internals/main_test.js', }; TEST_F('NetInternalsMainTest', 'TabVisibility', function() { @@ -85,7 +87,7 @@ __proto__: NetInternalsBrowserTest.prototype, browsePreload: - 'chrome://net-internals/index.html?test=domain_security_policy_view_test.js', + 'chrome://net-internals/index.html?module=net_internals/domain_security_policy_view_test.js', get suiteName() { return domain_security_policy_view_test.suiteName;
diff --git a/chrome/test/data/webui/tab_search/tab_search_app_focus_test.js b/chrome/test/data/webui/tab_search/tab_search_app_focus_test.js index 08bf4e5..71814df2 100644 --- a/chrome/test/data/webui/tab_search/tab_search_app_focus_test.js +++ b/chrome/test/data/webui/tab_search/tab_search_app_focus_test.js
@@ -4,7 +4,7 @@ import {getDeepActiveElement} from 'chrome://resources/js/util.m.js'; import {keyDownOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js'; -import {ProfileTabs, TabSearchApiProxyImpl, TabSearchAppElement, TabSearchItem, TabSearchSearchField} from 'chrome://tab-search.top-chrome/tab_search.js'; +import {ProfileData, TabSearchApiProxyImpl, TabSearchAppElement, TabSearchItem, TabSearchSearchField} from 'chrome://tab-search.top-chrome/tab_search.js'; import {assertEquals, assertGT} from '../../chai_assert.js'; import {flushTasks} from '../../test_util.m.js'; @@ -22,12 +22,12 @@ disableScrollIntoViewAnimations(TabSearchItem); /** - * @param {ProfileTabs} sampleData + * @param {ProfileData} sampleData * @param {Object=} loadTimeOverriddenData */ async function setupTest(sampleData, loadTimeOverriddenData) { testProxy = new TestTabSearchApiProxy(); - testProxy.setProfileTabs(sampleData); + testProxy.setProfileData(sampleData); TabSearchApiProxyImpl.instance_ = testProxy; initLoadTimeDataWithDefaults(loadTimeOverriddenData);
diff --git a/chrome/test/data/webui/tab_search/tab_search_app_test.js b/chrome/test/data/webui/tab_search/tab_search_app_test.js index 467602b..df7e4fa4 100644 --- a/chrome/test/data/webui/tab_search/tab_search_app_test.js +++ b/chrome/test/data/webui/tab_search/tab_search_app_test.js
@@ -3,7 +3,7 @@ // found in the LICENSE file. import {keyDownOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js'; -import {ProfileTabs, Tab, TabSearchApiProxyImpl, TabSearchAppElement, TabSearchSearchField} from 'chrome://tab-search.top-chrome/tab_search.js'; +import {ProfileData, Tab, TabSearchApiProxyImpl, TabSearchAppElement, TabSearchSearchField} from 'chrome://tab-search.top-chrome/tab_search.js'; import {assertEquals, assertFalse, assertNotEquals, assertTrue} from '../../chai_assert.js'; import {flushTasks, waitAfterNextRender} from '../../test_util.m.js'; @@ -38,12 +38,12 @@ } /** - * @param {ProfileTabs} sampleData + * @param {ProfileData} sampleData * @param {Object=} loadTimeOverriddenData */ async function setupTest(sampleData, loadTimeOverriddenData) { testProxy = new TestTabSearchApiProxy(); - testProxy.setProfileTabs(sampleData); + testProxy.setProfileData(sampleData); TabSearchApiProxyImpl.instance_ = testProxy; initLoadTimeDataWithDefaults(loadTimeOverriddenData);
diff --git a/chrome/test/data/webui/tab_search/test_tab_search_api_proxy.js b/chrome/test/data/webui/tab_search/test_tab_search_api_proxy.js index 081d167..08c0745 100644 --- a/chrome/test/data/webui/tab_search/test_tab_search_api_proxy.js +++ b/chrome/test/data/webui/tab_search/test_tab_search_api_proxy.js
@@ -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 {PageCallbackRouter, PageRemote, ProfileTabs, TabSearchApiProxy} from 'chrome://tab-search.top-chrome/tab_search.js'; +import {PageCallbackRouter, PageRemote, ProfileData, TabSearchApiProxy} from 'chrome://tab-search.top-chrome/tab_search.js'; import {TestBrowserProxy} from '../test_browser_proxy.m.js'; @@ -11,7 +11,7 @@ constructor() { super([ 'closeTab', - 'getProfileTabs', + 'getProfileData', 'showFeedbackPage', 'switchToTab', 'showUI', @@ -25,8 +25,8 @@ this.callbackRouterRemote = this.callbackRouter.$.bindNewPipeAndPassRemote(); - /** @private {ProfileTabs} */ - this.profileTabs_; + /** @private {ProfileData} */ + this.profileData_; } /** @override */ @@ -35,9 +35,9 @@ } /** @override */ - getProfileTabs() { - this.methodCalled('getProfileTabs'); - return Promise.resolve({profileTabs: this.profileTabs_}); + getProfileData() { + this.methodCalled('getProfileData'); + return Promise.resolve({profileData: this.profileData_}); } /** @override */ @@ -70,8 +70,8 @@ return this.callbackRouterRemote; } - /** @param {ProfileTabs} profileTabs */ - setProfileTabs(profileTabs) { - this.profileTabs_ = profileTabs; + /** @param {ProfileData} profileData */ + setProfileData(profileData) { + this.profileData_ = profileData; } }
diff --git a/chromecast/browser/accessibility/flutter/BUILD.gn b/chromecast/browser/accessibility/flutter/BUILD.gn index ab13cfd..d5fcc3b 100644 --- a/chromecast/browser/accessibility/flutter/BUILD.gn +++ b/chromecast/browser/accessibility/flutter/BUILD.gn
@@ -24,7 +24,7 @@ "//chromecast/common", "//components/exo", "//content/public/browser", - "//extensions/browser/api", + "//extensions/browser/api/automation_internal", "//skia", "//third_party/grpc:grpc++", "//ui/views", @@ -41,7 +41,7 @@ "//chromecast:cast_shell_lib", "//chromecast/browser", "//content/test:test_support", - "//extensions/browser/api", + "//extensions/browser/api/automation_internal", "//skia", "//testing/gmock", "//testing/gtest",
diff --git a/chromecast/browser/accessibility/flutter/flutter_accessibility_helper_bridge.cc b/chromecast/browser/accessibility/flutter/flutter_accessibility_helper_bridge.cc index d1c79ef..0d942c2f 100644 --- a/chromecast/browser/accessibility/flutter/flutter_accessibility_helper_bridge.cc +++ b/chromecast/browser/accessibility/flutter/flutter_accessibility_helper_bridge.cc
@@ -74,7 +74,7 @@ bool found = false; if (window) { for (aura::Window* child : window->children()) { - exo::Surface* surface = exo::GetShellMainSurface(child); + exo::Surface* surface = exo::GetShellRootSurface(child); if (surface) { views::Widget* widget = views::Widget::GetWidgetForNativeWindow(child);
diff --git a/chromecast/browser/cast_browser_context.cc b/chromecast/browser/cast_browser_context.cc index 7890cec..f9018f6b 100644 --- a/chromecast/browser/cast_browser_context.cc +++ b/chromecast/browser/cast_browser_context.cc
@@ -157,6 +157,7 @@ } void CastBrowserContext::SetCorsOriginAccessListForOrigin( + TargetBrowserContexts target_mode, const url::Origin& source_origin, std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, @@ -164,12 +165,10 @@ auto barrier_closure = BarrierClosure(2, std::move(closure)); // Keep profile storage partitions' NetworkContexts synchronized. - auto profile_setter = base::MakeRefCounted<CorsOriginPatternSetter>( + base::MakeRefCounted<CorsOriginPatternSetter>( source_origin, CorsOriginPatternSetter::ClonePatterns(allow_patterns), - CorsOriginPatternSetter::ClonePatterns(block_patterns), barrier_closure); - ForEachStoragePartition( - this, base::BindRepeating(&CorsOriginPatternSetter::SetLists, - base::RetainedRef(profile_setter.get()))); + CorsOriginPatternSetter::ClonePatterns(block_patterns), barrier_closure) + ->ApplyToEachStoragePartition(this); // Keep the per-profile access list up to date so that we can use this to // restore NetworkContext settings at anytime, e.g. on restarting the
diff --git a/chromecast/browser/cast_browser_context.h b/chromecast/browser/cast_browser_context.h index 7b0b36c..add7423 100644 --- a/chromecast/browser/cast_browser_context.h +++ b/chromecast/browser/cast_browser_context.h
@@ -47,6 +47,7 @@ content::BrowsingDataRemoverDelegate* GetBrowsingDataRemoverDelegate() override; void SetCorsOriginAccessListForOrigin( + TargetBrowserContexts target_mode, const url::Origin& source_origin, std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
diff --git a/chromecast/media/audio/BUILD.gn b/chromecast/media/audio/BUILD.gn index eb0dcda..a6852aa9 100644 --- a/chromecast/media/audio/BUILD.gn +++ b/chromecast/media/audio/BUILD.gn
@@ -196,6 +196,18 @@ } } +cast_source_set("rate_adjuster") { + sources = [ + "rate_adjuster.cc", + "rate_adjuster.h", + ] + + deps = [ + "//base", + "//chromecast/base", + ] +} + cast_source_set("test_support") { testonly = true @@ -212,11 +224,13 @@ "audio_clock_simulator_unittest.cc", "audio_fader_unittest.cc", "interleaved_channel_mixer_unittest.cc", + "rate_adjuster_unittest.cc", ] deps = [ ":interleaved_channel_mixer", ":processing", + ":rate_adjuster", "//base", "//media", "//testing/gmock",
diff --git a/chromecast/media/audio/rate_adjuster.cc b/chromecast/media/audio/rate_adjuster.cc new file mode 100644 index 0000000..9156c1e --- /dev/null +++ b/chromecast/media/audio/rate_adjuster.cc
@@ -0,0 +1,110 @@ +// Copyright 2021 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 "chromecast/media/audio/rate_adjuster.h" + +#include <cmath> + +#include "base/check.h" +#include "base/numerics/ranges.h" +#include "chromecast/base/statistics/weighted_moving_linear_regression.h" + +namespace chromecast { +namespace media { + +namespace { +constexpr auto kMaxRateChangeInterval = base::TimeDelta::FromMinutes(5); +} // namespace + +RateAdjuster::RateAdjuster(const Config& config, + RateChangeCallback change_clock_rate, + double current_clock_rate) + : config_(config), + change_clock_rate_(std::move(change_clock_rate)), + current_clock_rate_(current_clock_rate) { + DCHECK(change_clock_rate_); +} + +RateAdjuster::~RateAdjuster() = default; + +void RateAdjuster::AddError(int64_t error, int64_t timestamp) { + if (!linear_error_) { + linear_error_ = std::make_unique<WeightedMovingLinearRegression>( + config_.linear_regression_window.InMicroseconds()); + clock_rate_start_timestamp_ = timestamp; + clock_rate_error_base_ = 0.0; + initial_timestamp_ = timestamp; + } + + int64_t x = timestamp - initial_timestamp_; + + // Error is positive if actions are happening too late. + // We perform |current_clock_rate_| seconds of actions per second of actual + // time. We want to run a linear regression on how the error is changing over + // time, if we ignore the effects of any previous clock rate changes. To do + // this, we correct the error value to what it would have been if we had never + // adjusted the clock rate. + // In the last N seconds, if the clock rate was 1.0 we would have performed + // (1.0 - clock_rate) * N more seconds of actions, so the current action would + // have occurred that much sooner (reducing its error by that amount). We + // also need to take into account the previous "expected error" (due to clock + // rate changes) at the point when we last changed the clock rate. The + // expected error now is the previous expected error, plus the change due to + // the clock rate of (1.0 - clock_rate) * N seconds. + int64_t time_at_current_clock_rate = timestamp - clock_rate_start_timestamp_; + double correction = clock_rate_error_base_ + + (1.0 - current_clock_rate_) * time_at_current_clock_rate; + int64_t corrected_error = error - correction; + linear_error_->AddSample(x, corrected_error, 1.0); + + if (time_at_current_clock_rate < + config_.rate_change_interval.InMicroseconds()) { + // Don't change clock rate too frequently. + return; + } + + int64_t offset; + double slope; + double e; + if (!linear_error_->EstimateY(x, &offset, &e) || + !linear_error_->EstimateSlope(&slope, &e)) { + return; + } + + // Get the smoothed error (linear regression estimate) at the current time, + // translated back into actual error. + int64_t smoothed_error = offset + correction; + + // If slope is positive, a clock rate of 1.0 is too slow (actions are + // occurring progressively later than desired). We wanted to do slope*N + // seconds actions during N seconds than would have been done at rate 1.0. + // Therefore the actual clock rate should be (1.0 + slope). + // However, we also want to correct for any existing offset. We correct so + // that the error should reduce to 0 by the next rate change interval; + // however the rate change is capped to prevent very fast slewing. + double offset_correction = static_cast<double>(smoothed_error) / + config_.rate_change_interval.InMicroseconds(); + if (std::abs(smoothed_error) < config_.max_ignored_current_error) { + // Offset is small enough that we can ignore it, but still correct a little + // bit to avoid bouncing in and out of the ignored region. + offset_correction = offset_correction / 4; + } + offset_correction = base::ClampToRange(offset_correction, + -config_.max_current_error_correction, + config_.max_current_error_correction); + double new_rate = (1.0 + slope) + offset_correction; + + // Only change the clock rate if the difference between the desired rate and + // the current rate is larger than the minimum change. + if (std::fabs(new_rate - current_clock_rate_) > config_.min_rate_change || + time_at_current_clock_rate > kMaxRateChangeInterval.InMicroseconds()) { + current_clock_rate_ = + change_clock_rate_.Run(new_rate, slope, smoothed_error); + clock_rate_start_timestamp_ = timestamp; + clock_rate_error_base_ = correction; + } +} + +} // namespace media +} // namespace chromecast
diff --git a/chromecast/media/audio/rate_adjuster.h b/chromecast/media/audio/rate_adjuster.h new file mode 100644 index 0000000..ba0a61d46 --- /dev/null +++ b/chromecast/media/audio/rate_adjuster.h
@@ -0,0 +1,80 @@ +// Copyright 2021 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 CHROMECAST_MEDIA_AUDIO_RATE_ADJUSTER_H_ +#define CHROMECAST_MEDIA_AUDIO_RATE_ADJUSTER_H_ + +#include <cstdint> +#include <memory> + +#include "base/callback.h" +#include "base/time/time.h" + +namespace chromecast { +class WeightedMovingLinearRegression; + +namespace media { + +// RateAdjuster handles adjusting a clock rate to minimize errors over time. +// This can be used for A/V sync, for example. The RateAdjuster smooths the +// error samples over time using a moving linear regression. It attempts to +// adjust the clock rate to correct the current absolute error, and the slope +// of the change in error, with the goal of maintaining as close as possible to +// 0 errors over time. +class RateAdjuster { + public: + struct Config { + // The minimum interval between clock rate changes. + base::TimeDelta rate_change_interval = base::TimeDelta::FromSeconds(1); + + // How long to make the linear regression window for smoothing errors. + base::TimeDelta linear_regression_window = base::TimeDelta::FromSeconds(10); + + // The maximum current error to ignore, in microseconds. + int64_t max_ignored_current_error = 0; + + // The maximum current absolute error that should be adjusted for in a + // single clock rate adjustment. + double max_current_error_correction = 2.5e-4; + + // The minimum difference between the optimal clock rate and the current + // clock rate required to actually change the rate. + double min_rate_change = 0; + }; + + // Called to change the clock rate. Returns the actual new clock rate. The + // |error_slope| and |current_error| are provided for debugging/logging + // purposes. + using RateChangeCallback = + base::RepeatingCallback<double(double desired_clock_rate, + double error_slope, + double current_error)>; + + RateAdjuster(const Config& config, + RateChangeCallback change_clock_rate, + double current_clock_rate); + ~RateAdjuster(); + + // Adds an error sample at the given |timestamp|. Both the |error| and the + // |timestamp| are in microseconds. The error of some event should be + // calculated as <actual time of event> - <desired time of event>. Timestamps + // should increase monotonically. The clock rate will be adjusted + // synchronously within this method via the callback, if necessary. + void AddError(int64_t error, int64_t timestamp); + + private: + const Config config_; + RateChangeCallback change_clock_rate_; + + std::unique_ptr<WeightedMovingLinearRegression> linear_error_; + int64_t clock_rate_start_timestamp_ = 0; + int64_t initial_timestamp_ = 0; + double clock_rate_error_base_ = 0.0; + double current_clock_rate_; +}; + +} // namespace media +} // namespace chromecast + +#endif // CHROMECAST_MEDIA_AUDIO_AUDIO_FADER_H_
diff --git a/chromecast/media/audio/rate_adjuster_unittest.cc b/chromecast/media/audio/rate_adjuster_unittest.cc new file mode 100644 index 0000000..0973e34 --- /dev/null +++ b/chromecast/media/audio/rate_adjuster_unittest.cc
@@ -0,0 +1,131 @@ +// Copyright 2021 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 "chromecast/media/audio/rate_adjuster.h" +#include "base/rand_util.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromecast { +namespace media { + +class RateAdjusterTest : public testing::Test { + public: + RateAdjusterTest() = default; + ~RateAdjusterTest() override = default; + + double clock_rate() const { return clock_rate_; } + int64_t rate_change_count() const { return rate_change_count_; } + + void set_underlying_rate(double rate) { underlying_rate_ = rate; } + + void Configure(const RateAdjuster::Config& config) { + rate_adjuster_ = std::make_unique<RateAdjuster>( + config, + base::BindRepeating(&RateAdjusterTest::ChangeRate, + base::Unretained(this)), + clock_rate_); + } + + void AddSample(int64_t timestamp, int max_jitter) { + int64_t delta = timestamp - base_timestamp_; + // Clock rate < 1 causes the events to happen later than they should. + int64_t value = base_value_ + delta / (clock_rate_ * underlying_rate_); + last_timestamp_ = timestamp; + last_value_ = value; + + int64_t jittered_value = value + base::RandInt(-max_jitter, max_jitter); + + rate_adjuster_->AddError(jittered_value - timestamp, timestamp); + } + + private: + double ChangeRate(double desired_clock_rate, + double error_slope, + double current_error) { + ++rate_change_count_; + clock_rate_ = desired_clock_rate; + base_timestamp_ = last_timestamp_; + base_value_ = last_value_; + return clock_rate_; + } + + int64_t base_timestamp_ = 0; + int64_t last_timestamp_ = 0; + + int64_t base_value_ = 0; + int64_t last_value_ = 0; + + double clock_rate_ = 1.0; + double underlying_rate_ = 1.0; + + int64_t rate_change_count_ = 0; + + std::unique_ptr<RateAdjuster> rate_adjuster_; +}; + +TEST_F(RateAdjusterTest, NoError) { + RateAdjuster::Config config; + config.max_ignored_current_error = 0; + config.min_rate_change = 0; + Configure(config); + + for (int i = 0; i < 600; ++i) { + AddSample(i * 100000, 0); + } + + EXPECT_EQ(clock_rate(), 1.0); + EXPECT_EQ(rate_change_count(), 0); +} + +TEST_F(RateAdjusterTest, MaxInterval) { + RateAdjuster::Config config; + config.max_ignored_current_error = 0; + config.min_rate_change = 0; + Configure(config); + + for (int i = 0; i < 302; ++i) { + AddSample(i * 1000000, 0); + } + + EXPECT_EQ(clock_rate(), 1.0); + EXPECT_EQ(rate_change_count(), 1); +} + +TEST_F(RateAdjusterTest, SlowUnderlying) { + constexpr double kUnderlyingRate = 0.9995; + set_underlying_rate(kUnderlyingRate); + + RateAdjuster::Config config; + config.max_ignored_current_error = 0; + config.min_rate_change = 0; + Configure(config); + + for (int i = 0; i < 600; ++i) { + AddSample(i * 20000, 0); + } + + EXPECT_NEAR(clock_rate() * kUnderlyingRate, 1.0, 1e-5); + EXPECT_GT(rate_change_count(), 1); +} + +TEST_F(RateAdjusterTest, FastUnderlyingWithJitter) { + constexpr double kUnderlyingRate = 1.0005; + set_underlying_rate(kUnderlyingRate); + + RateAdjuster::Config config; + config.max_ignored_current_error = 0; + config.min_rate_change = 0; + Configure(config); + + // Need more samples to converge. + for (int i = 0; i < 3000; ++i) { + AddSample(i * 20000, 300); + } + + EXPECT_NEAR(clock_rate() * kUnderlyingRate, 1.0, 1e-5); + EXPECT_GT(rate_change_count(), 1); +} + +} // namespace media +} // namespace chromecast
diff --git a/chromecast/media/cma/backend/alsa/alsa_volume_control.cc b/chromecast/media/cma/backend/alsa/alsa_volume_control.cc index 051184a..bfc32829 100644 --- a/chromecast/media/cma/backend/alsa/alsa_volume_control.cc +++ b/chromecast/media/cma/backend/alsa/alsa_volume_control.cc
@@ -180,8 +180,8 @@ std::vector<std::string> AlsaVolumeControl::GetAmpElementNames() { std::vector<std::string> mixer_element_names = base::SplitString( base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - switches::kAlsaAmpElementName), ",", base::KEEP_WHITESPACE, - base::SPLIT_WANT_NONEMPTY); + switches::kAlsaAmpElementName), + ",", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY); return mixer_element_names; } @@ -333,8 +333,12 @@ void AlsaVolumeControl::SetPowerSave(bool power_save_on) { for (const auto& amp_mixer : amp_mixers_) { + if (IsElementAllMuted(amp_mixer.get()).value_or(false) == power_save_on) { + DVLOG(2) << "Power Save already set to: " << power_save_on; + continue; + } if (!SetElementMuted(amp_mixer.get(), power_save_on)) { - LOG(INFO) << "Amp toggle failed: no amp switch on mixer element."; + LOG(ERROR) << "Amp toggle failed: no amp switch on mixer element."; } else { LOG(INFO) << "Set Power Save to: " << power_save_on; } @@ -348,10 +352,37 @@ !alsa_->MixerSelemHasPlaybackSwitch(mixer->element)) { return false; } + bool success = true; for (int32_t channel = 0; channel <= SND_MIXER_SCHN_LAST; ++channel) { - alsa_->MixerSelemSetPlaybackSwitch( + int err = alsa_->MixerSelemSetPlaybackSwitch( mixer->element, static_cast<snd_mixer_selem_channel_id_t>(channel), !muted); + if (err != 0) { + success = false; + LOG(ERROR) << "MixerSelemSetPlaybackSwitch: " << alsa_->StrError(err); + } + } + return success; +} + +base::Optional<bool> AlsaVolumeControl::IsElementAllMuted( + ScopedAlsaMixer* mixer) { + if (!mixer || !mixer->element || + !alsa_->MixerSelemHasPlaybackSwitch(mixer->element)) { + return base::nullopt; + } + for (int32_t channel = 0; channel <= SND_MIXER_SCHN_LAST; ++channel) { + int channel_unmuted; + int err = alsa_->MixerSelemGetPlaybackSwitch( + mixer->element, static_cast<snd_mixer_selem_channel_id_t>(channel), + &channel_unmuted); + if (err != 0) { + LOG(ERROR) << "MixerSelemGetPlaybackSwitch: " << alsa_->StrError(err); + return base::nullopt; + } + if (channel_unmuted) { + return false; + } } return true; }
diff --git a/chromecast/media/cma/backend/alsa/alsa_volume_control.h b/chromecast/media/cma/backend/alsa/alsa_volume_control.h index cf259a1..f0aafe5 100644 --- a/chromecast/media/cma/backend/alsa/alsa_volume_control.h +++ b/chromecast/media/cma/backend/alsa/alsa_volume_control.h
@@ -11,6 +11,7 @@ #include "base/macros.h" #include "base/message_loop/message_pump_for_io.h" +#include "base/optional.h" #include "chromecast/media/cma/backend/system_volume_control.h" #include "media/audio/alsa/alsa_wrapper.h" @@ -50,6 +51,9 @@ unsigned int mask); bool SetElementMuted(ScopedAlsaMixer* mixer, bool muted); + // Returns true if all channels are muted, returns base::nullopt if element + // state is not accessible. + base::Optional<bool> IsElementAllMuted(ScopedAlsaMixer* mixer); void RefreshMixerFds(ScopedAlsaMixer* mixer);
diff --git a/chromecast/media/cma/backend/video/BUILD.gn b/chromecast/media/cma/backend/video/BUILD.gn index 9c52c15..2e52bdd2 100644 --- a/chromecast/media/cma/backend/video/BUILD.gn +++ b/chromecast/media/cma/backend/video/BUILD.gn
@@ -18,6 +18,7 @@ deps = [ "//base", "//chromecast/base", + "//chromecast/media/audio:rate_adjuster", "//chromecast/media/cma/backend:for_mixer_audio", "//chromecast/public", "//chromecast/public/media",
diff --git a/chromecast/media/cma/backend/video/av_sync_video.cc b/chromecast/media/cma/backend/video/av_sync_video.cc index ba40299f..0f8959d 100644 --- a/chromecast/media/cma/backend/video/av_sync_video.cc +++ b/chromecast/media/cma/backend/video/av_sync_video.cc
@@ -6,10 +6,12 @@ #include <cmath> +#include "base/bind.h" #include "base/logging.h" #include "base/numerics/ranges.h" #include "base/time/time.h" #include "chromecast/base/statistics/weighted_moving_linear_regression.h" +#include "chromecast/media/audio/rate_adjuster.h" #include "chromecast/media/cma/backend/audio_decoder_for_mixer.h" #include "chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h" #include "chromecast/media/cma/backend/video_decoder_for_mixer.h" @@ -44,9 +46,6 @@ // stream. const int kAvSyncFpsThreshold = 10; -// How often we change the audio clock rate for AV sync. -constexpr base::TimeDelta kRateChangeInterval = base::TimeDelta::FromSeconds(1); - // Maximum correction rate for absolute sync offset. const double kMaxOffsetCorrection = 2.5e-4; @@ -121,6 +120,7 @@ void AvSyncVideo::StopAvSync() { upkeep_av_sync_timer_.Stop(); + audio_rate_adjuster_.reset(); } void AvSyncVideo::UpkeepAvSync() { @@ -189,7 +189,8 @@ } if (video_pts_) { // Only do audio rate upkeep if the VPTS data was OK (ie, no bad slope). - AudioRateUpkeep(apts_timestamp_error, new_apts_timestamp); + DCHECK(audio_rate_adjuster_); + audio_rate_adjuster_->AddError(apts_timestamp_error, new_apts_timestamp); } } @@ -230,100 +231,44 @@ FlushAudioPts(); } -void AvSyncVideo::AudioRateUpkeep(int64_t error, int64_t timestamp) { - if (!apts_error_) { - apts_error_ = std::make_unique<WeightedMovingLinearRegression>( - kLinearRegressionWindow.InMicroseconds()); - clock_rate_start_timestamp_ = timestamp; - clock_rate_error_base_ = 0.0; - apts_error_start_timestamp_ = timestamp; - } +double AvSyncVideo::ChangeAudioRate(double desired_clock_rate, + double error_slope, + double current_error) { + double effective_new_rate = + backend_->audio_decoder()->SetAvSyncPlaybackRate(desired_clock_rate); + current_audio_clock_rate_ = effective_new_rate; + LOG(INFO) << "Update audio clock rate to " << effective_new_rate + << "; wanted " << desired_clock_rate + << ", error slope = " << error_slope + << ", smoothed error = " << current_error; - int64_t x = timestamp - apts_error_start_timestamp_; - - // Error is positive if audio is playing out too late. - // We play out |current_clock_rate_| seconds of audio per second of actual - // time. We want to run a linear regression on how the error is changing over - // time, if we ignore the effects of any previous clock rate changes. To do - // this, we correct the error value to what it would have been if we had never - // adjusted the clock rate. - // In the last N seconds, if the clock rate was 1.0 we would have played - // (1.0 - clock_rate) * N more seconds of audio, so the current buffer would - // have played out that much sooner (reducing its error by that amount). We - // also need to take into account the previous "expected error" (due to clock - // rate changes) at the point when we last changed the clock rate. The - // expected error now is the previous expected error, plus the change due to - // the clock rate of (1.0 - clock_rate) * N seconds. - int64_t time_at_current_clock_rate = timestamp - clock_rate_start_timestamp_; - double correction = - clock_rate_error_base_ + - (1.0 - current_audio_clock_rate_) * time_at_current_clock_rate; - int64_t corrected_error = error - correction; - apts_error_->AddSample(x, corrected_error, 1.0); - - if (time_at_current_clock_rate < kRateChangeInterval.InMicroseconds()) { - // Don't change clock rate too frequently. - return; - } - - int64_t offset; - double slope; + double vpts_slope; double e; - if (!apts_error_->EstimateY(x, &offset, &e) || - !apts_error_->EstimateSlope(&slope, &e)) { - return; + if (video_pts_->EstimateSlope(&vpts_slope, &e)) { + LOG(INFO) << "VPTS slope = " << vpts_slope << "; playback rate =~ " + << (1.0 / vpts_slope); } - - // Get the smoothed error (linear regression estimate) at the current frame, - // translated back into actual error. - int64_t smoothed_error = offset + correction; - - // If slope is positive, a clock rate of 1.0 is too slow (audio is playing - // progressively later than desired). We wanted to play slope*N seconds more - // audio during N seconds that would have been played at clock rate 1.0. - // Therefore the actual clock rate should be (1.0 + slope). - // However, we also want to correct for any existing offset. We correct so - // that the error should reduce to 0 by the next rate change interval; - // however the rate change is capped to prevent very fast slewing. - double offset_correction = static_cast<double>(smoothed_error) / - kRateChangeInterval.InMicroseconds(); - if (std::abs(smoothed_error) < kMaxIgnoredOffset) { - // Offset is small enough that we can ignore it, but still correct a little - // bit to avoid bouncing in and out of the ignored region. - offset_correction = offset_correction / 4; - } - offset_correction = base::ClampToRange( - offset_correction, -kMaxOffsetCorrection, kMaxOffsetCorrection); - double new_rate = (1.0 + slope) + offset_correction; - - // Only change the clock rate if the desired rate is > 30 ppm different. - // Reasoning: 30 ppm means that leaving the clock rate unchanged will add at - // most 30 microseconds of additional error before the next clock rate check. - if (fabs(new_rate - current_audio_clock_rate_) > 3e-5) { - double effective_new_rate = - backend_->audio_decoder()->SetAvSyncPlaybackRate(new_rate); - current_audio_clock_rate_ = effective_new_rate; - LOG(INFO) << "Update audio clock rate to " << effective_new_rate - << "; wanted " << new_rate << ", error slope = " << slope - << ", smoothed error = " << smoothed_error - << ", correction = " << correction; - - double vpts_slope; - if (video_pts_->EstimateSlope(&vpts_slope, &e)) { - LOG(INFO) << "VPTS slope = " << vpts_slope << "; playback rate =~ " - << (1.0 / vpts_slope); - } - } - - clock_rate_start_timestamp_ = timestamp; - clock_rate_error_base_ = correction; + return effective_new_rate; } void AvSyncVideo::FlushAudioPts() { - apts_error_.reset(); last_apts_timestamp_ = INT64_MIN; // Don't reset last_apts_value_, since we still want to ignore that value for // the new linear regression since it may be invalid. + + RateAdjuster::Config config; + config.linear_regression_window = kLinearRegressionWindow; + config.max_ignored_current_error = kMaxIgnoredOffset; + config.max_current_error_correction = kMaxOffsetCorrection; + // Only change the clock rate if the desired rate is > 30 ppm different. + // Reasoning: 30 ppm means that leaving the clock rate unchanged will add at + // most 30 microseconds of additional error before the next clock rate check. + config.min_rate_change = 3.0e-5; + audio_rate_adjuster_ = std::make_unique<RateAdjuster>( + config, + base::BindRepeating(&AvSyncVideo::ChangeAudioRate, + base::Unretained(this)), + current_audio_clock_rate_); } void AvSyncVideo::FlushVideoPts() {
diff --git a/chromecast/media/cma/backend/video/av_sync_video.h b/chromecast/media/cma/backend/video/av_sync_video.h index c51b158..d0c890b 100644 --- a/chromecast/media/cma/backend/video/av_sync_video.h +++ b/chromecast/media/cma/backend/video/av_sync_video.h
@@ -18,6 +18,7 @@ namespace media { class MediaPipelineBackendForMixer; +class RateAdjuster; class AvSyncVideo : public AvSync { public: @@ -40,7 +41,9 @@ int GetVideoFrameRate(); void HardCorrection(int64_t apts, int64_t desired_apts_timestamp); - void AudioRateUpkeep(int64_t error, int64_t timestamp); + double ChangeAudioRate(double desired_clock_rate, + double error_slope, + double current_error); void FlushAudioPts(); void FlushVideoPts(); @@ -51,6 +54,7 @@ std::unique_ptr<WeightedMovingLinearRegression> apts_error_; std::unique_ptr<WeightedMovingLinearRegression> video_pts_; + std::unique_ptr<RateAdjuster> audio_rate_adjuster_; // This is the audio playback rate propagated from SetPlaybackRate, which is // exposed to the user to speed up or slow down their playback. @@ -66,10 +70,6 @@ int64_t last_apts_value_ = INT64_MIN; int64_t last_apts_timestamp_ = INT64_MIN; - int64_t clock_rate_start_timestamp_ = INT64_MIN; - double clock_rate_error_base_ = 0.0; - int64_t apts_error_start_timestamp_ = INT64_MIN; - DISALLOW_COPY_AND_ASSIGN(AvSyncVideo); };
diff --git a/chromecast/metrics/cast_metrics_service_client.cc b/chromecast/metrics/cast_metrics_service_client.cc index cab601b..b750dc3 100644 --- a/chromecast/metrics/cast_metrics_service_client.cc +++ b/chromecast/metrics/cast_metrics_service_client.cc
@@ -4,6 +4,8 @@ #include "chromecast/metrics/cast_metrics_service_client.h" +#include <string> + #include "base/bind.h" #include "base/callback.h" #include "base/command_line.h" @@ -294,7 +296,7 @@ void CastMetricsServiceClient::InitializeMetricsService() { DCHECK(!metrics_state_manager_); metrics_state_manager_ = ::metrics::MetricsStateManager::Create( - pref_service_, this, base::string16(), + pref_service_, this, std::wstring(), base::BindRepeating(&CastMetricsServiceClient::StoreClientInfo, base::Unretained(this)), base::BindRepeating(&CastMetricsServiceClient::LoadClientInfo,
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index d1bf205..d28da88 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -615,6 +615,12 @@ <message name="IDS_SCANNING_APP_NO_SCANNERS_SUBTEXT" desc="The subtext displayed when there are no available scanners found for scanning"> Make sure the scanner is turned on and connected </message> + <message name="IDS_SCANNING_APP_LEARN_MORE_BUTTON_LABEL" desc="The label for the button that leads to a help support article to learn more about scanning."> + Learn more + </message> + <message name="IDS_SCANNING_APP_RETRY_BUTTON_LABEL" desc="The label for the button that retries searching for available scanners."> + Retry + </message> <!-- Diagnostics App --> <message name="IDS_DIAGNOSTICS_TITLE" desc="The title of the diagnostics app.">
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_LEARN_MORE_BUTTON_LABEL.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_LEARN_MORE_BUTTON_LABEL.png.sha1 new file mode 100644 index 0000000..160bf4f --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_LEARN_MORE_BUTTON_LABEL.png.sha1
@@ -0,0 +1 @@ +0fc5ccef9aba0cdb34762bdbffadc27df2b0f84c \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_RETRY_BUTTON_LABEL.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_RETRY_BUTTON_LABEL.png.sha1 new file mode 100644 index 0000000..e8bc56e --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_RETRY_BUTTON_LABEL.png.sha1
@@ -0,0 +1 @@ +a26aa44dac14e8796dc869d36aca4949808a57a9 \ No newline at end of file
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb index d6986a56..ff03ea6b 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Tydsduur van afteller</translation> <translation id="2050339315714019657">Portret</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> is aktief</translation> +<translation id="2144806332417375165">Gepasmaakte videoparameters</translation> <translation id="229579744168541441">Voer uit na skyf</translation> <translation id="2501278716633472235">Gaan terug</translation> <translation id="2501853267655415902">Opname is gestop</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb index ee4303d4..b51ca7ba 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">مدة المؤقِّت</translation> <translation id="2050339315714019657">رأسي</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> نشطة</translation> +<translation id="2144806332417375165">مَعلمات الفيديوهات المخصّصة</translation> <translation id="229579744168541441">تصدير إلى القرص</translation> <translation id="2501278716633472235">الرجوع</translation> <translation id="2501853267655415902">تم إيقاف التسجيل</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_as.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_as.xtb index 5014a87..e43853b6 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_as.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_as.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">টাইমাৰৰ দৈৰ্ঘ্য</translation> <translation id="2050339315714019657">প’ৰ্ট্ৰেইট</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> সক্ৰিয় হৈ আছে</translation> +<translation id="2144806332417375165">কাষ্টম ভিডিঅ’ পেৰামিটাৰ</translation> <translation id="229579744168541441">ডিস্কলৈ ৰপ্তানি কৰক</translation> <translation id="2501278716633472235">উভতি যাওক</translation> <translation id="2501853267655415902">ৰেকৰ্ডিং বন্ধ কৰা হ’ল</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb index c70b75a..8735c58 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Час таймера</translation> <translation id="2050339315714019657">Кніжная</translation> <translation id="2064538373111010176">Камера <ph name="CAMERA" /> актыўная</translation> +<translation id="2144806332417375165">Карыстальніцкія параметры відэа</translation> <translation id="229579744168541441">Экспарт на дыск</translation> <translation id="2501278716633472235">Назад</translation> <translation id="2501853267655415902">Запіс спынены</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb index f61b4a8..6d171f27 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Продължителност на таймера</translation> <translation id="2050339315714019657">Вертикално</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> е активна</translation> +<translation id="2144806332417375165">Персонализирани параметри на видеото</translation> <translation id="229579744168541441">Експортиране към диска</translation> <translation id="2501278716633472235">Назад</translation> <translation id="2501853267655415902">Записването спря</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb index 77e15d8..156010e 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Trajanje tajmera</translation> <translation id="2050339315714019657">Uspravno</translation> <translation id="2064538373111010176">Kamera <ph name="CAMERA" /> je aktivna</translation> +<translation id="2144806332417375165">Prilagođeni parametri videozapisa</translation> <translation id="229579744168541441">Izvezi na disk</translation> <translation id="2501278716633472235">Nazad</translation> <translation id="2501853267655415902">Snimanje je zaustavljeno</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb index 363f873..60169279 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Durada del temporitzador</translation> <translation id="2050339315714019657">Vertical</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> activa</translation> +<translation id="2144806332417375165">Personalitza els paràmetres de vídeo</translation> <translation id="229579744168541441">Exporta al disc</translation> <translation id="2501278716633472235">Torna</translation> <translation id="2501853267655415902">S'ha aturat la gravació</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb index 9245ec957..2589bd8 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Trvání časovače</translation> <translation id="2050339315714019657">Na výšku</translation> <translation id="2064538373111010176">Aktivní: <ph name="CAMERA" /></translation> +<translation id="2144806332417375165">Vlastní parametry videa</translation> <translation id="229579744168541441">Exportovat na disk</translation> <translation id="2501278716633472235">Zpět</translation> <translation id="2501853267655415902">Nahrávání bylo zastaveno</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb index fbd1e14..aab7038f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Varighed for timer</translation> <translation id="2050339315714019657">Stående</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> er aktiv</translation> +<translation id="2144806332417375165">Tilpassede videoparametre</translation> <translation id="229579744168541441">Eksportér til disk</translation> <translation id="2501278716633472235">Gå tilbage</translation> <translation id="2501853267655415902">Optagelsen er stoppet</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb index 9eb8b07..39e64707 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Timerdauer</translation> <translation id="2050339315714019657">Hochformat</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> aktiv</translation> +<translation id="2144806332417375165">Benutzerdefinierte Videoparameter</translation> <translation id="229579744168541441">Auf Festplatte exportieren</translation> <translation id="2501278716633472235">Zurück</translation> <translation id="2501853267655415902">Aufnahme beendet</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb index 213cf11..ad4dd2d25 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Διάρκεια χρονομέτρου</translation> <translation id="2050339315714019657">Κάθετα</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> ενεργή</translation> +<translation id="2144806332417375165">Προσαρμοσμένες παράμετροι βίντεο</translation> <translation id="229579744168541441">Εξαγωγή σε δίσκο</translation> <translation id="2501278716633472235">Επιστροφή</translation> <translation id="2501853267655415902">Η εγγραφή διακόπηκε</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb index a21aa0e..fd38a74 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Duración del temporizador</translation> <translation id="2050339315714019657">Vertical</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> activa</translation> +<translation id="2144806332417375165">Parámetros de video personalizados</translation> <translation id="229579744168541441">Exportar al disco</translation> <translation id="2501278716633472235">Ir atrás</translation> <translation id="2501853267655415902">Se detuvo la grabación</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb index ed257437..3291694c7 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Tenporizadorearen iraupena</translation> <translation id="2050339315714019657">Bertikala</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> aktibo dago</translation> +<translation id="2144806332417375165">Pertsonalizatu bideoaren parametroak</translation> <translation id="229579744168541441">Esportatu diskora</translation> <translation id="2501278716633472235">Egin atzera</translation> <translation id="2501853267655415902">Grabatzeari utzi zaio</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb index 00207a3e..7f7722975 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Tagal ng timer</translation> <translation id="2050339315714019657">Portrait</translation> <translation id="2064538373111010176">Aktibo ang <ph name="CAMERA" /></translation> +<translation id="2144806332417375165">Mga custom na parameter ng video</translation> <translation id="229579744168541441">I-export sa disk</translation> <translation id="2501278716633472235">Bumalik</translation> <translation id="2501853267655415902">Itinigil ang pag-record</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb index 0c9856a..4c5c5d9 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Durée de la minuterie</translation> <translation id="2050339315714019657">Portrait</translation> <translation id="2064538373111010176">Élément de menu <ph name="CAMERA" /> actif</translation> +<translation id="2144806332417375165">Paramètres vidéo personnalisés</translation> <translation id="229579744168541441">Exporter sur le disque</translation> <translation id="2501278716633472235">Retour</translation> <translation id="2501853267655415902">Enregistrement interrompu</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb index 54b17b3..e30dd54 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Durée du retardateur</translation> <translation id="2050339315714019657">Portrait</translation> <translation id="2064538373111010176">Option <ph name="CAMERA" /> activée</translation> +<translation id="2144806332417375165">Paramètres vidéo personnalisés</translation> <translation id="229579744168541441">Exporter vers le disque</translation> <translation id="2501278716633472235">Retour</translation> <translation id="2501853267655415902">Enregistrement interrompu</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb index dd1fe9f..bb163515 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Duración do temporizador</translation> <translation id="2050339315714019657">Vertical</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> (dispositivo activado)</translation> +<translation id="2144806332417375165">Parámetros personalizados de vídeo</translation> <translation id="229579744168541441">Exportar ao disco</translation> <translation id="2501278716633472235">Ir atrás</translation> <translation id="2501853267655415902">Detívose a gravación</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb index 2f592452..e2f70ec 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">टाइमर का कुल समय</translation> <translation id="2050339315714019657">पोर्ट्रेट</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> चालू है</translation> +<translation id="2144806332417375165">कस्टम वीडियो पैरामीटर</translation> <translation id="229579744168541441">डिस्क में ले जाएं</translation> <translation id="2501278716633472235">वापस जाएं</translation> <translation id="2501853267655415902">रिकॉर्डिंग रुक गई है</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb index 029a53e5..b5b8210 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Trajanje odbrojavanja</translation> <translation id="2050339315714019657">Portret</translation> <translation id="2064538373111010176">Aktivno: <ph name="CAMERA" /></translation> +<translation id="2144806332417375165">Prilagođeni parametri videozapisa</translation> <translation id="229579744168541441">Izvezi na disk</translation> <translation id="2501278716633472235">Natrag</translation> <translation id="2501853267655415902">Snimanje je zaustavljeno</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb index 0e2144a..d87a2c0e 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Időzítés hossza</translation> <translation id="2050339315714019657">Álló</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> aktív</translation> +<translation id="2144806332417375165">Egyedi videóparaméterek</translation> <translation id="229579744168541441">Exportálás lemezre</translation> <translation id="2501278716633472235">Visszalépés</translation> <translation id="2501853267655415902">A felvétel leállt</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb index 280b6c2..308f8cbe 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Ժամաչափի տևողությունը</translation> <translation id="2050339315714019657">Ուղղաձիգ</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> տեսախցիկն ակտիվ է</translation> +<translation id="2144806332417375165">Տեսանյութի հատուկ պարամետրեր</translation> <translation id="229579744168541441">Արտահանել սկավառակ</translation> <translation id="2501278716633472235">Վերադառնալ</translation> <translation id="2501853267655415902">Տեսագրումը դադարեցվեց</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb index 314e51a..3a6a9a0 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Durasi timer</translation> <translation id="2050339315714019657">Potret</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> aktif</translation> +<translation id="2144806332417375165">Parameter video kustom</translation> <translation id="229579744168541441">Ekspor ke disk</translation> <translation id="2501278716633472235">Kembali</translation> <translation id="2501853267655415902">Perekaman dihentikan</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb index 531fc30..af0465b1 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Tími niðurteljara</translation> <translation id="2050339315714019657">Skammsnið</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> er virk</translation> +<translation id="2144806332417375165">Sérstilltar færibreytur myndskeiðs</translation> <translation id="229579744168541441">Flytja út á disk</translation> <translation id="2501278716633472235">Fara til baka</translation> <translation id="2501853267655415902">Upptaka var stöðvuð</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb index 03f6375..cbe3a3ee 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Durata del timer</translation> <translation id="2050339315714019657">Verticale</translation> <translation id="2064538373111010176">Fotocamera <ph name="CAMERA" /> attiva</translation> +<translation id="2144806332417375165">Parametri video personalizzati</translation> <translation id="229579744168541441">Esporta su disco</translation> <translation id="2501278716633472235">Indietro</translation> <translation id="2501853267655415902">Registrazione interrotta</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb index 39ebc3dc..8cb8ea9 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">ტაიმერის ხანგრძლივობა</translation> <translation id="2050339315714019657">პორტრეტი</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> აქტიურია</translation> +<translation id="2144806332417375165">მორგებული ვიდეოპარამეტრები</translation> <translation id="229579744168541441">დისკზე ექსპორტირება</translation> <translation id="2501278716633472235">უკან დაბრუნება</translation> <translation id="2501853267655415902">ჩაწერა შეწყდა</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_kn.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_kn.xtb index b36d009..fbc80f37 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_kn.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_kn.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">ಟೈಮರ್ ಅವಧಿ</translation> <translation id="2050339315714019657">ಪೋರ್ಟ್ರೇಟ್</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> ಸಕ್ರಿಯ</translation> +<translation id="2144806332417375165">ಕಸ್ಟಮ್ ವೀಡಿಯೊ ಪ್ಯಾರಾಮೀಟರ್ಗಳು</translation> <translation id="229579744168541441">ಡಿಸ್ಕ್ಗೆ ರಫ್ತು ಮಾಡಿ</translation> <translation id="2501278716633472235">ಹಿಂದಿರುಗಿ</translation> <translation id="2501853267655415902">ರೆಕಾರ್ಡಿಂಗ್ ನಿಂತಿದೆ</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb index 16dc961..07af0d3 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">타이머 시간</translation> <translation id="2050339315714019657">세로 방향</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> 사용 중</translation> +<translation id="2144806332417375165">맞춤 동영상 매개변수</translation> <translation id="229579744168541441">디스크로 내보내기</translation> <translation id="2501278716633472235">뒤로 이동</translation> <translation id="2501853267655415902">녹화가 중지되었습니다.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb index e0c1e48..4a89972 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">ໄລຍະເວລາຂອງໂມງນັບຖອຍຫຼັງ</translation> <translation id="2050339315714019657">ລວງຕັ້ງ</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> ເປີດໃຊ້ຢູ່</translation> +<translation id="2144806332417375165">ຄ່າພາຣາມີເຕີວິດີໂອແບບກຳນົດເອງ</translation> <translation id="229579744168541441">ສົ່ງອອກໄປໃສ່ດິສກ໌</translation> <translation id="2501278716633472235">ກັບຄືນໄປ</translation> <translation id="2501853267655415902">ຢຸດການບັນທຶກແລ້ວ</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb index 581b8c77..a44e388 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Laikmačio trukmė</translation> <translation id="2050339315714019657">Stačias</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> aktyvus</translation> +<translation id="2144806332417375165">Tinkinti vaizdo įrašų parametrai</translation> <translation id="229579744168541441">Eksportuoti į diską</translation> <translation id="2501278716633472235">Grįžti</translation> <translation id="2501853267655415902">Įrašas sustabdytas</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb index 481d042..d2d420c 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Времетраење на тајмерот</translation> <translation id="2050339315714019657">Портрет</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> е активна</translation> +<translation id="2144806332417375165">Приспособени видеопараметри</translation> <translation id="229579744168541441">Извези на диск</translation> <translation id="2501278716633472235">Врати се</translation> <translation id="2501853267655415902">Снимањето е запрено</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb index d84259bc..db4f28c 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Tempoh pemasa</translation> <translation id="2050339315714019657">Potret</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> aktif</translation> +<translation id="2144806332417375165">Sesuaikan parameter video</translation> <translation id="229579744168541441">Eksport ke cakera</translation> <translation id="2501278716633472235">Kembali</translation> <translation id="2501853267655415902">Rakaman dihentikan</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ne.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ne.xtb index 98e85eb..ff5c9d9 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ne.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ne.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">टाइमरको अवधि</translation> <translation id="2050339315714019657">पोर्ट्रेट</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> सक्रिय भयो</translation> +<translation id="2144806332417375165">भिडियोसम्बन्धी आफू अनुकूल प्यारामिटरहरू</translation> <translation id="229579744168541441">निर्यात गरी डिस्कमा पठाउनुहोस्</translation> <translation id="2501278716633472235">पछाडि जानुहोस्</translation> <translation id="2501853267655415902">रेकर्डिङ गर्न छाडियो</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb index 74f7bcda..d5db489c 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Nedtellervarighet</translation> <translation id="2050339315714019657">Stående</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> er aktivt</translation> +<translation id="2144806332417375165">Egendefinerte videoparametre</translation> <translation id="229579744168541441">Eksportér til disk</translation> <translation id="2501278716633472235">Gå tilbake</translation> <translation id="2501853267655415902">Opptaket er stoppet</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_or.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_or.xtb index 662cf3f..8b452b9 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_or.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_or.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">ଟାଇମ୍ର ଅବଧି</translation> <translation id="2050339315714019657">ପୋଟ୍ରେଟ୍</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> ସକ୍ରିୟ ଅଛି</translation> +<translation id="2144806332417375165">କଷ୍ଟମ୍ ଭିଡିଓ ପାରାମିଟରଗୁଡ଼ିକ</translation> <translation id="229579744168541441">ଡିସ୍କକୁ ଏକ୍ସପୋର୍ଟ କରନ୍ତୁ</translation> <translation id="2501278716633472235">ଫେରନ୍ତୁ</translation> <translation id="2501853267655415902">ରେକର୍ଡିଂ ବନ୍ଦ ହୋଇଗଲା।</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pa.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pa.xtb index cb07e48..6f990a8 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pa.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pa.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">ਟਾਈਮਰ ਦੀ ਮਿਆਦ</translation> <translation id="2050339315714019657">ਪੋਰਟਰੇਟ</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> ਕਿਰਿਆਸ਼ੀਲ</translation> +<translation id="2144806332417375165">ਵਿਉਂਤਬੱਧ ਵੀਡੀਓ ਮਾਪਦੰਡ</translation> <translation id="229579744168541441">ਡਿਸਕ ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ</translation> <translation id="2501278716633472235">ਪਿੱਛੇ ਜਾਓ</translation> <translation id="2501853267655415902">ਰਿਕਾਰਡਿੰਗ ਬੰਦ ਹੋਈ</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb index 410bb1f0a..111af26 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Czas samowyzwalacza</translation> <translation id="2050339315714019657">Pionowo</translation> <translation id="2064538373111010176">Aparat <ph name="CAMERA" /> jest aktywny</translation> +<translation id="2144806332417375165">Niestandardowe parametry wideo</translation> <translation id="229579744168541441">Eksportuj na dysk</translation> <translation id="2501278716633472235">Wróć</translation> <translation id="2501853267655415902">Nagrywanie zatrzymane</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb index 939b8555..5784194 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Duração do timer</translation> <translation id="2050339315714019657">Retrato</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> ativa</translation> +<translation id="2144806332417375165">Parâmetros de vídeo personalizados</translation> <translation id="229579744168541441">Exportar para o disco</translation> <translation id="2501278716633472235">Voltar</translation> <translation id="2501853267655415902">A gravação foi interrompida</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb index c74a1a6..4b105a9 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Duração do temporizador</translation> <translation id="2050339315714019657">Vertical</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> ativa</translation> +<translation id="2144806332417375165">Personalizar parâmetros do vídeo</translation> <translation id="229579744168541441">Exportar para o disco</translation> <translation id="2501278716633472235">Voltar</translation> <translation id="2501853267655415902">Gravação parada</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb index b7d2ffe..3e4bd8f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Длительность таймера</translation> <translation id="2050339315714019657">Книжная</translation> <translation id="2064538373111010176">Камера <ph name="CAMERA" /> активна</translation> +<translation id="2144806332417375165">Свои параметры видео</translation> <translation id="229579744168541441">Экспортировать на диск</translation> <translation id="2501278716633472235">Назад</translation> <translation id="2501853267655415902">Запись остановлена</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb index 2f6b8245..bf2ba7a 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">මුහූර්තක කාල සීමාව</translation> <translation id="2050339315714019657">සිරස්</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> ක්රියාත්මකයි</translation> +<translation id="2144806332417375165">අභිරුචි වීඩියෝ පරාමිති</translation> <translation id="229579744168541441">තැටියට නිර්යාත කරන්න</translation> <translation id="2501278716633472235">ආපසු යන්න</translation> <translation id="2501853267655415902">පටිගත කිරීම නැවතුණි</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb index d659cb8d..0000e88 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Kohëzgjatja e kohëmatësit</translation> <translation id="2050339315714019657">Portret (vertikal</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> aktive</translation> +<translation id="2144806332417375165">Personalizo parametrat e videos</translation> <translation id="229579744168541441">Eksporto në disk</translation> <translation id="2501278716633472235">Kthehu prapa</translation> <translation id="2501853267655415902">Regjistrimi ndaloi</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb index b994916..369c4f8 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Trajanje tajmera</translation> <translation id="2050339315714019657">Vertikalno</translation> <translation id="2064538373111010176">Kamera <ph name="CAMERA" /> je aktivna</translation> +<translation id="2144806332417375165">Prilagođeni parametri video snimaka</translation> <translation id="229579744168541441">Izvezi na disk</translation> <translation id="2501278716633472235">Nazad</translation> <translation id="2501853267655415902">Snimanje je zaustavljeno</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb index 9c5dffe3..60eed219 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Трајање тајмера</translation> <translation id="2050339315714019657">Вертикално</translation> <translation id="2064538373111010176">Kamera <ph name="CAMERA" /> је активна</translation> +<translation id="2144806332417375165">Прилагођени параметри видео снимака</translation> <translation id="229579744168541441">Извези на диск</translation> <translation id="2501278716633472235">Назад</translation> <translation id="2501853267655415902">Снимање је заустављено</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ta.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ta.xtb index 047d3fa9..2d443834 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ta.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ta.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">டைமர் காலஅளவு</translation> <translation id="2050339315714019657">செங்குத்து நிலை</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> செயலில் உள்ளது</translation> +<translation id="2144806332417375165">பிரத்தியேக வீடியோ அளவுருக்கள்</translation> <translation id="229579744168541441">டிஸ்கிற்கு இடமாற்று</translation> <translation id="2501278716633472235">திரும்பிச் செல்</translation> <translation id="2501853267655415902">பதிவுசெய்வது நிறுத்தப்பட்டது</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb index 301be23f..062a48a8 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">ระยะเวลาของตัวจับเวลา</translation> <translation id="2050339315714019657">แนวตั้ง</translation> <translation id="2064538373111010176">ใช้งาน <ph name="CAMERA" /> อยู่</translation> +<translation id="2144806332417375165">กำหนดพารามิเตอร์วิดีโอเอง</translation> <translation id="229579744168541441">ส่งออกไปยังดิสก์</translation> <translation id="2501278716633472235">ย้อนกลับ</translation> <translation id="2501853267655415902">หยุดบันทึกแล้ว</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb index 7e9934ec..7b38478 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Zamanlayıcı süresi</translation> <translation id="2050339315714019657">Dikey</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> etkin</translation> +<translation id="2144806332417375165">Özel video parametreleri</translation> <translation id="229579744168541441">Diske aktar</translation> <translation id="2501278716633472235">Geri dön</translation> <translation id="2501853267655415902">Kayıt durduruldu</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uz.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uz.xtb index af251968..833d3c6a 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uz.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uz.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Taymer davomiyligi</translation> <translation id="2050339315714019657">Bo‘yiga</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> faol</translation> +<translation id="2144806332417375165">Maxsus video parametrlari</translation> <translation id="229579744168541441">Diskka eksport qilish</translation> <translation id="2501278716633472235">Ortga qaytish</translation> <translation id="2501853267655415902">Yozib olish toʻxtatildi</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb index 1ed5aaa..a06f773 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">計時器時間</translation> <translation id="2050339315714019657">直向</translation> <translation id="2064538373111010176">開咗「<ph name="CAMERA" />」</translation> +<translation id="2144806332417375165">自訂影片參數</translation> <translation id="229579744168541441">匯出至磁碟</translation> <translation id="2501278716633472235">返回</translation> <translation id="2501853267655415902">停咗錄影</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb index 5f39cea..f93085f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">計時器倒數時間</translation> <translation id="2050339315714019657">直向</translation> <translation id="2064538373111010176">「<ph name="CAMERA" />」已啟用</translation> +<translation id="2144806332417375165">自訂影片參數</translation> <translation id="229579744168541441">匯出至磁碟</translation> <translation id="2501278716633472235">返回</translation> <translation id="2501853267655415902">已停止錄影</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb index 291efe32..ebe7d6d 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb
@@ -15,6 +15,7 @@ <translation id="2036868001356139588">Ubude besikhathi</translation> <translation id="2050339315714019657">Ukuma ngobude</translation> <translation id="2064538373111010176"><ph name="CAMERA" /> iyasebenza</translation> +<translation id="2144806332417375165">Yenza ngokwezifiso amapharamitha wevidiyo yakho</translation> <translation id="229579744168541441">Thumela kudiski</translation> <translation id="2501278716633472235">Iya emuva</translation> <translation id="2501853267655415902">Ukurekhoda kumisiwe</translation>
diff --git a/chromeos/components/connectivity_diagnostics/connectivity_diagnostics_ui.cc b/chromeos/components/connectivity_diagnostics/connectivity_diagnostics_ui.cc index 5a8d11af..73a7173 100644 --- a/chromeos/components/connectivity_diagnostics/connectivity_diagnostics_ui.cc +++ b/chromeos/components/connectivity_diagnostics/connectivity_diagnostics_ui.cc
@@ -34,6 +34,8 @@ source->SetDefaultResource(default_resource); source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); + source->AddResourcePath("test_loader_util.js", + IDR_WEBUI_JS_TEST_LOADER_UTIL_JS); } } // namespace
diff --git a/chromeos/components/diagnostics_ui/diagnostics_ui.cc b/chromeos/components/diagnostics_ui/diagnostics_ui.cc index b124595..3e705e5e 100644 --- a/chromeos/components/diagnostics_ui/diagnostics_ui.cc +++ b/chromeos/components/diagnostics_ui/diagnostics_ui.cc
@@ -106,9 +106,7 @@ {"testSuccess", IDS_DIAGNOSTICS_TEST_SUCCESS_TEXT}, {"testSucceededBadgeText", IDS_DIAGNOSTICS_TEST_SUCCESS_BADGE_TEXT}, }; - for (const auto& str : kLocalizedStrings) { - html_source->AddLocalizedString(str.name, str.id); - } + html_source->AddLocalizedStrings(kLocalizedStrings); html_source->UseStringsJs(); } // TODO(jimmyxgong): Replace with webui::SetUpWebUIDataSource() once it no @@ -123,6 +121,8 @@ source->SetDefaultResource(default_resource); source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); + source->AddResourcePath("test_loader_util.js", + IDR_WEBUI_JS_TEST_LOADER_UTIL_JS); } } // namespace
diff --git a/chromeos/components/diagnostics_ui/resources/icons.html b/chromeos/components/diagnostics_ui/resources/icons.html index b989baa9..4995d63 100644 --- a/chromeos/components/diagnostics_ui/resources/icons.html +++ b/chromeos/components/diagnostics_ui/resources/icons.html
@@ -68,7 +68,7 @@ <path fill-rule="evenodd" clip-rule="evenodd" d="M13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5V16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5ZM12.5 6H7.5V15.5H12.5V6Z" /> </g> <g id="memory"> - <path d="M2,18 L18,18 L18,14 L2,14 L2,18 Z M4,15 L6,15 L6,17 L4,17 L4,15 Z M2,2 L2,6 L18,6 L18,2 L2,2 Z M6,5 L4,5 L4,3 L6,3 L6,5 Z M2,12 L18,12 L18,8 L2,8 L2,12 Z M4,9 L6,9 L6,11 L4,11 L4,9 Z" fill-rule="nonzero" /> + <path d="M16.2222 2H3.77778C2.8 2 2 2.8 2 3.77778V16.2222C2 17.2 2.8 18 3.77778 18H16.2222C17.2 18 18 17.2 18 16.2222V3.77778C18 2.8 17.2 2 16.2222 2ZM10 14.4444H4.66667V10H10V14.4444ZM15.3333 14.4444H11.7778V10H15.3333V14.4444ZM15.3333 8.22222H4.66667V5.55556H15.3333V8.22222Z" /> </g> <g id="download"> <path d="M11 9.2L13.5 6.5L15 8L10 13L5 8L6.5 6.5L9 9.2V3H11V9.2Z" />
diff --git a/chromeos/components/file_manager/url_constants.cc b/chromeos/components/file_manager/url_constants.cc index c4be8375..12b15b1 100644 --- a/chromeos/components/file_manager/url_constants.cc +++ b/chromeos/components/file_manager/url_constants.cc
@@ -8,7 +8,7 @@ namespace file_manager { constexpr char kChromeUIFileManagerHost[] = "file-manager"; -constexpr char kChromeUIFileManagerURL[] = "chrome://file-manager"; +constexpr char kChromeUIFileManagerURL[] = "chrome://file-manager/"; } // namespace file_manager } // namespace chromeos
diff --git a/chromeos/components/network_ui/network_diagnostics_resource_provider.cc b/chromeos/components/network_ui/network_diagnostics_resource_provider.cc index 9e93b7d..de5d9ea7 100644 --- a/chromeos/components/network_ui/network_diagnostics_resource_provider.cc +++ b/chromeos/components/network_ui/network_diagnostics_resource_provider.cc
@@ -145,8 +145,7 @@ } // namespace void AddResources(content::WebUIDataSource* html_source) { - for (const auto& str : kLocalizedStrings) - html_source->AddLocalizedString(str.name, str.id); + html_source->AddLocalizedStrings(kLocalizedStrings); for (const auto& resource : kResources) html_source->AddResourcePath(resource.name, resource.id);
diff --git a/chromeos/components/network_ui/network_health_resource_provider.cc b/chromeos/components/network_ui/network_health_resource_provider.cc index 9745b8e..516a6ba 100644 --- a/chromeos/components/network_ui/network_health_resource_provider.cc +++ b/chromeos/components/network_ui/network_health_resource_provider.cc
@@ -38,6 +38,8 @@ {"OncTypeWiFi", IDS_NETWORK_TYPE_WIFI}, {"OncWiFi-SignalStrength", IDS_ONC_WIFI_SIGNAL_STRENGTH}, {"OncMacAddress", IDS_ONC_MAC_ADDRESS}, + {"OncIpv4Address", IDS_ONC_IPV4_ADDRESS}, + {"OncIpv6Address", IDS_ONC_IPV6_ADDRESS}, }; @@ -56,8 +58,7 @@ } // namespace void AddResources(content::WebUIDataSource* html_source) { - for (const auto& str : kLocalizedStrings) - html_source->AddLocalizedString(str.name, str.id); + html_source->AddLocalizedStrings(kLocalizedStrings); for (const auto& resource : kResources) html_source->AddResourcePath(resource.name, resource.id);
diff --git a/chromeos/components/print_management/print_management_ui.cc b/chromeos/components/print_management/print_management_ui.cc index 0376fbf..4907f322 100644 --- a/chromeos/components/print_management/print_management_ui.cc +++ b/chromeos/components/print_management/print_management_ui.cc
@@ -32,6 +32,8 @@ source->SetDefaultResource(default_resource); source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); + source->AddResourcePath("test_loader_util.js", + IDR_WEBUI_JS_TEST_LOADER_UTIL_JS); } void AddPrintManagementStrings(content::WebUIDataSource* html_source) { @@ -98,9 +100,7 @@ IDS_PRINT_MANAGEMENT_CANCELED_PRINT_JOB_ARIA_ANNOUNCEMENT}, {"collapsedPrintingText", IDS_PRINT_MANAGEMENT_COLLAPSE_PRINTING_STATUS}}; - for (const auto& str : kLocalizedStrings) { - html_source->AddLocalizedString(str.name, str.id); - } + html_source->AddLocalizedStrings(kLocalizedStrings); html_source->UseStringsJs(); } } // namespace
diff --git a/chromeos/components/scanning/resources/loading_page.html b/chromeos/components/scanning/resources/loading_page.html index 7c0b0afe..ce8d1d8 100644 --- a/chromeos/components/scanning/resources/loading_page.html +++ b/chromeos/components/scanning/resources/loading_page.html
@@ -33,6 +33,10 @@ margin-top: 12px; width: 300px; } + + #buttonDiv { + margin-top: 32px; + } </style> <div id="loadingContainer"> <div id="loadingDiv" hidden="[[noScannersAvailable_]]"> @@ -42,5 +46,15 @@ <div id="noScannersDiv" hidden="[[!noScannersAvailable_]]"> <h1>[[i18n('noScannersText')]]</h1> <span id="noScannersSubtext">[[i18n('noScannersSubtext')]]</span> + <div id="buttonDiv"> + <cr-button id="learnMoreButton" class="cancel-button" + on-click="onLearnMoreClick_"> + [[i18n('learnMoreButtonLabel')]] + </cr-button> + <cr-button id="retryButton" class="action-button" + on-click="onRetryClick_"> + [[i18n('retryButtonLabel')]] + </cr-button> + </div> </div> </div>
diff --git a/chromeos/components/scanning/resources/loading_page.js b/chromeos/components/scanning/resources/loading_page.js index b147a8bb..bd9dee1 100644 --- a/chromeos/components/scanning/resources/loading_page.js +++ b/chromeos/components/scanning/resources/loading_page.js
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import 'chrome://resources/polymer/v3_0/paper-progress/paper-progress.js'; import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js'; @@ -38,4 +39,14 @@ onAppStateChange_() { this.noScannersAvailable_ = this.appState === AppState.NO_SCANNERS; }, + + /** @private */ + onRetryClick_() { + this.fire('retry-click'); + }, + + /** @private */ + onLearnMoreClick_() { + this.fire('learn-more-click'); + }, });
diff --git a/chromeos/components/scanning/resources/scanning_app.html b/chromeos/components/scanning/resources/scanning_app.html index 4e6f722..a4049eb 100644 --- a/chromeos/components/scanning/resources/scanning_app.html +++ b/chromeos/components/scanning/resources/scanning_app.html
@@ -175,7 +175,8 @@ } </style> <div id="scanningContainer"> - <loading-page hidden="[[scannersLoaded_]]" app-state="[[appState_]]"> + <loading-page hidden="[[scannersLoaded_]]" app-state="[[appState_]]" + on-retry-click="onRetryClick_" on-learn-more-click="onLearnMoreClick_"> </loading-page> <div id="panelContainer" hidden="[[!scannersLoaded_]]"> <div id="leftPanel">
diff --git a/chromeos/components/scanning/resources/scanning_app.js b/chromeos/components/scanning/resources/scanning_app.js index 1c3c193..c40f217 100644 --- a/chromeos/components/scanning/resources/scanning_app.js +++ b/chromeos/components/scanning/resources/scanning_app.js
@@ -43,6 +43,12 @@ const DEFAULT_SAVE_DIRECTORY = '/home/chronos/user/MyFiles'; /** + * URL for the Scanning help page. + * @const {string} + */ +const HELP_PAGE_LINK = 'http://support.google.com/chromebook?p=chrome_scanning'; + +/** * @fileoverview * 'scanning-app' is used to interact with connected scanners. */ @@ -518,7 +524,9 @@ setAppState_(newState) { switch (newState) { case (AppState.GETTING_SCANNERS): - assert(this.appState_ === AppState.GETTING_SCANNERS); + assert( + this.appState_ === AppState.GETTING_SCANNERS || + this.appState_ === AppState.NO_SCANNERS); break; case (AppState.GOT_SCANNERS): assert(this.appState_ === AppState.GETTING_SCANNERS); @@ -612,7 +620,7 @@ onDialogGetHelpClick_() { this.$.scanFailedDialog.close(); this.setAppState_(AppState.READY); - window.open('http://support.google.com/chromebook?p=chrome_scanning'); + window.open(HELP_PAGE_LINK); }, /** @@ -624,5 +632,19 @@ chromeos.scanning.mojom.FileType.kPdf.toString() ? 1 : this.pageNumber_; - } + }, + + /** @private */ + onRetryClick_() { + this.setAppState_(AppState.GETTING_SCANNERS); + this.scanService_.getScanners().then( + /*@type {!{scanners: !ScannerArr}}*/ (response) => { + this.onScannersReceived_(response); + }); + }, + + /** @private */ + onLearnMoreClick_() { + window.open(HELP_PAGE_LINK); + }, });
diff --git a/chromeos/components/scanning/scanning_ui.cc b/chromeos/components/scanning/scanning_ui.cc index c48829e..66607c1 100644 --- a/chromeos/components/scanning/scanning_ui.cc +++ b/chromeos/components/scanning/scanning_ui.cc
@@ -41,6 +41,8 @@ source->SetDefaultResource(default_resource); source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); + source->AddResourcePath("test_loader_util.js", + IDR_WEBUI_JS_TEST_LOADER_UTIL_JS); } void AddScanningAppStrings(content::WebUIDataSource* html_source) { @@ -63,6 +65,7 @@ {"getHelpLinkText", IDS_SCANNING_APP_GET_HELP_LINK_TEXT}, {"grayscaleOptionText", IDS_SCANNING_APP_GRAYSCALE_OPTION_TEXT}, {"jpgOptionText", IDS_SCANNING_APP_JPG_OPTION_TEXT}, + {"learnMoreButtonLabel", IDS_SCANNING_APP_LEARN_MORE_BUTTON_LABEL}, {"letterOptionText", IDS_SCANNING_APP_LETTER_OPTION_TEXT}, {"moreSettings", IDS_SCANNING_APP_MORE_SETTINGS}, {"myFilesSelectOption", IDS_SCANNING_APP_MY_FILES_SELECT_OPTION}, @@ -76,6 +79,7 @@ {"pageSizeDropdownLabel", IDS_SCANNING_APP_PAGE_SIZE_DROPDOWN_LABEL}, {"resolutionDropdownLabel", IDS_SCANNING_APP_RESOLUTION_DROPDOWN_LABEL}, {"resolutionOptionText", IDS_SCANNING_APP_RESOLUTION_OPTION_TEXT}, + {"retryButtonLabel", IDS_SCANNING_APP_RETRY_BUTTON_LABEL}, {"scanButtonText", IDS_SCANNING_APP_SCAN_BUTTON_TEXT}, {"scanCanceledToastText", IDS_SCANNING_APP_SCAN_CANCELED_TOAST_TEXT}, {"scanFailedDialogBodyText", @@ -94,9 +98,7 @@ {"twoSidedDocFeederOptionText", IDS_SCANNING_APP_TWO_SIDED_DOC_FEEDER_OPTION_TEXT}}; - for (const auto& str : kLocalizedStrings) - html_source->AddLocalizedString(str.name, str.id); - + html_source->AddLocalizedStrings(kLocalizedStrings); html_source->UseStringsJs(); }
diff --git a/chromeos/services/assistant/BUILD.gn b/chromeos/services/assistant/BUILD.gn index e332e62..92639d4 100644 --- a/chromeos/services/assistant/BUILD.gn +++ b/chromeos/services/assistant/BUILD.gn
@@ -34,6 +34,8 @@ "platform/audio_devices.h", "platform/audio_input_host_impl.cc", "platform/audio_input_host_impl.h", + "platform/audio_output_delegate_impl.cc", + "platform/audio_output_delegate_impl.h", "platform/platform_delegate_impl.cc", "platform/platform_delegate_impl.h", "service.cc",
diff --git a/chromeos/services/assistant/assistant_manager_service_delegate_impl.cc b/chromeos/services/assistant/assistant_manager_service_delegate_impl.cc index 77a9e08b..dab643f 100644 --- a/chromeos/services/assistant/assistant_manager_service_delegate_impl.cc +++ b/chromeos/services/assistant/assistant_manager_service_delegate_impl.cc
@@ -38,12 +38,14 @@ std::unique_ptr<CrosPlatformApi> AssistantManagerServiceDelegateImpl::CreatePlatformApi( - AssistantMediaSession* media_session, + mojo::PendingRemote<chromeos::libassistant::mojom::AudioOutputDelegate> + audio_output_delegate, chromeos::libassistant::mojom::PlatformDelegate* platform_delegate, scoped_refptr<base::SingleThreadTaskRunner> background_thread_task_runner) { return std::make_unique<PlatformApiImpl>( - media_session, platform_delegate, context_->power_manager_client(), - context_->main_task_runner(), background_thread_task_runner); + std::move(audio_output_delegate), platform_delegate, + context_->power_manager_client(), context_->main_task_runner(), + background_thread_task_runner); } std::unique_ptr<assistant_client::AssistantManager>
diff --git a/chromeos/services/assistant/assistant_manager_service_delegate_impl.h b/chromeos/services/assistant/assistant_manager_service_delegate_impl.h index aafca00..2684231 100644 --- a/chromeos/services/assistant/assistant_manager_service_delegate_impl.h +++ b/chromeos/services/assistant/assistant_manager_service_delegate_impl.h
@@ -26,7 +26,8 @@ mojo::PendingRemote<chromeos::libassistant::mojom::AudioInputController> pending_remote) override; std::unique_ptr<CrosPlatformApi> CreatePlatformApi( - AssistantMediaSession* media_session, + mojo::PendingRemote<chromeos::libassistant::mojom::AudioOutputDelegate> + audio_output_delegate, chromeos::libassistant::mojom::PlatformDelegate* platform_delegate, scoped_refptr<base::SingleThreadTaskRunner> background_thread_task_runner) override;
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc index cf6b6fe..21a39a7 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.cc +++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -36,6 +36,7 @@ #include "chromeos/services/assistant/assistant_device_settings_delegate.h" #include "chromeos/services/assistant/libassistant_service_host_impl.h" #include "chromeos/services/assistant/media_host.h" +#include "chromeos/services/assistant/platform/audio_output_delegate_impl.h" #include "chromeos/services/assistant/platform/platform_delegate_impl.h" #include "chromeos/services/assistant/platform_api_impl.h" #include "chromeos/services/assistant/proxy/conversation_controller_proxy.h" @@ -233,6 +234,8 @@ delegate_(std::move(delegate)), media_host_(std::make_unique<MediaHost>(AssistantClient::Get(), &interaction_subscribers_)), + audio_output_delegate_(std::make_unique<AudioOutputDelegateImpl>( + &media_host_->media_session())), speech_recognition_observer_( std::make_unique<SpeechRecognitionObserverWrapper>( &interaction_subscribers_)), @@ -242,7 +245,8 @@ ShouldPutLogsInHomeDirectory())), weak_factory_(this) { platform_api_ = delegate_->CreatePlatformApi( - &media_host_->media_session(), platform_delegate_.get(), + audio_output_delegate_->BindNewPipeAndPassRemote(), + platform_delegate_.get(), assistant_proxy_->background_thread().task_runner()); if (libassistant_service_host) {
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h index 5d29216a..1886148f 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.h +++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -62,6 +62,7 @@ class AssistantMediaSession; class AssistantProxy; class AudioInputHost; +class AudioOutputDelegateImpl; class CrosPlatformApi; class MediaHost; class PlatformDelegateImpl; @@ -296,6 +297,7 @@ std::unique_ptr<LibassistantServiceHost> libassistant_service_host_; std::unique_ptr<AssistantDeviceSettingsDelegate> settings_delegate_; std::unique_ptr<MediaHost> media_host_; + std::unique_ptr<AudioOutputDelegateImpl> audio_output_delegate_; std::unique_ptr<SpeechRecognitionObserverWrapper> speech_recognition_observer_; mojo::Receiver<chromeos::libassistant::mojom::StateObserver>
diff --git a/chromeos/services/assistant/platform/audio_device_owner.cc b/chromeos/services/assistant/platform/audio_device_owner.cc index d3e1f3d..16d10eb4 100644 --- a/chromeos/services/assistant/platform/audio_device_owner.cc +++ b/chromeos/services/assistant/platform/audio_device_owner.cc
@@ -7,7 +7,7 @@ #include <algorithm> #include <utility> -#include "chromeos/services/assistant/media_session/assistant_media_session.h" +#include "chromeos/services/libassistant/public/mojom/audio_output_delegate.mojom.h" #include "media/audio/audio_device_description.h" #include "media/base/limits.h" #include "services/media_session/public/mojom/media_session.mojom.h" @@ -15,6 +15,15 @@ namespace chromeos { namespace assistant { +// A macro which ensures we are running on the background thread. +#define ENSURE_BACKGROUND_THREAD(method, ...) \ + if (!background_task_runner_->RunsTasksInCurrentSequence()) { \ + background_task_runner_->PostTask( \ + FROM_HERE, \ + base::BindOnce(method, weak_factory_.GetWeakPtr(), ##__VA_ARGS__)); \ + return; \ + } + namespace { // The reduced audio (the ducked track) volume level while listening to user @@ -85,7 +94,7 @@ } void AudioDeviceOwner::StartOnMainThread( - AssistantMediaSession* media_session, + chromeos::libassistant::mojom::AudioOutputDelegate* audio_output_delegate, assistant_client::AudioOutput::Delegate* delegate, mojo::PendingRemote<audio::mojom::StreamFactory> stream_factory, const assistant_client::OutputStreamFormat& format) { @@ -121,8 +130,9 @@ background_task_runner_->PostTask( FROM_HERE, base::BindOnce(&AudioDeviceOwner::StartDeviceOnBackgroundThread, - base::Unretained(this), std::move(stream_factory), - media_session)); + base::Unretained(this), std::move(stream_factory))); + audio_output_delegate->AddMediaSessionObserver( + session_receiver_.BindNewPipeAndPassRemote()); } } @@ -139,7 +149,8 @@ void AudioDeviceOwner::MediaSessionInfoChanged( media_session::mojom::MediaSessionInfoPtr info) { // |output_device_| is only accessed on background thread. - DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); + ENSURE_BACKGROUND_THREAD(&AudioDeviceOwner::MediaSessionInfoChanged, + std::move(info)); // We only handle media ducking case here as intended. Other media // operactions, such as pausing and resuming, are handled by Libassistant @@ -153,14 +164,11 @@ } void AudioDeviceOwner::StartDeviceOnBackgroundThread( - mojo::PendingRemote<audio::mojom::StreamFactory> stream_factory, - AssistantMediaSession* media_session) { + mojo::PendingRemote<audio::mojom::StreamFactory> stream_factory) { DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); output_device_ = std::make_unique<audio::OutputDevice>( std::move(stream_factory), audio_param_, this, device_id_); output_device_->Play(); - - media_session->AddObserver(session_receiver_.BindNewPipeAndPassRemote()); } int AudioDeviceOwner::Render(base::TimeDelta delay,
diff --git a/chromeos/services/assistant/platform/audio_device_owner.h b/chromeos/services/assistant/platform/audio_device_owner.h index 20c105c2..010fc3c 100644 --- a/chromeos/services/assistant/platform/audio_device_owner.h +++ b/chromeos/services/assistant/platform/audio_device_owner.h
@@ -11,7 +11,7 @@ #include "base/component_export.h" #include "base/macros.h" -#include "chromeos/services/assistant/media_session/assistant_media_session.h" +#include "chromeos/services/libassistant/public/mojom/audio_output_delegate.mojom-forward.h" #include "libassistant/shared/public/platform_audio_output.h" #include "media/base/audio_block_fifo.h" #include "media/base/audio_parameters.h" @@ -19,6 +19,7 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "services/audio/public/cpp/output_device.h" #include "services/audio/public/mojom/stream_factory.mojom.h" +#include "services/media_session/public/mojom/media_session.mojom.h" namespace chromeos { namespace assistant { @@ -34,7 +35,7 @@ ~AudioDeviceOwner() override; void StartOnMainThread( - AssistantMediaSession* media_session, + chromeos::libassistant::mojom::AudioOutputDelegate* audio_output_delegate, assistant_client::AudioOutput::Delegate* delegate, mojo::PendingRemote<audio::mojom::StreamFactory> stream_factory, const assistant_client::OutputStreamFormat& format); @@ -70,8 +71,7 @@ private: void StartDeviceOnBackgroundThread( - mojo::PendingRemote<audio::mojom::StreamFactory> stream_factory, - AssistantMediaSession* media_session); + mojo::PendingRemote<audio::mojom::StreamFactory> stream_factory); // Requests assistant to fill buffer with more data. void ScheduleFillLocked(const base::TimeTicks& time); @@ -103,6 +103,7 @@ mojo::Receiver<media_session::mojom::MediaSessionObserver> session_receiver_{ this}; + base::WeakPtrFactory<AudioDeviceOwner> weak_factory_{this}; DISALLOW_COPY_AND_ASSIGN(AudioDeviceOwner); };
diff --git a/chromeos/services/assistant/platform/audio_output_delegate_impl.cc b/chromeos/services/assistant/platform/audio_output_delegate_impl.cc new file mode 100644 index 0000000..f650424 --- /dev/null +++ b/chromeos/services/assistant/platform/audio_output_delegate_impl.cc
@@ -0,0 +1,54 @@ +// Copyright 2021 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 "chromeos/services/assistant/platform/audio_output_delegate_impl.h" +#include "chromeos/services/assistant/media_session/assistant_media_session.h" + +namespace chromeos { +namespace assistant { + +AudioOutputDelegateImpl::AudioOutputDelegateImpl( + AssistantMediaSession* media_session) + : media_session_(media_session) {} + +AudioOutputDelegateImpl::~AudioOutputDelegateImpl() = default; + +void AudioOutputDelegateImpl::RequestAudioFocus( + libassistant::mojom::AudioOutputStreamType stream_type) { + // TODO(wutao): Fix the libassistant behavior. + // Currently this is called with |STREAM_TTS| and |STREAM_ALARM| when + // requesting focus. When releasing focus it calls with |STREAM_MEDIA|. + // libassistant media code path does not request focus. + switch (stream_type) { + case libassistant::mojom::AudioOutputStreamType::kAlarmStream: + media_session_->RequestAudioFocus( + media_session::mojom::AudioFocusType::kGainTransientMayDuck); + break; + case libassistant::mojom::AudioOutputStreamType::kTtsStream: + media_session_->RequestAudioFocus( + media_session::mojom::AudioFocusType::kGainTransient); + break; + case libassistant::mojom::AudioOutputStreamType::kMediaStream: + media_session_->AbandonAudioFocusIfNeeded(); + break; + } +} + +void AudioOutputDelegateImpl::AbandonAudioFocusIfNeeded() { + media_session_->AbandonAudioFocusIfNeeded(); +} + +void AudioOutputDelegateImpl::AddMediaSessionObserver( + mojo::PendingRemote<::media_session::mojom::MediaSessionObserver> + observer) { + media_session_->AddObserver(std::move(observer)); +} + +mojo::PendingRemote<chromeos::libassistant::mojom::AudioOutputDelegate> +AudioOutputDelegateImpl::BindNewPipeAndPassRemote() { + return receiver_.BindNewPipeAndPassRemote(); +} + +} // namespace assistant +} // namespace chromeos
diff --git a/chromeos/services/assistant/platform/audio_output_delegate_impl.h b/chromeos/services/assistant/platform/audio_output_delegate_impl.h new file mode 100644 index 0000000..55d36ad --- /dev/null +++ b/chromeos/services/assistant/platform/audio_output_delegate_impl.h
@@ -0,0 +1,45 @@ +// Copyright 2021 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 CHROMEOS_SERVICES_ASSISTANT_PLATFORM_AUDIO_OUTPUT_DELEGATE_IMPL_H_ +#define CHROMEOS_SERVICES_ASSISTANT_PLATFORM_AUDIO_OUTPUT_DELEGATE_IMPL_H_ + +#include "chromeos/services/libassistant/public/mojom/audio_output_delegate.mojom.h" + +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/receiver.h" + +namespace chromeos { +namespace assistant { + +class AssistantMediaSession; + +class AudioOutputDelegateImpl + : public chromeos::libassistant::mojom::AudioOutputDelegate { + public: + explicit AudioOutputDelegateImpl(AssistantMediaSession* media_session); + AudioOutputDelegateImpl(const AudioOutputDelegateImpl&) = delete; + AudioOutputDelegateImpl& operator=(const AudioOutputDelegateImpl&) = delete; + ~AudioOutputDelegateImpl() override; + + // libassistant::mojom::AudioOutputDelegate implementation: + void RequestAudioFocus( + libassistant::mojom::AudioOutputStreamType stream_type) override; + void AbandonAudioFocusIfNeeded() override; + void AddMediaSessionObserver( + mojo::PendingRemote<::media_session::mojom::MediaSessionObserver> + observer) override; + + mojo::PendingRemote<chromeos::libassistant::mojom::AudioOutputDelegate> + BindNewPipeAndPassRemote(); + + private: + mojo::Receiver<AudioOutputDelegate> receiver_{this}; + AssistantMediaSession* const media_session_; +}; +} // namespace assistant + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_ASSISTANT_PLATFORM_AUDIO_OUTPUT_DELEGATE_IMPL_H_
diff --git a/chromeos/services/assistant/platform/audio_output_provider_impl.cc b/chromeos/services/assistant/platform/audio_output_provider_impl.cc index 3d1553f5..f6e29b5a 100644 --- a/chromeos/services/assistant/platform/audio_output_provider_impl.cc +++ b/chromeos/services/assistant/platform/audio_output_provider_impl.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/memory/weak_ptr.h" -#include "chromeos/services/assistant/media_session/assistant_media_session.h" #include "chromeos/services/assistant/platform/audio_stream_handler.h" #include "chromeos/services/assistant/public/mojom/assistant_audio_decoder.mojom.h" #include "chromeos/services/libassistant/public/mojom/platform_delegate.mojom.h" @@ -35,7 +34,7 @@ scoped_refptr<base::SequencedTaskRunner> task_runner, scoped_refptr<base::SequencedTaskRunner> background_task_runner, mojom::AssistantAudioDecoderFactory* audio_decoder_factory, - AssistantMediaSession* media_session, + chromeos::libassistant::mojom::AudioOutputDelegate* audio_output_delegate, assistant_client::OutputStreamType type, assistant_client::OutputStreamFormat format, const std::string& device_id) @@ -43,7 +42,7 @@ main_task_runner_(task_runner), background_thread_task_runner_(background_task_runner), audio_decoder_factory_(audio_decoder_factory), - media_session_(media_session), + audio_output_delegate_(audio_output_delegate), stream_type_(type), format_(format), audio_stream_handler_( @@ -70,52 +69,49 @@ assistant_client::OutputStreamType GetType() override { return stream_type_; } void Start(assistant_client::AudioOutput::Delegate* delegate) override { - // TODO(llin): Remove getting audio focus here after libassistant handles - // acquiring audio focus for the internal media player. - if (stream_type_ == assistant_client::OutputStreamType::STREAM_MEDIA) { - main_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&AssistantMediaSession::RequestAudioFocus, - media_session_->GetWeakPtr(), - media_session::mojom::AudioFocusType::kGain)); - } - - if (IsEncodedFormat(format_)) { - main_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - &AudioStreamHandler::StartAudioDecoder, - base::Unretained(audio_stream_handler_.get()), - audio_decoder_factory_, delegate, - base::BindOnce(&AudioDeviceOwner::StartOnMainThread, - base::Unretained(device_owner_.get()), - media_session_, audio_stream_handler_.get(), - std::move(stream_factory_)))); - } else { - main_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&AudioDeviceOwner::StartOnMainThread, - base::Unretained(device_owner_.get()), media_session_, - delegate, std::move(stream_factory_), format_)); - } + main_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&AudioOutputImpl::StartOnMainThread, + weak_ptr_factory_.GetWeakPtr(), delegate)); } void Stop() override { + main_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&AudioOutputImpl::StopOnMainThread, + weak_ptr_factory_.GetWeakPtr())); + } + + private: + void StartOnMainThread(assistant_client::AudioOutput::Delegate* delegate) { + // TODO(llin): Remove getting audio focus here after libassistant handles + // acquiring audio focus for the internal media player. + if (stream_type_ == assistant_client::OutputStreamType::STREAM_MEDIA) { + audio_output_delegate_->RequestAudioFocus( + chromeos::libassistant::mojom::AudioOutputStreamType::kMediaStream); + } + + if (IsEncodedFormat(format_)) { + audio_stream_handler_->StartAudioDecoder( + audio_decoder_factory_, delegate, + base::BindOnce(&AudioDeviceOwner::StartOnMainThread, + base::Unretained(device_owner_.get()), + audio_output_delegate_, audio_stream_handler_.get(), + std::move(stream_factory_))); + } else { + device_owner_->StartOnMainThread(audio_output_delegate_, delegate, + std::move(stream_factory_), format_); + } + } + + void StopOnMainThread() { // TODO(llin): Remove abandoning audio focus here after libassistant handles // abandoning audio focus for the internal media player. if (stream_type_ == assistant_client::OutputStreamType::STREAM_MEDIA) { - main_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&AssistantMediaSession::AbandonAudioFocusIfNeeded, - media_session_->GetWeakPtr())); + audio_output_delegate_->AbandonAudioFocusIfNeeded(); } if (IsEncodedFormat(format_)) { device_owner_->SetDelegate(nullptr); - main_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&AudioStreamHandler::OnStopped, - base::Unretained(audio_stream_handler_.get()))); + audio_stream_handler_->OnStopped(); } else { background_thread_task_runner_->PostTask( FROM_HERE, base::BindOnce(&AudioDeviceOwner::StopOnBackgroundThread, @@ -123,35 +119,37 @@ } } - private: mojo::PendingRemote<audio::mojom::StreamFactory> stream_factory_; scoped_refptr<base::SequencedTaskRunner> main_task_runner_; scoped_refptr<base::SequencedTaskRunner> background_thread_task_runner_; mojom::AssistantAudioDecoderFactory* audio_decoder_factory_; - AssistantMediaSession* media_session_; + chromeos::libassistant::mojom::AudioOutputDelegate* const + audio_output_delegate_; const assistant_client::OutputStreamType stream_type_; assistant_client::OutputStreamFormat format_; std::unique_ptr<AudioStreamHandler> audio_stream_handler_; - std::unique_ptr<AudioDeviceOwner> device_owner_; + base::WeakPtrFactory<AudioOutputImpl> weak_ptr_factory_{this}; + DISALLOW_COPY_AND_ASSIGN(AudioOutputImpl); }; } // namespace AudioOutputProviderImpl::AudioOutputProviderImpl( - AssistantMediaSession* media_session, + mojo::PendingRemote<chromeos::libassistant::mojom::AudioOutputDelegate> + audio_output_delegate, chromeos::libassistant::mojom::PlatformDelegate* platform_delegate, scoped_refptr<base::SequencedTaskRunner> background_task_runner, const std::string& device_id) : platform_delegate_(platform_delegate), - media_session_(media_session), + audio_output_delegate_(std::move(audio_output_delegate)), loop_back_input_(platform_delegate_, media::AudioDeviceDescription::kLoopbackInputDeviceId), - volume_control_impl_(media_session, platform_delegate), + volume_control_impl_(audio_output_delegate_.get(), platform_delegate), main_task_runner_(base::SequencedTaskRunnerHandle::Get()), background_task_runner_(background_task_runner), device_id_(device_id) { @@ -172,10 +170,10 @@ stream_factory.InitWithNewPipeAndPassReceiver())); // Owned by one arbitrary thread inside libassistant. It will be destroyed // once assistant_client::AudioOutput::Delegate::OnStopped() is called. - return new AudioOutputImpl(std::move(stream_factory), main_task_runner_, - background_task_runner_, - audio_decoder_factory_.get(), media_session_, type, - stream_format, device_id_); + return new AudioOutputImpl( + std::move(stream_factory), main_task_runner_, background_task_runner_, + audio_decoder_factory_.get(), audio_output_delegate_.get(), type, + stream_format, device_id_); } std::vector<assistant_client::OutputStreamEncoding>
diff --git a/chromeos/services/assistant/platform/audio_output_provider_impl.h b/chromeos/services/assistant/platform/audio_output_provider_impl.h index 579b38d6..2a8b21e 100644 --- a/chromeos/services/assistant/platform/audio_output_provider_impl.h +++ b/chromeos/services/assistant/platform/audio_output_provider_impl.h
@@ -18,6 +18,7 @@ #include "chromeos/services/assistant/platform/volume_control_impl.h" #include "chromeos/services/assistant/public/cpp/assistant_service.h" #include "chromeos/services/assistant/public/mojom/assistant_audio_decoder.mojom.h" +#include "chromeos/services/libassistant/public/mojom/audio_output_delegate.mojom.h" #include "chromeos/services/libassistant/public/mojom/platform_delegate.mojom-forward.h" #include "libassistant/shared/public/platform_audio_output.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -28,12 +29,11 @@ namespace assistant { -class AssistantMediaSession; - class AudioOutputProviderImpl : public assistant_client::AudioOutputProvider { public: AudioOutputProviderImpl( - AssistantMediaSession* media_session, + mojo::PendingRemote<chromeos::libassistant::mojom::AudioOutputDelegate> + audio_output_delegate, chromeos::libassistant::mojom::PlatformDelegate* platform_delegate, scoped_refptr<base::SequencedTaskRunner> background_task_runner, const std::string& device_id); @@ -62,8 +62,9 @@ // Owned by |AssistantManagerServiceImpl|. chromeos::libassistant::mojom::PlatformDelegate* const platform_delegate_; - // Owned by |AssistantManagerServiceImpl|. - AssistantMediaSession* media_session_; + + mojo::Remote<chromeos::libassistant::mojom::AudioOutputDelegate> + audio_output_delegate_; AudioInputImpl loop_back_input_; VolumeControlImpl volume_control_impl_;
diff --git a/chromeos/services/assistant/platform/audio_output_provider_impl_unittest.cc b/chromeos/services/assistant/platform/audio_output_provider_impl_unittest.cc index 917cca33..003ed99 100644 --- a/chromeos/services/assistant/platform/audio_output_provider_impl_unittest.cc +++ b/chromeos/services/assistant/platform/audio_output_provider_impl_unittest.cc
@@ -13,10 +13,7 @@ #include "base/run_loop.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "chromeos/services/assistant/fake_assistant_manager_service_impl.h" -#include "chromeos/services/assistant/media_host.h" -#include "chromeos/services/assistant/media_session/assistant_media_session.h" -#include "chromeos/services/assistant/test_support/scoped_assistant_client.h" +#include "chromeos/services/assistant/platform/audio_output_delegate_impl.h" #include "libassistant/shared/public/platform_audio_output.h" #include "media/base/audio_bus.h" #include "media/base/bind_to_current_loop.h" @@ -65,7 +62,7 @@ void set_num_of_bytes_to_fill(int bytes) { num_bytes_to_fill_ = bytes; } void Reset() { - run_loop_.reset(new base::RunLoop()); + run_loop_ = std::make_unique<base::RunLoop>(); quit_closure_ = media::BindToCurrentLoop(run_loop_->QuitClosure()); } @@ -81,6 +78,24 @@ DISALLOW_COPY_AND_ASSIGN(FakeAudioOutputDelegate); }; +class FakeAudioOutputDelegateMojom + : public chromeos::libassistant::mojom::AudioOutputDelegate { + public: + FakeAudioOutputDelegateMojom() = default; + FakeAudioOutputDelegateMojom(const FakeAudioOutputDelegateMojom&) = delete; + FakeAudioOutputDelegateMojom& operator=(const FakeAudioOutputDelegateMojom&) = + delete; + ~FakeAudioOutputDelegateMojom() override = default; + + // libassistant::mojom::AudioOutputDelegate implementation: + void RequestAudioFocus( + libassistant::mojom::AudioOutputStreamType stream_type) override {} + void AbandonAudioFocusIfNeeded() override {} + void AddMediaSessionObserver( + mojo::PendingRemote<::media_session::mojom::MediaSessionObserver> + observer) override {} +}; + class AssistantAudioDeviceOwnerTest : public testing::Test { public: AssistantAudioDeviceOwnerTest() @@ -97,7 +112,8 @@ }; TEST_F(AssistantAudioDeviceOwnerTest, BufferFilling) { - FakeAudioOutputDelegate delegate; + FakeAudioOutputDelegateMojom audio_output_delegate_mojom; + FakeAudioOutputDelegate audio_output_delegate; auto audio_bus = media::AudioBus::Create(2, 4480); assistant_client::OutputStreamFormat format{ assistant_client::OutputStreamEncoding::STREAM_PCM_S16, @@ -105,36 +121,32 @@ 2 // pcm_num_channels, }; - delegate.set_num_of_bytes_to_fill(200); - delegate.Reset(); - ScopedAssistantClient client; - MediaHost media_host(AssistantClient::Get(), - /*interaction_subscribers=*/nullptr); - AssistantMediaSession media_session(&media_host); + audio_output_delegate.set_num_of_bytes_to_fill(200); + audio_output_delegate.Reset(); auto owner = std::make_unique<AudioDeviceOwner>( base::SequencedTaskRunnerHandle::Get(), base::SequencedTaskRunnerHandle::Get(), "test device"); // Upon start, it will start to fill the buffer. - owner->StartOnMainThread(&media_session, &delegate, mojo::NullRemote(), - format); - delegate.Wait(); + owner->StartOnMainThread(&audio_output_delegate_mojom, &audio_output_delegate, + mojo::NullRemote(), format); + audio_output_delegate.Wait(); - delegate.Reset(); + audio_output_delegate.Reset(); audio_bus->Zero(); // On first render, it will push the data to |audio_bus|. The fill should // stop by now. owner->Render(base::TimeDelta::FromMicroseconds(0), base::TimeTicks::Now(), 0, audio_bus.get()); - delegate.Wait(); + audio_output_delegate.Wait(); EXPECT_FALSE(audio_bus->AreFramesZero()); - EXPECT_FALSE(delegate.end_of_stream()); + EXPECT_FALSE(audio_output_delegate.end_of_stream()); // The subsequent Render call will detect no data available and notify // delegate for OnEndOfStream(). owner->Render(base::TimeDelta::FromMicroseconds(0), base::TimeTicks::Now(), 0, audio_bus.get()); - EXPECT_TRUE(delegate.end_of_stream()); + EXPECT_TRUE(audio_output_delegate.end_of_stream()); } } // namespace assistant
diff --git a/chromeos/services/assistant/platform/volume_control_impl.cc b/chromeos/services/assistant/platform/volume_control_impl.cc index 46ba999c..cb8ca7a0 100644 --- a/chromeos/services/assistant/platform/volume_control_impl.cc +++ b/chromeos/services/assistant/platform/volume_control_impl.cc
@@ -7,22 +7,43 @@ #include <utility> #include "ash/public/mojom/assistant_volume_control.mojom.h" -#include "chromeos/services/assistant/media_session/assistant_media_session.h" #include "chromeos/services/libassistant/public/mojom/platform_delegate.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" +#include "mojo/public/cpp/bindings/type_converter.h" +using chromeos::libassistant::mojom::AudioOutputStreamType; + +namespace mojo { +template <> +struct TypeConverter<AudioOutputStreamType, + assistant_client::OutputStreamType> { + static AudioOutputStreamType Convert( + const assistant_client::OutputStreamType& input) { + using assistant_client::OutputStreamType; + switch (input) { + case OutputStreamType::STREAM_ALARM: + return AudioOutputStreamType::kAlarmStream; + case OutputStreamType::STREAM_TTS: + return AudioOutputStreamType::kTtsStream; + case OutputStreamType::STREAM_MEDIA: + return AudioOutputStreamType::kMediaStream; + } + } +}; + +} // namespace mojo namespace chromeos { namespace assistant { VolumeControlImpl::VolumeControlImpl( - AssistantMediaSession* media_session, - chromeos::libassistant::mojom::PlatformDelegate* delegate) - : media_session_(media_session), + chromeos::libassistant::mojom::AudioOutputDelegate* audio_output_delegate, + chromeos::libassistant::mojom::PlatformDelegate* platform_delegate) + : audio_output_delegate_(audio_output_delegate), main_task_runner_(base::SequencedTaskRunnerHandle::Get()), weak_factory_(this) { - delegate->BindAssistantVolumeControl( + platform_delegate->BindAssistantVolumeControl( volume_control_.BindNewPipeAndPassReceiver()); mojo::PendingRemote<ash::mojom::VolumeObserver> observer; receiver_.Bind(observer.InitWithNewPipeAndPassReceiver()); @@ -79,23 +100,8 @@ void VolumeControlImpl::SetAudioFocusOnMainThread( assistant_client::OutputStreamType focused_stream) { DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); - // TODO(wutao): Fix the libassistant behavior. - // Currently this is called with |STREAM_TTS| and |STREAM_ALARM| when - // requesting focus. When releasing focus it calls with |STREAM_MEDIA|. - // libassistant media code path does not request focus. - switch (focused_stream) { - case assistant_client::OutputStreamType::STREAM_ALARM: - media_session_->RequestAudioFocus( - media_session::mojom::AudioFocusType::kGainTransientMayDuck); - break; - case assistant_client::OutputStreamType::STREAM_TTS: - media_session_->RequestAudioFocus( - media_session::mojom::AudioFocusType::kGainTransient); - break; - case assistant_client::OutputStreamType::STREAM_MEDIA: - media_session_->AbandonAudioFocusIfNeeded(); - break; - } + audio_output_delegate_->RequestAudioFocus( + mojo::ConvertTo<AudioOutputStreamType>(focused_stream)); } void VolumeControlImpl::SetSystemVolumeOnMainThread(float new_volume,
diff --git a/chromeos/services/assistant/platform/volume_control_impl.h b/chromeos/services/assistant/platform/volume_control_impl.h index 0d097f9..f076486 100644 --- a/chromeos/services/assistant/platform/volume_control_impl.h +++ b/chromeos/services/assistant/platform/volume_control_impl.h
@@ -7,6 +7,7 @@ #include "ash/public/mojom/assistant_volume_control.mojom.h" #include "base/macros.h" +#include "chromeos/services/libassistant/public/mojom/audio_output_delegate.mojom.h" #include "chromeos/services/libassistant/public/mojom/platform_delegate.mojom-forward.h" #include "libassistant/shared/public/platform_audio_output.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -15,13 +16,12 @@ namespace chromeos { namespace assistant { -class AssistantMediaSession; - class VolumeControlImpl : public assistant_client::VolumeControl, public ash::mojom::VolumeObserver { public: - VolumeControlImpl(AssistantMediaSession* media_session, - chromeos::libassistant::mojom::PlatformDelegate* delegate); + VolumeControlImpl( + chromeos::libassistant::mojom::AudioOutputDelegate* audio_output_delegate, + chromeos::libassistant::mojom::PlatformDelegate* platform_delegate); ~VolumeControlImpl() override; // assistant_client::VolumeControl overrides: @@ -44,7 +44,9 @@ void SetSystemVolumeOnMainThread(float new_volume, bool user_initiated); void SetSystemMutedOnMainThread(bool muted); - AssistantMediaSession* const media_session_; + // Owned by |AudioOutputProviderImpl|. + chromeos::libassistant::mojom::AudioOutputDelegate* const + audio_output_delegate_; mojo::Remote<ash::mojom::AssistantVolumeControl> volume_control_; mojo::Receiver<ash::mojom::VolumeObserver> receiver_{this}; scoped_refptr<base::SequencedTaskRunner> main_task_runner_;
diff --git a/chromeos/services/assistant/platform_api_impl.cc b/chromeos/services/assistant/platform_api_impl.cc index 6e6fe2b3..3d9fa9d 100644 --- a/chromeos/services/assistant/platform_api_impl.cc +++ b/chromeos/services/assistant/platform_api_impl.cc
@@ -8,7 +8,6 @@ #include <utility> #include <vector> -#include "chromeos/services/assistant/media_session/assistant_media_session.h" #include "chromeos/services/assistant/platform/audio_devices.h" #include "chromeos/services/assistant/public/cpp/features.h" #include "chromeos/services/assistant/public/cpp/migration/audio_input_host.h" @@ -31,12 +30,13 @@ //////////////////////////////////////////////////////////////////////////////// PlatformApiImpl::PlatformApiImpl( - AssistantMediaSession* media_session, + mojo::PendingRemote<chromeos::libassistant::mojom::AudioOutputDelegate> + audio_output_delegate, chromeos::libassistant::mojom::PlatformDelegate* platform_delegate, PowerManagerClient* power_manager_client, scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner, scoped_refptr<base::SingleThreadTaskRunner> background_task_runner) - : audio_output_provider_(media_session, + : audio_output_provider_(std::move(audio_output_delegate), platform_delegate, background_task_runner, media::AudioDeviceDescription::kDefaultDeviceId),
diff --git a/chromeos/services/assistant/platform_api_impl.h b/chromeos/services/assistant/platform_api_impl.h index bf54f52e..e18b2a1 100644 --- a/chromeos/services/assistant/platform_api_impl.h +++ b/chromeos/services/assistant/platform_api_impl.h
@@ -14,6 +14,7 @@ #include "chromeos/services/assistant/platform/network_provider_impl.h" #include "chromeos/services/assistant/public/cpp/assistant_service.h" #include "chromeos/services/assistant/public/cpp/migration/cros_platform_api.h" +#include "chromeos/services/libassistant/public/mojom/audio_output_delegate.mojom-forward.h" #include "chromeos/services/libassistant/public/mojom/platform_delegate.mojom-forward.h" #include "libassistant/shared/public/platform_auth.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -23,13 +24,12 @@ namespace assistant { -class AssistantMediaSession; - // Platform API required by the voice assistant. class PlatformApiImpl : public CrosPlatformApi { public: PlatformApiImpl( - AssistantMediaSession* media_session, + mojo::PendingRemote<chromeos::libassistant::mojom::AudioOutputDelegate> + audio_output_delegate, chromeos::libassistant::mojom::PlatformDelegate* platform_delegate, PowerManagerClient* power_manager_client, scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner,
diff --git a/chromeos/services/assistant/public/cpp/migration/assistant_manager_service_delegate.h b/chromeos/services/assistant/public/cpp/migration/assistant_manager_service_delegate.h index ad74d24..8d17ed01 100644 --- a/chromeos/services/assistant/public/cpp/migration/assistant_manager_service_delegate.h +++ b/chromeos/services/assistant/public/cpp/migration/assistant_manager_service_delegate.h
@@ -9,6 +9,7 @@ #include "base/single_thread_task_runner.h" #include "chromeos/services/libassistant/public/mojom/audio_input_controller.mojom-forward.h" +#include "chromeos/services/libassistant/public/mojom/audio_output_delegate.mojom-forward.h" #include "chromeos/services/libassistant/public/mojom/platform_delegate.mojom-forward.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -21,7 +22,6 @@ namespace chromeos { namespace assistant { -class AssistantMediaSession; class AudioInputHost; class CrosPlatformApi; @@ -41,7 +41,8 @@ pending_remote) = 0; virtual std::unique_ptr<CrosPlatformApi> CreatePlatformApi( - AssistantMediaSession* media_session, + mojo::PendingRemote<chromeos::libassistant::mojom::AudioOutputDelegate> + audio_output_delegate, chromeos::libassistant::mojom::PlatformDelegate* platform_delegate, scoped_refptr<base::SingleThreadTaskRunner> background_thread_task_runner) = 0;
diff --git a/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.cc b/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.cc index 2297ede..bcc33a4e5 100644 --- a/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.cc +++ b/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.cc
@@ -51,7 +51,8 @@ std::unique_ptr<CrosPlatformApi> FakeAssistantManagerServiceDelegate::CreatePlatformApi( - AssistantMediaSession* media_session, + mojo::PendingRemote<chromeos::libassistant::mojom::AudioOutputDelegate> + audio_output_delegate, chromeos::libassistant::mojom::PlatformDelegate* platform_delegate, scoped_refptr<base::SingleThreadTaskRunner> background_thread_task_runner) { return std::make_unique<FakePlatformApi>();
diff --git a/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.h b/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.h index 91977c9..868c879 100644 --- a/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.h +++ b/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.h
@@ -32,7 +32,8 @@ mojo::PendingRemote<chromeos::libassistant::mojom::AudioInputController> pending_remote) override; std::unique_ptr<CrosPlatformApi> CreatePlatformApi( - AssistantMediaSession* media_session, + mojo::PendingRemote<chromeos::libassistant::mojom::AudioOutputDelegate> + audio_output_delegate, chromeos::libassistant::mojom::PlatformDelegate* platform_delegate, scoped_refptr<base::SingleThreadTaskRunner> background_thread_task_runner) override;
diff --git a/chromeos/services/libassistant/DEPS b/chromeos/services/libassistant/DEPS index 3bf1447..9db3e98e 100644 --- a/chromeos/services/libassistant/DEPS +++ b/chromeos/services/libassistant/DEPS
@@ -7,6 +7,7 @@ "+media/base", "+services/audio/public", "+services/device/public/mojom", + "+services/media_session/public/mojom", "+services/network/public", "+services/network/test", ]
diff --git a/chromeos/services/libassistant/public/mojom/BUILD.gn b/chromeos/services/libassistant/public/mojom/BUILD.gn index eaff391..5d9d155 100644 --- a/chromeos/services/libassistant/public/mojom/BUILD.gn +++ b/chromeos/services/libassistant/public/mojom/BUILD.gn
@@ -10,6 +10,7 @@ sources = [ "android_app_info.mojom", "audio_input_controller.mojom", + "audio_output_delegate.mojom", "conversation_controller.mojom", "display_controller.mojom", "media_controller.mojom", @@ -25,6 +26,7 @@ "//chromeos/services/network_config/public/mojom", "//services/audio/public/mojom", "//services/device/public/mojom", + "//services/media_session/public/mojom", "//services/network/public/mojom", ]
diff --git a/chromeos/services/libassistant/public/mojom/audio_output_delegate.mojom b/chromeos/services/libassistant/public/mojom/audio_output_delegate.mojom new file mode 100644 index 0000000..50f74ae --- /dev/null +++ b/chromeos/services/libassistant/public/mojom/audio_output_delegate.mojom
@@ -0,0 +1,31 @@ +// Copyright 2021 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. + +module chromeos.libassistant.mojom; + +import "services/media_session/public/mojom/media_session.mojom"; + +// Interface that allows Libassistant to make audio related changes on +// ChromeOS. +interface AudioOutputDelegate { + // Called when a particular stream needs to be brought into focus. The focus + // can be set for different streams. This api also ducks the + // volume of non-focused streams to bring the current stream into focus. + RequestAudioFocus(AudioOutputStreamType stream_type); + + // Abandon the current audio focus. + AbandonAudioFocusIfNeeded(); + + // Allow Libassistant to observe media session changes. + AddMediaSessionObserver( + pending_remote<media_session.mojom.MediaSessionObserver> observer); +}; + + +// The possible types of audio output stream. +enum AudioOutputStreamType { + kAlarmStream, + kTtsStream, + kMediaStream, +};
diff --git a/chromeos/services/nearby/public/cpp/BUILD.gn b/chromeos/services/nearby/public/cpp/BUILD.gn index ecfd3a1..b4d1015 100644 --- a/chromeos/services/nearby/public/cpp/BUILD.gn +++ b/chromeos/services/nearby/public/cpp/BUILD.gn
@@ -24,6 +24,8 @@ "fake_nearby_process_manager.h", "mock_nearby_connections.cc", "mock_nearby_connections.h", + "mock_nearby_process_manager.cc", + "mock_nearby_process_manager.h", "mock_nearby_sharing_decoder.cc", "mock_nearby_sharing_decoder.h", ]
diff --git a/chromeos/services/nearby/public/cpp/mock_nearby_process_manager.cc b/chromeos/services/nearby/public/cpp/mock_nearby_process_manager.cc new file mode 100644 index 0000000..2751d5d9 --- /dev/null +++ b/chromeos/services/nearby/public/cpp/mock_nearby_process_manager.cc
@@ -0,0 +1,21 @@ +// Copyright 2021 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 "chromeos/services/nearby/public/cpp/mock_nearby_process_manager.h" + +namespace chromeos { +namespace nearby { + +MockNearbyProcessManager::MockNearbyProcessManager() = default; + +MockNearbyProcessManager::~MockNearbyProcessManager() = default; + +MockNearbyProcessManager::MockNearbyProcessReference:: + MockNearbyProcessReference() = default; + +MockNearbyProcessManager::MockNearbyProcessReference:: + ~MockNearbyProcessReference() = default; + +} // namespace nearby +} // namespace chromeos
diff --git a/chromeos/services/nearby/public/cpp/mock_nearby_process_manager.h b/chromeos/services/nearby/public/cpp/mock_nearby_process_manager.h new file mode 100644 index 0000000..9dd66cf --- /dev/null +++ b/chromeos/services/nearby/public/cpp/mock_nearby_process_manager.h
@@ -0,0 +1,55 @@ +// Copyright 2021 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 CHROMEOS_SERVICES_NEARBY_PUBLIC_CPP_MOCK_NEARBY_PROCESS_MANAGER_H_ +#define CHROMEOS_SERVICES_NEARBY_PUBLIC_CPP_MOCK_NEARBY_PROCESS_MANAGER_H_ + +#include "base/bind.h" +#include "base/callback_forward.h" +#include "base/callback_helpers.h" +#include "chromeos/services/nearby/public/cpp/nearby_process_manager.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace chromeos { +namespace nearby { + +class MockNearbyProcessManager : public NearbyProcessManager { + public: + class MockNearbyProcessReference : public NearbyProcessReference { + public: + MockNearbyProcessReference(); + MockNearbyProcessReference(const MockNearbyProcessReference&) = delete; + MockNearbyProcessReference& operator=(const MockNearbyProcessReference&) = + delete; + ~MockNearbyProcessReference() override; + + MOCK_METHOD(const mojo::SharedRemote< + location::nearby::connections::mojom::NearbyConnections>&, + GetNearbyConnections, + (), + (const, override)); + + MOCK_METHOD(const mojo::SharedRemote<sharing::mojom::NearbySharingDecoder>&, + GetNearbySharingDecoder, + (), + (const, override)); + }; + + MockNearbyProcessManager(); + MockNearbyProcessManager(const MockNearbyProcessManager&) = delete; + MockNearbyProcessManager& operator=(const MockNearbyProcessManager&) = delete; + ~MockNearbyProcessManager() override; + + MOCK_METHOD(std::unique_ptr<NearbyProcessReference>, + GetNearbyProcessReference, + (base::OnceClosure on_process_stopped_callback), + (override)); + + MOCK_METHOD(void, Shutdown, (), (override)); +}; + +} // namespace nearby +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_NEARBY_PUBLIC_CPP_MOCK_NEARBY_PROCESS_MANAGER_H_
diff --git a/chromeos/services/network_config/BUILD.gn b/chromeos/services/network_config/BUILD.gn index 31fc049..1f73bbf9 100644 --- a/chromeos/services/network_config/BUILD.gn +++ b/chromeos/services/network_config/BUILD.gn
@@ -13,6 +13,7 @@ deps = [ "//base", "//chromeos/components/sync_wifi:network_eligibility_checker", + "//chromeos/dbus/hermes", "//chromeos/login/login_state", "//chromeos/network", "//chromeos/services/network_config/public/cpp", @@ -21,6 +22,7 @@ "//components/onc", "//components/proxy_config", "//components/user_manager", + "//dbus", "//net", ] }
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc index 09ffef0b..fc4d1e8 100644 --- a/chromeos/services/network_config/cros_network_config.cc +++ b/chromeos/services/network_config/cros_network_config.cc
@@ -9,6 +9,8 @@ #include "base/optional.h" #include "base/strings/string_util.h" #include "chromeos/components/sync_wifi/network_eligibility_checker.h" +#include "chromeos/dbus/hermes/hermes_euicc_client.h" +#include "chromeos/dbus/hermes/hermes_manager_client.h" #include "chromeos/login/login_state/login_state.h" #include "chromeos/network/device_state.h" #include "chromeos/network/managed_network_configuration_handler.h" @@ -417,6 +419,14 @@ return result; } +mojom::SIMInfoPtr HermesSimPropertiesToMojo( + HermesEuiccClient::Properties* properties) { + auto sim_info = mojom::SIMInfo::New(); + sim_info->eid = properties->eid().value(); + sim_info->slot_id = properties->physical_slot().value(); + return sim_info; +} + mojom::DeviceStatePropertiesPtr DeviceStateToMojo( const DeviceState* device, mojom::DeviceStateType technology_state) { @@ -453,6 +463,20 @@ sim_lock_status->retries_left = device->sim_retries_left(); result->sim_lock_status = std::move(sim_lock_status); } + if (type == mojom::NetworkType::kCellular) { + // TODO(hsuregan): Once Shill exposes a SIMInfo array of dictionaries, which + // may contain incomplete info about the different slots, use + // HermesManagerClient::Get()->GetAvailableEuiccs() to fill in the missing + // info to make sure eid is always populated for eSIM slots. This addition + // added preemptively to unblock UI work. + std::vector<mojom::SIMInfoPtr> sim_infos; + for (auto& euicc_path : HermesManagerClient::Get()->GetAvailableEuiccs()) { + HermesEuiccClient::Properties* properties = + HermesEuiccClient::Get()->GetProperties(euicc_path); + sim_infos.push_back(HermesSimPropertiesToMojo(properties)); + } + result->sim_infos = std::move(sim_infos); + } return result; }
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 65ab4da..025abdf 100644 --- a/chromeos/services/network_config/public/mojom/cros_network_config.mojom +++ b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
@@ -124,6 +124,17 @@ int32 retries_left; }; +// Details about a sim slot available on the device. +struct SIMInfo { + // Slot identifier. + uint32 slot_id; + // EID of EUICC at this slot. Empty if this is a physical SIM slot. + string eid; + // TODO(hsuregan): Add ICCID of the eSIM profile or the physical SIM + // card active on this slot when available from Shill. + // string iccid; +}; + struct CellularStateProperties { // Enumerated ONC activation state. ActivationStateType activation_state = kUnknown; @@ -229,6 +240,9 @@ bool scanning = false; // The SIM lock status if Type = Cellular and a SIM is present. SIMLockStatus? sim_lock_status; + // Details about the physical SIM and eSIM available on the device if Type = + // Cellular. Note that the array will be ordered by the |slot_id|. + array<SIMInfo>? sim_infos; // True when a SIM is required and not present. bool sim_absent = false; DeviceStateType device_state;
diff --git a/chromeos/services/network_health/public/mojom/network_health.mojom b/chromeos/services/network_health/public/mojom/network_health.mojom index a6c6581..d0dfefc 100644 --- a/chromeos/services/network_health/public/mojom/network_health.mojom +++ b/chromeos/services/network_health/public/mojom/network_health.mojom
@@ -54,6 +54,13 @@ // considered potentially problematic for the connection. See // src/platform2/shill/doc/service-api.txt for more details. UInt32Value? signal_strength; + // Optional string for the network's ipv4_address. This is only intended to be + // used for display and is not meant to be parsed. + string? ipv4_address; + // Optional list of strings for the network's ipv6_addresses. A single network + // can have multiple addresses (local, global, temporary etc.). This is only + // intended to be used for display and is not meant to be parsed. + array<string> ipv6_addresses; }; // Aggregate structure for all of the network health state.
diff --git a/chromeos/settings/system_settings_provider.cc b/chromeos/settings/system_settings_provider.cc index 4cd9393..127cebd 100644 --- a/chromeos/settings/system_settings_provider.cc +++ b/chromeos/settings/system_settings_provider.cc
@@ -15,7 +15,7 @@ namespace chromeos { namespace { // TODO(olsen): PerUserTimeZoneEnabled and FineGrainedTimeZoneDetectionEnabled -// are duplicated in chrome/browser/chromeos/system/timezone_util.cc, which +// are duplicated in chrome/browser/ash/system/timezone_util.cc, which // is not visible from this package. Try to re-unify these functions by moving // timezone_util to src/chromeos too (out of src/chrome/browser).
diff --git a/chromeos/strings/chromeos_strings_af.xtb b/chromeos/strings/chromeos_strings_af.xtb index 92a9464..e964d814 100644 --- a/chromeos/strings/chromeos_strings_af.xtb +++ b/chromeos/strings/chromeos_strings_af.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Resolusie</translation> <translation id="3941014780699102620">Kon nie gasheer bepaal nie</translation> <translation id="3942420633017001071">Diagnostiese inligting</translation> +<translation id="3967822245660637423">Aflaai is voltooi</translation> <translation id="397105322502079400">Bereken tans …</translation> <translation id="39823212440917567">Druktake ouer as <ph name="NUMBER_OF_DAYS" /> dae sal verwyder word</translation> <translation id="4003384961948020559">Misluk – Uitvoer is vol</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Skandering is voltooi. 1 bladsy is geskandeer}other{Skandering is voltooi. {NUMBER_OF_PAGES} bladsye is geskandeer}}</translation> +<translation id="7449585358422953039">Bestuur deur <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Portaal is bespeur</translation> <translation id="7487067081878637334">Tegnologie</translation> <translation id="7490813197707563893">MAC-adres</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Geen naambedieners gekry nie</translation> <translation id="7960831585769876809">Temperatuur</translation> <translation id="7994702968232966508">EAP-metode</translation> +<translation id="802154636333426148">Kon nie aflaai nie</translation> <translation id="8041089156583427627">Stuur terugvoer</translation> <translation id="8075838845814659848">Oorblywende batterykrag</translation> <translation id="808894953321890993">Verander wagwoord</translation>
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb index 1b0a1e57..dacc221 100644 --- a/chromeos/strings/chromeos_strings_am.xtb +++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">የምስል ጥራት</translation> <translation id="3941014780699102620">ለአስተናጋጅ መፍትሔ መስጠት አልተሳካም</translation> <translation id="3942420633017001071">ምርመራ</translation> +<translation id="3967822245660637423">ማውረድ ተጠናቅቋል</translation> <translation id="397105322502079400">በማስላት ላይ...</translation> <translation id="39823212440917567">ከ<ph name="NUMBER_OF_DAYS" /> ቀኖች በላይ ዕድሜ ያላቸው የህትመት ሥራዎች ይወገዳሉ</translation> <translation id="4003384961948020559">አልተሳካም - ውፅዓት ሞልቷል</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">ምንም የስም አገልጋዮች አልተገኙም</translation> <translation id="7960831585769876809">የሙቀት መጠን</translation> <translation id="7994702968232966508">የEAP ስልት</translation> +<translation id="802154636333426148">ማውረድ አልተሳካም</translation> <translation id="8041089156583427627">ግብረ መልስ ላክ</translation> <translation id="8075838845814659848">የሚቀረው ኃይል መሙላት</translation> <translation id="808894953321890993">የይለፍ ቃል ለውጥ</translation>
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb index dadf69ed..dc6043c 100644 --- a/chromeos/strings/chromeos_strings_ar.xtb +++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">درجة الدقة</translation> <translation id="3941014780699102620">تعذّرت مطابقة المضيف.</translation> <translation id="3942420633017001071">بيانات التشخيص</translation> +<translation id="3967822245660637423">اكتمل التنزيل</translation> <translation id="397105322502079400">جارٍ الحساب...</translation> <translation id="39823212440917567">ستتم إزالة طلبات الطباعة التي مرَّ عليها أكثر من <ph name="NUMBER_OF_DAYS" /> يوم.</translation> <translation id="4003384961948020559">تعذّرت الطباعة - المخرجات ممتلئة</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{اكتمل المسح الضوئي. تم مسح صفحة واحدة ضوئيًا.}zero{اكتمل المسح الضوئي. تم مسح {NUMBER_OF_PAGES} صفحة ضوئيًا.}two{اكتمل المسح الضوئي. تم مسح صفحتَين ({NUMBER_OF_PAGES}) ضوئيًا.}few{اكتمل المسح الضوئي. تم مسح {NUMBER_OF_PAGES} صفحات ضوئيًا.}many{اكتمل المسح الضوئي. تم مسح {NUMBER_OF_PAGES} صفحة ضوئيًا.}other{اكتمل المسح الضوئي. تم مسح {NUMBER_OF_PAGES} صفحة ضوئيًا.}}</translation> +<translation id="7449585358422953039">تتم إدارة الجهاز من خلال <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">تم رصد مدخل.</translation> <translation id="7487067081878637334">التقنية</translation> <translation id="7490813197707563893">عنوان MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">لم يتم العثور على خوادم الأسماء.</translation> <translation id="7960831585769876809">درجة الحرارة</translation> <translation id="7994702968232966508">طريقة EAP</translation> +<translation id="802154636333426148">تعذّر التنزيل</translation> <translation id="8041089156583427627">إرسال تعليقات</translation> <translation id="8075838845814659848">شحن البطارية المتبقي</translation> <translation id="808894953321890993">تغيير كلمة المرور</translation>
diff --git a/chromeos/strings/chromeos_strings_as.xtb b/chromeos/strings/chromeos_strings_as.xtb index 6a237b0..5b31a447 100644 --- a/chromeos/strings/chromeos_strings_as.xtb +++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">ৰিজ'লিউশ্বন</translation> <translation id="3941014780699102620">হ’ষ্ট সম্পৰ্কীয় সমস্যা সমাধান কৰাত বিফল হ'ল</translation> <translation id="3942420633017001071">ডায়েগনষ্টিক্স</translation> +<translation id="3967822245660637423">ডাউনল’ড সম্পূৰ্ণ হ’ল</translation> <translation id="397105322502079400">গণনা কৰি থকা হৈছে…</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> দিনতকৈ পুৰণি প্ৰিণ্টৰ কামসমূহ আঁতৰোৱা হ’ব</translation> <translation id="4003384961948020559">বিফল হৈছে - আউটপুট ভৰ্তি হৈ গৈছে</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{স্কেনিং সম্পূৰ্ণ হ’ল। ১ খন পৃষ্ঠা স্কেন কৰা হ’ল}one{স্কেনিং সম্পূৰ্ণ হ’ল। {NUMBER_OF_PAGES} খন পৃষ্ঠা স্কেন কৰা হ’ল}other{স্কেনিং সম্পূৰ্ণ হ’ল। {NUMBER_OF_PAGES} খন পৃষ্ঠা স্কেন কৰা হ’ল}}</translation> +<translation id="7449585358422953039"><ph name="MANAGER" />এ পৰিচালনা কৰে।</translation> <translation id="7469648432129124067">প’ৰ্টেল চিনাক্ত কৰা হৈছে</translation> <translation id="7487067081878637334">প্ৰযুক্তিবিদ্যা</translation> <translation id="7490813197707563893">MAC ঠিকনা</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">ড’মেইন নাম থকা কোনো ছাৰ্ভাৰ পোৱা নগ'ল</translation> <translation id="7960831585769876809">তাপমান</translation> <translation id="7994702968232966508">ই.এ.পি. পদ্ধতি</translation> +<translation id="802154636333426148">ডাউনল’ড কৰিব পৰা নগ’ল</translation> <translation id="8041089156583427627">মতামত পঠিয়াওক</translation> <translation id="8075838845814659848">বাকী থকা চাৰ্জ</translation> <translation id="808894953321890993">পাছৱৰ্ড সলনি কৰক</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb index faf56362..ff61fdc 100644 --- a/chromeos/strings/chromeos_strings_az.xtb +++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -90,6 +90,7 @@ <translation id="315738237743207937">Avtorizasiya portalı aşkarlanıb</translation> <translation id="3188257591659621405">Fayllarım</translation> <translation id="3199982728237701504">Sənəd Bəsləyici (İki tərəfli)</translation> +<translation id="3226405216343213872">Skanerlər axtarılır</translation> <translation id="3246869037381808805">1 gündən köhnə çap işləri silinəcək</translation> <translation id="3268178239013324452">Alınmadı - Qapı açıqdır</translation> <translation id="3310640316857623290">DNS gecikməsi icazə verilən həddən xeyli yuxarıdır</translation> @@ -117,6 +118,7 @@ <translation id="3865414814144988605">Dəqiqlik</translation> <translation id="3941014780699102620">Hostu həll etmək alınmadı</translation> <translation id="3942420633017001071">Diaqnostika</translation> +<translation id="3967822245660637423">Endirmə tamamdır</translation> <translation id="397105322502079400">Hesablanır...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> gündən köhnə çap işləri silinəcək</translation> <translation id="4003384961948020559">Alınmadı - Çap xidməti doludur</translation> @@ -302,6 +304,7 @@ <translation id="7936303884198020182">Ad serveri tapılmadı</translation> <translation id="7960831585769876809">Temperatur</translation> <translation id="7994702968232966508">EAP üsulu</translation> +<translation id="802154636333426148">Endirmə alınmadı</translation> <translation id="8041089156583427627">Geri Əlaqə Göndərin</translation> <translation id="8075838845814659848">Qalan şarj</translation> <translation id="808894953321890993">Parolu dəyişin</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb index 44622e7..fef5cb8 100644 --- a/chromeos/strings/chromeos_strings_be.xtb +++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Раздзяляльнасць</translation> <translation id="3941014780699102620">Не ўдалося супаставіць хост</translation> <translation id="3942420633017001071">Дыягностыка</translation> +<translation id="3967822245660637423">Спампоўка завершана</translation> <translation id="397105322502079400">Ідзе разлік...</translation> <translation id="39823212440917567">Заданні друку, старэйшыя за <ph name="NUMBER_OF_DAYS" /> сут, будуць выдалены</translation> <translation id="4003384961948020559">Збой: выхадны латок запоўнены</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Сканіраванне завершана. Адсканіравана 1 старонка}one{Сканіраванне завершана. Адсканіравана {NUMBER_OF_PAGES} старонка}few{Сканіраванне завершана. Адсканіравана {NUMBER_OF_PAGES} старонкі}many{Сканіраванне завершана. Адсканіравана {NUMBER_OF_PAGES} старонак}other{Сканіраванне завершана. Адсканіравана {NUMBER_OF_PAGES} старонкі}}</translation> +<translation id="7449585358422953039">Прыладай кіруе <ph name="MANAGER" /></translation> <translation id="7469648432129124067">Выяўлены партал</translation> <translation id="7487067081878637334">Тэхналогія</translation> <translation id="7490813197707563893">MAC-адрас</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Серверы даменных імён не знойдзены</translation> <translation id="7960831585769876809">Тэмпература</translation> <translation id="7994702968232966508">Метад EAP</translation> +<translation id="802154636333426148">Збой спампоўкі</translation> <translation id="8041089156583427627">Адправіць водгук</translation> <translation id="8075838845814659848">Узровень зараду акумулятара</translation> <translation id="808894953321890993">Змяніць пароль</translation>
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb index 95b63d6..5168c55 100644 --- a/chromeos/strings/chromeos_strings_bg.xtb +++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Разделителна способност</translation> <translation id="3941014780699102620">Името на хоста не бе преобразувано</translation> <translation id="3942420633017001071">Диагностика</translation> +<translation id="3967822245660637423">Изтеглянето завърши</translation> <translation id="397105322502079400">Изчислява се...</translation> <translation id="39823212440917567">Заданията за отпечатване, по-стари от <ph name="NUMBER_OF_DAYS" /> дни, ще бъдат премахнати</translation> <translation id="4003384961948020559">Неуспешно – изходният контейнер е пълен</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Сканирането завърши. Сканирана бе 1 страница}other{Сканирането завърши. Сканирани бяха {NUMBER_OF_PAGES} страници}}</translation> +<translation id="7449585358422953039">Управлява се от <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Открит е портал</translation> <translation id="7487067081878637334">Технологии</translation> <translation id="7490813197707563893">MAC адрес</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Не са намерени сървъри за имена</translation> <translation id="7960831585769876809">Температура</translation> <translation id="7994702968232966508">Метод с EAP</translation> +<translation id="802154636333426148">Изтеглянето не бе успешно</translation> <translation id="8041089156583427627">Изпращане на отзивите</translation> <translation id="8075838845814659848">Оставащ заряд</translation> <translation id="808894953321890993">Промяна на паролата</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb index d344736..c47097e 100644 --- a/chromeos/strings/chromeos_strings_bn.xtb +++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -90,6 +90,7 @@ <translation id="315738237743207937">অন্তরীণ পোর্টাল শনাক্ত করা হয়েছে</translation> <translation id="3188257591659621405">আমার ফাইল</translation> <translation id="3199982728237701504">ডকুমেন্ট ফিডার (দুই পিঠের)</translation> +<translation id="3226405216343213872">স্ক্যানার খোঁজা হচ্ছে</translation> <translation id="3246869037381808805">১ দিনের বেশি পুরনো প্রিন্ট জব সরিয়ে দেওয়া হবে</translation> <translation id="3268178239013324452">প্রিন্ট করা যায়নি - প্রিন্টারের ঢাকনা ভাল করে বন্ধ করা হয়নি</translation> <translation id="3310640316857623290">যতদূর পর্যন্ত লেটেন্সির ঊর্ধ্বসীমা অনুমোদন করা যায়, ডিএনএস লেটেন্সি উল্লেখযোগ্যভাবে তার চেয়ে বেশি</translation> @@ -117,6 +118,7 @@ <translation id="3865414814144988605">রেজোলিউশন</translation> <translation id="3941014780699102620">হোস্ট নেম যাচাই করা যায়নি</translation> <translation id="3942420633017001071">ডায়গনিস্টিক</translation> +<translation id="3967822245660637423">ডাউনলোড সম্পূর্ণ</translation> <translation id="397105322502079400">গণনা করা হচ্ছে...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> দিনের বেশি পুরনো প্রিন্ট জব সরিয়ে দেওয়া হবে</translation> <translation id="4003384961948020559">প্রিন্ট করা যায়নি - আউটপুট বিন ভর্তি হয়ে গেছে</translation> @@ -302,6 +304,7 @@ <translation id="7936303884198020182">ডোমেন নেম সার্ভার খুঁজে পাওয়া যায়নি</translation> <translation id="7960831585769876809">তাপমাত্রা</translation> <translation id="7994702968232966508">EAP পদ্ধতি</translation> +<translation id="802154636333426148">ডাউনলোড করা যায়নি</translation> <translation id="8041089156583427627">প্রতিক্রিয়া পাঠান</translation> <translation id="8075838845814659848">বাকি থাকা চার্জ</translation> <translation id="808894953321890993">পাসওয়ার্ড পরিবর্তন করুন</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb index 9f1e5b14..b81f994 100644 --- a/chromeos/strings/chromeos_strings_bs.xtb +++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Rezolucija</translation> <translation id="3941014780699102620">Rješavanje hosta nije uspjelo</translation> <translation id="3942420633017001071">Dijagnostika</translation> +<translation id="3967822245660637423">Preuzimanje je završeno</translation> <translation id="397105322502079400">Računanje…</translation> <translation id="39823212440917567">Zadaci za štampanje stariji od <ph name="NUMBER_OF_DAYS" /> dana će se ukloniti</translation> <translation id="4003384961948020559">Nije uspjelo – izlaz je pun</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Skeniranje je završeno. Skenirana je 1 stranica}one{Skeniranje je završeno. Skenirana je {NUMBER_OF_PAGES} stranica}few{Skeniranje je završeno. Skenirane su {NUMBER_OF_PAGES} stranice}other{Skeniranje je završeno. Skenirano je {NUMBER_OF_PAGES} stranica}}</translation> +<translation id="7449585358422953039">Uređajem upravlja <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Otkriven je portal</translation> <translation id="7487067081878637334">Tehnologija</translation> <translation id="7490813197707563893">MAC adresa</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Nije pronađen nijedan server naziva</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">EAP metoda</translation> +<translation id="802154636333426148">Preuzimanje nije uspjelo</translation> <translation id="8041089156583427627">Slanje povratnih informacija</translation> <translation id="8075838845814659848">Preostali nivo napunjenosti</translation> <translation id="808894953321890993">Promijenite lozinku</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb index a2700f8..9d78387 100644 --- a/chromeos/strings/chromeos_strings_ca.xtb +++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Resolució</translation> <translation id="3941014780699102620">No s'ha pogut resoldre l'amfitrió</translation> <translation id="3942420633017001071">Diagnòstic</translation> +<translation id="3967822245660637423">S'ha completat la baixada</translation> <translation id="397105322502079400">S’està calculant...</translation> <translation id="39823212440917567">Se suprimiran les tasques d'impressió amb una antiguitat superior a <ph name="NUMBER_OF_DAYS" /> dies</translation> <translation id="4003384961948020559">Error: safata de sortida plena</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{S'ha completat l'escaneig. S'ha escanejat 1 pàgina}other{S'ha completat l'escaneig. S'han escanejat {NUMBER_OF_PAGES} pàgines}}</translation> +<translation id="7449585358422953039">Gestionat per <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">S'ha detectat un portal</translation> <translation id="7487067081878637334">Tecnologia</translation> <translation id="7490813197707563893">Adreça MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">No s'han trobat servidors de noms</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">Mètode EAP</translation> +<translation id="802154636333426148">Error de baixada</translation> <translation id="8041089156583427627">Envia suggeriments</translation> <translation id="8075838845814659848">Càrrega restant</translation> <translation id="808894953321890993">Canvia la contrasenya</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb index aebd18b..cdf145e 100644 --- a/chromeos/strings/chromeos_strings_cs.xtb +++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Rozlišení</translation> <translation id="3941014780699102620">Hostitele se nepodařilo vyřešit</translation> <translation id="3942420633017001071">Diagnostika</translation> +<translation id="3967822245660637423">Stahování bylo dokončeno</translation> <translation id="397105322502079400">Probíhá výpočet…</translation> <translation id="39823212440917567">Tiskové úlohy starší než <ph name="NUMBER_OF_DAYS" /> dní budou odstraněny</translation> <translation id="4003384961948020559">Tisk selhal – výstupní zásobník je plný</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Skenování bylo dokončeno. Naskenována 1 stránka}few{Skenování bylo dokončeno. Naskenovány {NUMBER_OF_PAGES} stránky}many{Skenování bylo dokončeno. Naskenováno {NUMBER_OF_PAGES} stránky}other{Skenování bylo dokončeno. Naskenováno {NUMBER_OF_PAGES} stránek}}</translation> +<translation id="7449585358422953039">Spravováno administrátorem <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Byl zjištěn portál</translation> <translation id="7487067081878637334">Technologie</translation> <translation id="7490813197707563893">Adresa MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Nebyly nalezeny žádné názvové servery</translation> <translation id="7960831585769876809">Teplota</translation> <translation id="7994702968232966508">Metoda EAP</translation> +<translation id="802154636333426148">Stažení se nezdařilo</translation> <translation id="8041089156583427627">Odeslat svůj názor</translation> <translation id="8075838845814659848">Zbývající kapacita</translation> <translation id="808894953321890993">Změnit heslo</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb index 9f702089..ce030a0d 100644 --- a/chromeos/strings/chromeos_strings_da.xtb +++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Opløsning</translation> <translation id="3941014780699102620">Der kunne ikke identificeres en host</translation> <translation id="3942420633017001071">Diagnostik</translation> +<translation id="3967822245660637423">Download fuldført</translation> <translation id="397105322502079400">Beregner...</translation> <translation id="39823212440917567">Udskriftsjobs, der er ældre end <ph name="NUMBER_OF_DAYS" /> dage, fjernes</translation> <translation id="4003384961948020559">Handlingen mislykkedes – Fuld udskriftsbakke</translation> @@ -278,6 +279,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Scanningen er gennemført. 1 side blev scannet}one{Scanningen er gennemført. {NUMBER_OF_PAGES} side blev scannet}other{Scanningen er gennemført. {NUMBER_OF_PAGES} sider blev scannet}}</translation> +<translation id="7449585358422953039">Administreres af <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">En portal blev registreret</translation> <translation id="7487067081878637334">Teknologi</translation> <translation id="7490813197707563893">MAC-adresse</translation> @@ -302,6 +304,7 @@ <translation id="7936303884198020182">Der blev ikke fundet nogen navneservere</translation> <translation id="7960831585769876809">Temperatur</translation> <translation id="7994702968232966508">EAP-metode</translation> +<translation id="802154636333426148">Download mislykkedes</translation> <translation id="8041089156583427627">Send feedback</translation> <translation id="8075838845814659848">Resterende batteriniveau</translation> <translation id="808894953321890993">Skift adgangskode</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb index 4692e55..c638805 100644 --- a/chromeos/strings/chromeos_strings_de.xtb +++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Auflösung</translation> <translation id="3941014780699102620">Host konnte nicht aufgelöst werden</translation> <translation id="3942420633017001071">Diagnose</translation> +<translation id="3967822245660637423">Download abgeschlossen</translation> <translation id="397105322502079400">Wird berechnet...</translation> <translation id="39823212440917567">Druckaufträge, die älter als <ph name="NUMBER_OF_DAYS" /> Tage sind, werden entfernt</translation> <translation id="4003384961948020559">Fehlgeschlagen – Ausgabefach ist voll</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Scan abgeschlossen. 1 Seite gescannt.}other{Scan abgeschlossen. {NUMBER_OF_PAGES} Seiten gescannt.}}</translation> +<translation id="7449585358422953039">Verwaltet von <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Portal erkannt</translation> <translation id="7487067081878637334">Technik</translation> <translation id="7490813197707563893">MAC-Adresse</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Es wurden keine Nameserver gefunden</translation> <translation id="7960831585769876809">Temperatur</translation> <translation id="7994702968232966508">EAP-Methode</translation> +<translation id="802154636333426148">Downloadfehler</translation> <translation id="8041089156583427627">Feedback geben</translation> <translation id="8075838845814659848">Akkustand</translation> <translation id="808894953321890993">Passwort ändern</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb index 83871b9a..095393ef 100644 --- a/chromeos/strings/chromeos_strings_el.xtb +++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Ανάλυση</translation> <translation id="3941014780699102620">Αποτυχία επίλυσης κεντρικού υπολογιστή</translation> <translation id="3942420633017001071">Διαγνωστικά</translation> +<translation id="3967822245660637423">Ολοκλήρωση λήψης</translation> <translation id="397105322502079400">Υπολογισμός…</translation> <translation id="39823212440917567">Οι εργασίες εκτύπωσης που είναι παλαιότερες των <ph name="NUMBER_OF_DAYS" /> ημερών θα καταργηθούν.</translation> <translation id="4003384961948020559">Σφάλμα - Το σημείο εξόδου είναι γεμάτο</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Η σάρωση ολοκληρώθηκε. Σαρώθηκε 1 σελίδα.}other{Η σάρωση ολοκληρώθηκε. Σαρώθηκαν {NUMBER_OF_PAGES} σελίδες.}}</translation> +<translation id="7449585358422953039">Η διαχείριση γίνεται από <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Εντοπίστηκε πύλη</translation> <translation id="7487067081878637334">Τεχνολογία</translation> <translation id="7490813197707563893">Διεύθυνση MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Δεν βρέθηκαν διακομιστές ονομάτων.</translation> <translation id="7960831585769876809">Θερμοκρασία</translation> <translation id="7994702968232966508">Μέθοδος EAP</translation> +<translation id="802154636333426148">Η λήψη απέτυχε</translation> <translation id="8041089156583427627">Αποστολή σχολίων</translation> <translation id="8075838845814659848">Υπόλοιπο φόρτισης</translation> <translation id="808894953321890993">Αλλαγή κωδικού πρόσβασης</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb index 4c7fe02..6780920 100644 --- a/chromeos/strings/chromeos_strings_en-GB.xtb +++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Resolution</translation> <translation id="3941014780699102620">Failed to resolve host</translation> <translation id="3942420633017001071">Diagnostics</translation> +<translation id="3967822245660637423">Download complete</translation> <translation id="397105322502079400">Calculating...</translation> <translation id="39823212440917567">Print jobs older than <ph name="NUMBER_OF_DAYS" /> days will be removed</translation> <translation id="4003384961948020559">Failed – Output full</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">No name servers found</translation> <translation id="7960831585769876809">Temperature</translation> <translation id="7994702968232966508">EAP method</translation> +<translation id="802154636333426148">Download failed</translation> <translation id="8041089156583427627">Send Feedback</translation> <translation id="8075838845814659848">Remaining charge</translation> <translation id="808894953321890993">Change password</translation>
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb index 10d90f1..b9b177d 100644 --- a/chromeos/strings/chromeos_strings_es-419.xtb +++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -90,6 +90,7 @@ <translation id="315738237743207937">Se detectó un portal cautivo.</translation> <translation id="3188257591659621405">Mis archivos</translation> <translation id="3199982728237701504">Alimentador de documentos (dos caras)</translation> +<translation id="3226405216343213872">Buscando escáneres</translation> <translation id="3246869037381808805">Se quitarán los trabajos de impresión que tengan más de 1 día</translation> <translation id="3268178239013324452">Error: La tapa está abierta</translation> <translation id="3310640316857623290">La latencia de DNS supera significativamente el umbral permitido</translation> @@ -117,6 +118,7 @@ <translation id="3865414814144988605">Resolución</translation> <translation id="3941014780699102620">no se pudo resolver el host</translation> <translation id="3942420633017001071">Diagnóstico</translation> +<translation id="3967822245660637423">Descarga completa</translation> <translation id="397105322502079400">Calculando...</translation> <translation id="39823212440917567">Se quitarán los trabajos de impresión que tengan más de <ph name="NUMBER_OF_DAYS" /> días</translation> <translation id="4003384961948020559">Error: La bandeja de salida está llena</translation> @@ -279,6 +281,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Se completó el escaneo. Se escaneó 1 página}other{Se completó el escaneo. Se escanearon {NUMBER_OF_PAGES} páginas}}</translation> +<translation id="7449585358422953039">Administrado por <ph name="MANAGER" /></translation> <translation id="7469648432129124067">Se detectó un portal</translation> <translation id="7487067081878637334">Tecnología</translation> <translation id="7490813197707563893">Dirección MAC</translation> @@ -303,6 +306,7 @@ <translation id="7936303884198020182">no se encontraron servidores de nombres</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">Método EAP</translation> +<translation id="802154636333426148">Error en la descarga</translation> <translation id="8041089156583427627">Enviar comentario</translation> <translation id="8075838845814659848">Carga restante</translation> <translation id="808894953321890993">Cambiar contraseña</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb index d8f4530f..111469e 100644 --- a/chromeos/strings/chromeos_strings_es.xtb +++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Resolución</translation> <translation id="3941014780699102620">No se ha podido resolver el host</translation> <translation id="3942420633017001071">Diagnósticos</translation> +<translation id="3967822245660637423">Descarga completa</translation> <translation id="397105322502079400">Calculando...</translation> <translation id="39823212440917567">Los trabajos de impresión con más de <ph name="NUMBER_OF_DAYS" /> días de antigüedad se eliminarán</translation> <translation id="4003384961948020559">No se ha podido imprimir - Salida llena</translation> @@ -302,6 +303,7 @@ <translation id="7936303884198020182">No se han encontrado servidores de nombres</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">Método EAP</translation> +<translation id="802154636333426148">No se ha podido descargar el archivo</translation> <translation id="8041089156583427627">Enviar</translation> <translation id="8075838845814659848">Carga restante</translation> <translation id="808894953321890993">Cambiar contraseña</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index 1b1f0a69..177d05a 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Eraldusvõime</translation> <translation id="3941014780699102620">Hosti lahendamine ebaõnnestus</translation> <translation id="3942420633017001071">Diagnostika</translation> +<translation id="3967822245660637423">Allalaadimine on lõpule viidud</translation> <translation id="397105322502079400">Arvutamine ...</translation> <translation id="39823212440917567">Prinditööd, mis on vanemad kui <ph name="NUMBER_OF_DAYS" /> päeva, eemaldatakse</translation> <translation id="4003384961948020559">Ebaõnnestus – väljastusala on täis</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">Ei leitud ühtegi nimeserverit</translation> <translation id="7960831585769876809">Temperatuur</translation> <translation id="7994702968232966508">EAP meetod</translation> +<translation id="802154636333426148">Allalaadimine ebaõnnestus</translation> <translation id="8041089156583427627">Saada tagasiside</translation> <translation id="8075838845814659848">Aku laetuse tase</translation> <translation id="808894953321890993">Muuda parooli</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb index 634956bf..c922583 100644 --- a/chromeos/strings/chromeos_strings_eu.xtb +++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Bereizmena</translation> <translation id="3941014780699102620">Ezin izan da ebatzi ostalaria</translation> <translation id="3942420633017001071">Diagnostikoak</translation> +<translation id="3967822245660637423">Deskargatzen amaitu da</translation> <translation id="397105322502079400">Kalkulatzen…</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> egun baino gehiagoko inprimatze-lanak kendu egingo dira</translation> <translation id="4003384961948020559">Hutsegitea - Irteera-erretilua beteta dago</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Amaitu da eskaneatzen. 1 orri eskaneatu da.}other{Amaitu da eskaneatzen. {NUMBER_OF_PAGES} orri eskaneatu dira.}}</translation> +<translation id="7449585358422953039"><ph name="MANAGER" /> da kudeatzailea.</translation> <translation id="7469648432129124067">Ataria hauteman da</translation> <translation id="7487067081878637334">Teknologia</translation> <translation id="7490813197707563893">MAC helbidea</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Ez da aurkitu izenen zerbitzaririk</translation> <translation id="7960831585769876809">Tenperatura</translation> <translation id="7994702968232966508">EAP metodoa</translation> +<translation id="802154636333426148">Ezin izan da deskargatu</translation> <translation id="8041089156583427627">Bidali oharrak</translation> <translation id="8075838845814659848">Geratzen den bateria</translation> <translation id="808894953321890993">Aldatu pasahitza</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb index 7ae688b..22b1b45 100644 --- a/chromeos/strings/chromeos_strings_fa.xtb +++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">وضوح</translation> <translation id="3941014780699102620">حل کردن میزبان انجام نشد</translation> <translation id="3942420633017001071">تشخیص خطا</translation> +<translation id="3967822245660637423">بارگیری کامل شد</translation> <translation id="397105322502079400">در حال محاسبه…</translation> <translation id="39823212440917567">کارهای چاپ قدیمیتر از <ph name="NUMBER_OF_DAYS" /> روز برداشته میشوند</translation> <translation id="4003384961948020559">انجام نشد - خروجی پُر است</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">سرور نام دامنه پیدا نشد</translation> <translation id="7960831585769876809">دما</translation> <translation id="7994702968232966508">روش EAP</translation> +<translation id="802154636333426148">بارگیری نشد</translation> <translation id="8041089156583427627">ارسال بازخورد</translation> <translation id="8075838845814659848">شارژ باقیمانده</translation> <translation id="808894953321890993">تغییر گذرواژه</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb index 43405b0e..84fbfba 100644 --- a/chromeos/strings/chromeos_strings_fi.xtb +++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Resoluutio</translation> <translation id="3941014780699102620">Isännän selvittäminen epäonnistui</translation> <translation id="3942420633017001071">Diagnostiikka</translation> +<translation id="3967822245660637423">Lataus on valmis</translation> <translation id="397105322502079400">Lasketaan...</translation> <translation id="39823212440917567">Yli <ph name="NUMBER_OF_DAYS" /> päivää vanhat tulostustyöt poistetaan</translation> <translation id="4003384961948020559">Epäonnistui – Syöte täynnä</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">Nimipalvelimia ei löydy</translation> <translation id="7960831585769876809">Lämpötila</translation> <translation id="7994702968232966508">EAP-tapa</translation> +<translation id="802154636333426148">Lataus epäonnistui.</translation> <translation id="8041089156583427627">Lähetä palautetta</translation> <translation id="8075838845814659848">Virtaa jäljellä</translation> <translation id="808894953321890993">Vaihda salasana</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb index 92a5668..f1d1c1a0 100644 --- a/chromeos/strings/chromeos_strings_fil.xtb +++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Resolution</translation> <translation id="3941014780699102620">Hindi nalutas ang host</translation> <translation id="3942420633017001071">Diagnostics</translation> +<translation id="3967822245660637423">Tapos na ang pag-download</translation> <translation id="397105322502079400">Kinakalkula...</translation> <translation id="39823212440917567">Aalisin ang mga pag-print na lampas <ph name="NUMBER_OF_DAYS" /> (na) araw na</translation> <translation id="4003384961948020559">Hindi na-print - Puno ang output</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Tapos na ang pag-scan. 1 page ang na-scan}one{Tapos na ang pag-scan. {NUMBER_OF_PAGES} page ang na-scan}other{Tapos na ang pag-scan. {NUMBER_OF_PAGES} na page ang na-scan}}</translation> +<translation id="7449585358422953039">Pinapamahalaan ng <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">May na-detect na portal</translation> <translation id="7487067081878637334">Teknolohiya</translation> <translation id="7490813197707563893">MAC address</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Walang nakitang name server</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">Pamamaraang EAP</translation> +<translation id="802154636333426148">Hindi na-download</translation> <translation id="8041089156583427627">Magpadala ng Feedback</translation> <translation id="8075838845814659848">Natitirang pag-charge</translation> <translation id="808894953321890993">Palitan ang password</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb index b16df08..5f4758d 100644 --- a/chromeos/strings/chromeos_strings_fr-CA.xtb +++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Résolution</translation> <translation id="3941014780699102620">Impossible de résoudre l'hôte</translation> <translation id="3942420633017001071">Diagnostics</translation> +<translation id="3967822245660637423">Téléchargement terminé</translation> <translation id="397105322502079400">Calcul en cours...</translation> <translation id="39823212440917567">Les tâches d'impression datant de plus de <ph name="NUMBER_OF_DAYS" /> jours seront supprimées</translation> <translation id="4003384961948020559">Échec : bac de sortie plein</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Numérisation terminée. 1 page a été numérisée.}one{Numérisation terminée. {NUMBER_OF_PAGES} page a été numérisée.}other{Numérisation terminée. {NUMBER_OF_PAGES} pages ont été numérisées.}}</translation> +<translation id="7449585358422953039">Géré par <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Portail détecté</translation> <translation id="7487067081878637334">Technologie</translation> <translation id="7490813197707563893">Adresse MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Aucun serveur de nom n'a été trouvé</translation> <translation id="7960831585769876809">Température</translation> <translation id="7994702968232966508">Méthode EAP</translation> +<translation id="802154636333426148">Échec du téléchargement</translation> <translation id="8041089156583427627">Envoyer des commentaires</translation> <translation id="8075838845814659848">Charge restante</translation> <translation id="808894953321890993">Changer le mot de passe</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb index 7d6a567..379bd29 100644 --- a/chromeos/strings/chromeos_strings_fr.xtb +++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Résolution</translation> <translation id="3941014780699102620">Impossible de résoudre l'hôte</translation> <translation id="3942420633017001071">Diagnostics</translation> +<translation id="3967822245660637423">Téléchargement terminé</translation> <translation id="397105322502079400">Calcul en cours…</translation> <translation id="39823212440917567">Les tâches d'impression de plus de <ph name="NUMBER_OF_DAYS" /> jours seront supprimées</translation> <translation id="4003384961948020559">Échec – Bac de sortie plein</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Numérisation terminée. 1 page numérisée}one{Numérisation terminée. {NUMBER_OF_PAGES} page numérisée}other{Numérisation terminée. {NUMBER_OF_PAGES} pages numérisées}}</translation> +<translation id="7449585358422953039">Géré par <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Portail détecté</translation> <translation id="7487067081878637334">Technologie</translation> <translation id="7490813197707563893">Adresse MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Aucun serveur de noms trouvé</translation> <translation id="7960831585769876809">Température</translation> <translation id="7994702968232966508">Méthode EAP</translation> +<translation id="802154636333426148">Échec du téléchargement</translation> <translation id="8041089156583427627">Envoyer</translation> <translation id="8075838845814659848">Niveau de charge</translation> <translation id="808894953321890993">Modifier le mot de passe</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb index e0e9a8c..966620d 100644 --- a/chromeos/strings/chromeos_strings_gl.xtb +++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Resolución</translation> <translation id="3941014780699102620">Produciuse un erro ao resolver o host</translation> <translation id="3942420633017001071">Diagnósticos</translation> +<translation id="3967822245660637423">Descarga completa</translation> <translation id="397105322502079400">Calculando...</translation> <translation id="39823212440917567">Quitaranse os traballos de impresión de máis de <ph name="NUMBER_OF_DAYS" /> días</translation> <translation id="4003384961948020559">Produciuse un erro: a saída da impresora está chea</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{A operación rematou. Escaneouse 1 páxina}other{A operación rematou. Escaneáronse {NUMBER_OF_PAGES} páxinas}}</translation> +<translation id="7449585358422953039">Xestionado por <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Detectouse un portal</translation> <translation id="7487067081878637334">Tecnoloxía</translation> <translation id="7490813197707563893">Enderezo MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Non se atoparon servidores de nomes</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">Método EAP</translation> +<translation id="802154636333426148">Produciuse un erro na descarga</translation> <translation id="8041089156583427627">Enviar comentarios</translation> <translation id="8075838845814659848">Carga restante</translation> <translation id="808894953321890993">Cambiar contrasinal</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb index 211af85d..e32e88d 100644 --- a/chromeos/strings/chromeos_strings_gu.xtb +++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">રિઝોલ્યુશન</translation> <translation id="3941014780699102620">હોસ્ટ રિઝોલ્વ કરવામાં નિષ્ફળ રહ્યાં</translation> <translation id="3942420633017001071">ડાયગ્નોસ્ટિક્સ</translation> +<translation id="3967822245660637423">ડાઉનલોડ પૂર્ણ</translation> <translation id="397105322502079400">ગણના કરી રહ્યું છે...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> દિવસ કરતાં જૂના પ્રિન્ટ કાર્યો કાઢી નાખવામાં આવશે</translation> <translation id="4003384961948020559">નિષ્ફળ થયું - પ્રિન્ટરનું આઉટપુટ ભરાઈ ગયું છે</translation> @@ -302,6 +303,7 @@ <translation id="7936303884198020182">IP કન્ફિગ્યુરેશનમાં કોઈ નામ સર્વર મળ્યા નથી</translation> <translation id="7960831585769876809">તાપમાન</translation> <translation id="7994702968232966508">EAP પદ્ધતિ</translation> +<translation id="802154636333426148">ડાઉનલોડ નિષ્ફળ થયું</translation> <translation id="8041089156583427627">પ્રતિસાદ મોકલો</translation> <translation id="8075838845814659848">બાકી રહેલું બૅટરી ચાર્જિંગ</translation> <translation id="808894953321890993">પાસવર્ડ બદલો</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb index 38e83822..db6726c 100644 --- a/chromeos/strings/chromeos_strings_hi.xtb +++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">रिज़ॉल्यूशन</translation> <translation id="3941014780699102620">होस्ट से जुड़ी समस्याओं को हल नहीं किया जा सका</translation> <translation id="3942420633017001071">निदान</translation> +<translation id="3967822245660637423">डाउनलोड पूरा हुआ</translation> <translation id="397105322502079400">गणना की जा रही है...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> से ज़्यादा पुरानी, प्रिंट की गई फ़ाइलों को हटा दिया जाएगा</translation> <translation id="4003384961948020559">प्रिंट नहीं हो पाया - प्रिंटर आउटपुट फ़ुल है</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{स्कैन करने की प्रोसेस पूरी हुई. 1 पेज स्कैन हो गया}one{स्कैन करने की प्रोसेस पूरी हुई. {NUMBER_OF_PAGES} पेज स्कैन हो गया}other{स्कैन करने की प्रोसेस पूरी हुई. {NUMBER_OF_PAGES} पेज स्कैन हो गए}}</translation> +<translation id="7449585358422953039"><ph name="MANAGER" /> मैनेज करता है.</translation> <translation id="7469648432129124067">पोर्टल पहचाना गया</translation> <translation id="7487067081878637334">तकनीक</translation> <translation id="7490813197707563893">MAC पता</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">कोई भी नाम सर्वर नहीं मिला</translation> <translation id="7960831585769876809">तापमान</translation> <translation id="7994702968232966508">EAP विधि</translation> +<translation id="802154636333426148">डाउनलोड विफल रहा</translation> <translation id="8041089156583427627">सुझाव भेजें</translation> <translation id="8075838845814659848">इतने प्रतिशत चार्ज होना बाकी है</translation> <translation id="808894953321890993">पासवर्ड बदलें</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 1cb9f84..6d9ef32 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -115,6 +115,7 @@ <translation id="3865414814144988605">Razlučivost</translation> <translation id="3941014780699102620">Razrješavanje hosta nije uspjelo</translation> <translation id="3942420633017001071">Dijagnostika</translation> +<translation id="3967822245660637423">Preuzimanje dovršeno</translation> <translation id="397105322502079400">Izračun u tijeku…</translation> <translation id="39823212440917567">Uklonit će se zadaci ispisa stariji od <ph name="NUMBER_OF_DAYS" /> dana</translation> <translation id="4003384961948020559">Nije uspjelo – izlaz je pun</translation> @@ -277,6 +278,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Skeniranje je dovršeno. Skenirana je jedna stranica}one{Skeniranje je dovršeno. Skenirana je {NUMBER_OF_PAGES} stranica}few{Skeniranje je dovršeno. Skenirane su {NUMBER_OF_PAGES} stranice}other{Skeniranje je dovršeno. Skenirano je {NUMBER_OF_PAGES} stranica}}</translation> +<translation id="7449585358422953039">Uređajem upravlja <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Otkriven je portal</translation> <translation id="7487067081878637334">Tehnologija</translation> <translation id="7490813197707563893">MAC adresa</translation> @@ -301,6 +303,7 @@ <translation id="7936303884198020182">Nije pronađen nijedan poslužitelj naziva</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">EAP metoda</translation> +<translation id="802154636333426148">Preuzimanje nije uspjelo</translation> <translation id="8041089156583427627">Slanje povratnih informacija</translation> <translation id="8075838845814659848">Preostala razina napunjenosti</translation> <translation id="808894953321890993">Promjena zaporke</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb index 3c39b26..ddeb06f 100644 --- a/chromeos/strings/chromeos_strings_hu.xtb +++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Felbontás</translation> <translation id="3941014780699102620">Nem sikerült a gazdagép feloldása</translation> <translation id="3942420633017001071">Diagnosztika</translation> +<translation id="3967822245660637423">A letöltés sikeres</translation> <translation id="397105322502079400">Számítás…</translation> <translation id="39823212440917567">A(z) <ph name="NUMBER_OF_DAYS" /> napnál régebbi nyomtatási feladatokat eltávolítja a rendszer</translation> <translation id="4003384961948020559">Sikertelen – Megtelt a kimenet</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Szkennelés kész. 1 oldal beolvasva}other{Szkennelés kész. {NUMBER_OF_PAGES} oldal beolvasva}}</translation> +<translation id="7449585358422953039">Kezelő: <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Portál észlelve</translation> <translation id="7487067081878637334">Technológia</translation> <translation id="7490813197707563893">MAC-cím</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Nem találhatók névszerverek</translation> <translation id="7960831585769876809">Hőmérséklet</translation> <translation id="7994702968232966508">EAP módszer</translation> +<translation id="802154636333426148">Nem sikerült a letöltés</translation> <translation id="8041089156583427627">Visszajelzés küldése</translation> <translation id="8075838845814659848">Töltöttségi szint</translation> <translation id="808894953321890993">Jelszó módosítása</translation>
diff --git a/chromeos/strings/chromeos_strings_hy.xtb b/chromeos/strings/chromeos_strings_hy.xtb index 9184e0d..7847102 100644 --- a/chromeos/strings/chromeos_strings_hy.xtb +++ b/chromeos/strings/chromeos_strings_hy.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Լուծաչափ</translation> <translation id="3941014780699102620">Չհաջողվեց ճանաչել խնամորդը</translation> <translation id="3942420633017001071">Դիագնոստիկա</translation> +<translation id="3967822245660637423">Ներբեռնումն ավարտվեց</translation> <translation id="397105322502079400">Հաշվարկում…</translation> <translation id="39823212440917567">Տպման առաջադրանքները, որոնք <ph name="NUMBER_OF_DAYS" /> օրից հին են, կհեռացվեն</translation> <translation id="4003384961948020559">Չհաջողվեց տպել – Ելքը լցված է</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Սկանավորումն ավարտվել է։ Սկանավորվել է 1 էջ։}one{Սկանավորումն ավարտվել է։ Սկանավորվել է {NUMBER_OF_PAGES} էջ։}other{Սկանավորումն ավարտվել է։ Սկանավորվել է {NUMBER_OF_PAGES} էջ։}}</translation> +<translation id="7449585358422953039">Կառավարիչ՝ <ph name="MANAGER" />։</translation> <translation id="7469648432129124067">Հայտնաբերվել է ցանցային պորտալ</translation> <translation id="7487067081878637334">Տեխնոլոգիա</translation> <translation id="7490813197707563893">MAC հասցե</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">DNS սերվերներ չեն գտնվել</translation> <translation id="7960831585769876809">Ջերմաստիճան</translation> <translation id="7994702968232966508">EAP եղանակ</translation> +<translation id="802154636333426148">Ներբեռնումը ձախողվեց</translation> <translation id="8041089156583427627">Կարծիք հայտնել</translation> <translation id="8075838845814659848">Մարտկոցի լիցքը</translation> <translation id="808894953321890993">Փոխել գաղտնաբառը</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb index c14ce1c..07fa756 100644 --- a/chromeos/strings/chromeos_strings_id.xtb +++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Resolusi</translation> <translation id="3941014780699102620">Gagal me-resolve host</translation> <translation id="3942420633017001071">Diagnosis</translation> +<translation id="3967822245660637423">Download selesai</translation> <translation id="397105322502079400">Menghitung...</translation> <translation id="39823212440917567">Tugas pencetakan yang sudah lebih dari <ph name="NUMBER_OF_DAYS" /> hari akan dihapus</translation> <translation id="4003384961948020559">Gagal - Baki hasil cetak penuh</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Pemindaian selesai. 1 halaman dipindai}other{Pemindaian selesai. {NUMBER_OF_PAGES} halaman dipindai}}</translation> +<translation id="7449585358422953039">Dikelola oleh <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Portal terdeteksi</translation> <translation id="7487067081878637334">Teknologi</translation> <translation id="7490813197707563893">Alamat MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Tidak ada server nama yang ditemukan</translation> <translation id="7960831585769876809">Suhu</translation> <translation id="7994702968232966508">Metode EAP</translation> +<translation id="802154636333426148">Download gagal</translation> <translation id="8041089156583427627">Kirim Masukan</translation> <translation id="8075838845814659848">Sisa daya baterai</translation> <translation id="808894953321890993">Ubah sandi</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb index 11005a4..4c4ecae 100644 --- a/chromeos/strings/chromeos_strings_is.xtb +++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Upplausn</translation> <translation id="3941014780699102620">Ekki tókst að ákvarða hýsil</translation> <translation id="3942420633017001071">Greining</translation> +<translation id="3967822245660637423">Niðurhali lokið</translation> <translation id="397105322502079400">Reiknar...</translation> <translation id="39823212440917567">Prentverk sem eru eldri en <ph name="NUMBER_OF_DAYS" /> verða fjarlægð</translation> <translation id="4003384961948020559">Mistókst – úttakið er fullt</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Skönnun lokið. 1 síða skönnuð}one{Skönnun lokið. {NUMBER_OF_PAGES} síða skönnuð}other{Skönnun lokið. {NUMBER_OF_PAGES} síður skannaðar}}</translation> +<translation id="7449585358422953039">Stjórnað af <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Gátt greind</translation> <translation id="7487067081878637334">Tækni</translation> <translation id="7490813197707563893">MAC-vistfang</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Engir nafnaþjónar fundust</translation> <translation id="7960831585769876809">Hitastig</translation> <translation id="7994702968232966508">EAP-aðferð</translation> +<translation id="802154636333426148">Niðurhal mistókst</translation> <translation id="8041089156583427627">Senda ábendingu</translation> <translation id="8075838845814659848">Hleðsla eftir</translation> <translation id="808894953321890993">Breyta aðgangsorði</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb index ed1cb08a..c6a62b81 100644 --- a/chromeos/strings/chromeos_strings_it.xtb +++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Risoluzione</translation> <translation id="3941014780699102620">impossibile risolvere l'host</translation> <translation id="3942420633017001071">Diagnostica</translation> +<translation id="3967822245660637423">Download completato</translation> <translation id="397105322502079400">Calcolo in corso...</translation> <translation id="39823212440917567">I processi di stampa risalenti a oltre <ph name="NUMBER_OF_DAYS" /> giorni fa verranno rimossi</translation> <translation id="4003384961948020559">Operazione non riuscita - Vassoio di uscita pieno</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Scansione completata. 1 pagina scansionata.}other{Scansione completata. {NUMBER_OF_PAGES} pagine scansionate.}}</translation> +<translation id="7449585358422953039">Gestito da <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Portale rilevato</translation> <translation id="7487067081878637334">Tecnologia</translation> <translation id="7490813197707563893">Indirizzo MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">nessun server dei nomi trovato</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">Metodo EAP</translation> +<translation id="802154636333426148">Download non riuscito</translation> <translation id="8041089156583427627">Invia feedback</translation> <translation id="8075838845814659848">Carica rimanente</translation> <translation id="808894953321890993">Cambia password</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index bdb266e7..e07df0c 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">רזולוציה</translation> <translation id="3941014780699102620">לא ניתן היה להתאים את נתוני המארח</translation> <translation id="3942420633017001071">אבחון</translation> +<translation id="3967822245660637423">ההורדה הושלמה</translation> <translation id="397105322502079400">מתבצע חישוב...</translation> <translation id="39823212440917567">משימות הדפסה בנות יותר מ-<ph name="NUMBER_OF_DAYS" /> ימים יוסרו</translation> <translation id="4003384961948020559">נכשלה – מגש הפלט מלא</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">לא נמצאו שרתי שמות</translation> <translation id="7960831585769876809">טמפרטורה</translation> <translation id="7994702968232966508">שיטת EAP</translation> +<translation id="802154636333426148">ההורדה נכשלה</translation> <translation id="8041089156583427627"> שליחת משוב</translation> <translation id="8075838845814659848">אחוז הסוללה שנותר לטעון</translation> <translation id="808894953321890993">שינוי הסיסמה</translation>
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb index b59430ad..8931170 100644 --- a/chromeos/strings/chromeos_strings_ja.xtb +++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">解像度</translation> <translation id="3941014780699102620">ホストを解決できませんでした</translation> <translation id="3942420633017001071">診断</translation> +<translation id="3967822245660637423">ダウンロード完了</translation> <translation id="397105322502079400">計算しています...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> 日より前の印刷ジョブは削除されます</translation> <translation id="4003384961948020559">失敗 - 出力がいっぱいです</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">ネームサーバーが見つかりませんでした</translation> <translation id="7960831585769876809">温度</translation> <translation id="7994702968232966508">EAP 方式</translation> +<translation id="802154636333426148">ダウンロード エラー</translation> <translation id="8041089156583427627">フィードバックを送信</translation> <translation id="8075838845814659848">バッテリー残量</translation> <translation id="808894953321890993">パスワードの変更</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb index fbdec67..6997a51 100644 --- a/chromeos/strings/chromeos_strings_ka.xtb +++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">გარჩევადობა</translation> <translation id="3941014780699102620">ჰოსტის გარდაქმნა ვერ მოხერხდა</translation> <translation id="3942420633017001071">დიაგნოსტიკა</translation> +<translation id="3967822245660637423">ჩამოტვირთვა დასრულდა</translation> <translation id="397105322502079400">ანგარიშობს…</translation> <translation id="39823212440917567">ბეჭდვის <ph name="NUMBER_OF_DAYS" /> დღეზე ძველი დავალებები ამოიშლება</translation> <translation id="4003384961948020559">ვერ მოხერხდა — გამომტანი სავსეა</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{სკანირება დასრულდა. დასკანირდა 1 გვერდი.}other{სკანირება დასრულდა. დასკანირდა {NUMBER_OF_PAGES} გვერდი.}}</translation> +<translation id="7449585358422953039">მართავს <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">აღმოჩენილია პორტალი</translation> <translation id="7487067081878637334">ტექნოლოგია</translation> <translation id="7490813197707563893">MAC მისამართი</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">სახელების სერვერი ვერ მოიძებნა</translation> <translation id="7960831585769876809">ტემპერატურა</translation> <translation id="7994702968232966508">EAP მეთოდი</translation> +<translation id="802154636333426148">ჩამოტვირთვა ვერ მოხერხდა</translation> <translation id="8041089156583427627">გამოხმაურება</translation> <translation id="8075838845814659848">დარჩენილი მუხტი</translation> <translation id="808894953321890993">პაროლის შეცვლა</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb index ee03198..bd3c9f9e 100644 --- a/chromeos/strings/chromeos_strings_kk.xtb +++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Ажыратымдылық</translation> <translation id="3941014780699102620">Хост атауы түрлендірілмеді.</translation> <translation id="3942420633017001071">Диагностика</translation> +<translation id="3967822245660637423">Жүктеп алынды</translation> <translation id="397105322502079400">Есептелуде…</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> күннен асқан баспа жұмыстары өшіріледі.</translation> <translation id="4003384961948020559">Сәтсіз: шығыс науа толып кеткен</translation> @@ -302,6 +303,7 @@ <translation id="7936303884198020182">Атау серверлері табылмады.</translation> <translation id="7960831585769876809">Температура</translation> <translation id="7994702968232966508">EAP әдісі</translation> +<translation id="802154636333426148">Жүктеу сәтсіз аяқталды</translation> <translation id="8041089156583427627">Пікір жіберу</translation> <translation id="8075838845814659848">Қалған заряд</translation> <translation id="808894953321890993">Кұпия сөзді өзгерту</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb index 573f273..ecb7599 100644 --- a/chromeos/strings/chromeos_strings_km.xtb +++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">គុណភាពបង្ហាញ</translation> <translation id="3941014780699102620">មិនអាចដោះស្រាយម៉ាស៊ីនបានទេ</translation> <translation id="3942420633017001071">ការវិភាគ</translation> +<translation id="3967822245660637423">ការទាញយកបានបញ្ចប់</translation> <translation id="397105322502079400">កំពុងគណនា...</translation> <translation id="39823212440917567">កិច្ចការបោះពុម្ពដែលចាស់ជាង <ph name="NUMBER_OF_DAYS" /> ថ្ងៃនឹងត្រូវបានលុបចេញ</translation> <translation id="4003384961948020559">មិនបានសម្រេច - កន្លែងចេញក្រដាសបោះពុម្ពពេញហើយ</translation> @@ -302,6 +303,7 @@ <translation id="7936303884198020182">រកមិនឃើញ DNS ទេ</translation> <translation id="7960831585769876809">សីតុណ្ហភាព</translation> <translation id="7994702968232966508">វិធីសាស្ត្រ EAP</translation> +<translation id="802154636333426148">បានបរាជ័យក្នុងការទាញយក</translation> <translation id="8041089156583427627">ផ្ញើមតិ</translation> <translation id="8075838845814659848">ការសាកថ្មដែលនៅសល់</translation> <translation id="808894953321890993">ប្ដូរពាក្យសម្ងាត់</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index f6f0e3b4..4792066 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">ರೆಸಲ್ಯೂಶನ್</translation> <translation id="3941014780699102620">ಹೋಸ್ಟ್ ಅನ್ನು ಪರಿಹರಿಸಲು ವಿಫಲವಾಗಿದೆ</translation> <translation id="3942420633017001071">ತಪಾಸಣೆಗಳು</translation> +<translation id="3967822245660637423">ಡೌನ್ಲೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ</translation> <translation id="397105322502079400">ಎಣಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> ದಿನಗಳಿಗಿಂತ ಹಳೆಯದಾದ ಮುದ್ರಣ ಕಾರ್ಯಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ</translation> <translation id="4003384961948020559">ವಿಫಲವಾಗಿದೆ - ಔಟ್ಪುಟ್ ಭರ್ತಿಯಾಗಿದೆ</translation> @@ -278,6 +279,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{ಸ್ಕ್ಯಾನಿಂಗ್ ಪೂರ್ಣಗೊಂಡಿದೆ. 1 ಪುಟವನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗಿದೆ}one{ಸ್ಕ್ಯಾನಿಂಗ್ ಪೂರ್ಣಗೊಂಡಿದೆ. {NUMBER_OF_PAGES} ಪುಟಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗಿದೆ}other{ಸ್ಕ್ಯಾನಿಂಗ್ ಪೂರ್ಣಗೊಂಡಿದೆ. {NUMBER_OF_PAGES} ಪುಟಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗಿದೆ}}</translation> +<translation id="7449585358422953039"><ph name="MANAGER" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ.</translation> <translation id="7469648432129124067">ಪೋರ್ಟಲ್ ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ</translation> <translation id="7487067081878637334">ತಂತ್ರಜ್ಞಾನ</translation> <translation id="7490813197707563893">MAC ವಿಳಾಸ</translation> @@ -302,6 +304,7 @@ <translation id="7936303884198020182">ಹೆಸರು ಇಲ್ಲದ ಸರ್ವರ್ಗಳು ಕಂಡುಬಂದಿವೆ.</translation> <translation id="7960831585769876809">ತಾಪಮಾನ</translation> <translation id="7994702968232966508">EAP ವಿಧಾನ</translation> +<translation id="802154636333426148">ಡೌನ್ಲೋಡ್ ವಿಫಲಗೊಂಡಿದೆ</translation> <translation id="8041089156583427627">ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ</translation> <translation id="8075838845814659848">ಉಳಿದಿರುವ ಚಾರ್ಜ್</translation> <translation id="808894953321890993">ಪಾಸ್ವರ್ಡ್ ಬದಲಿಸಿ</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb index fc5952b..18b69c8d 100644 --- a/chromeos/strings/chromeos_strings_ko.xtb +++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">해상도</translation> <translation id="3941014780699102620">호스트를 확인할 수 없습니다.</translation> <translation id="3942420633017001071">진단</translation> +<translation id="3967822245660637423">다운로드 완료</translation> <translation id="397105322502079400">계산 중...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" />일 이상 경과한 인쇄 작업은 삭제됩니다.</translation> <translation id="4003384961948020559">실패 - 출력 가득 참</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{스캔이 완료되었습니다. 1페이지가 스캔되었습니다}other{스캔이 완료되었습니다. {NUMBER_OF_PAGES}페이지가 스캔되었습니다}}</translation> +<translation id="7449585358422953039"><ph name="MANAGER" />에서 관리합니다.</translation> <translation id="7469648432129124067">포털 감지됨</translation> <translation id="7487067081878637334">테크놀로지</translation> <translation id="7490813197707563893">MAC 주소</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">네임서버를 찾을 수 없습니다.</translation> <translation id="7960831585769876809">온도</translation> <translation id="7994702968232966508">EAP 방식</translation> +<translation id="802154636333426148">다운로드 실패</translation> <translation id="8041089156583427627">의견 보내기</translation> <translation id="8075838845814659848">배터리 잔량</translation> <translation id="808894953321890993">비밀번호 변경</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb index d164512e..c4dbae0 100644 --- a/chromeos/strings/chromeos_strings_ky.xtb +++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Чечилиш</translation> <translation id="3941014780699102620">Башкы түйүн чечилген жок</translation> <translation id="3942420633017001071">Мүчүлүштүктөрдү аныктоо</translation> +<translation id="3967822245660637423">Жүктөп алуу аяктады</translation> <translation id="397105322502079400">Эсептелүүдө…</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> күндөн мурунку басып чыгаруу тапшырмалары өчүрүлөт</translation> <translation id="4003384961948020559">Басылып чыгарылган жок - Барактар тактасы толук</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">Ысым серверлери табылган жок</translation> <translation id="7960831585769876809">Температура</translation> <translation id="7994702968232966508">EAP ыкмасы</translation> +<translation id="802154636333426148">Жүктөлүп алынбай калды</translation> <translation id="8041089156583427627">Пикириңизди билдириңиз</translation> <translation id="8075838845814659848">Батареянын кубаты</translation> <translation id="808894953321890993">Сызсөздү өзгөртүү</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb index 9d5aadec..5e00533 100644 --- a/chromeos/strings/chromeos_strings_lo.xtb +++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">ຄວາມລະອຽດ</translation> <translation id="3941014780699102620">ແກ້ໄຂບັນຫາໂຮສບໍ່ສຳເລັດ</translation> <translation id="3942420633017001071">ການກວດວິເຄາະບັນຫາ</translation> +<translation id="3967822245660637423">ດາວໂຫຼດສຳເລັດ</translation> <translation id="397105322502079400">ກໍາລັງຄິດໄລ່...</translation> <translation id="39823212440917567">ວຽກພິມທີ່ເກົ່າກວ່າ <ph name="NUMBER_OF_DAYS" /> ມື້ຈະຖືກລຶບອອກ</translation> <translation id="4003384961948020559">ບໍ່ສຳເລັດ, ເອົ້າພຸດເຕັມ</translation> @@ -280,6 +281,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{ສຳເລັດການສະແກນແລ້ວ. ສະແກນ 1 ໜ້າແລ້ວ}other{ສຳເລັດການສະແກນແລ້ວ. ສະແກນ {NUMBER_OF_PAGES} ໜ້າແລ້ວ}}</translation> +<translation id="7449585358422953039">ຈັດການໂດຍ <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">ກວດພົບໜ້າເວັບ</translation> <translation id="7487067081878637334">ເທັກໂນໂລຢີ</translation> <translation id="7490813197707563893">ທີ່ຢູ່ MAC</translation> @@ -304,6 +306,7 @@ <translation id="7936303884198020182">ບໍ່ພົບເຊີບເວີຊື່</translation> <translation id="7960831585769876809">ອຸນຫະພູມ</translation> <translation id="7994702968232966508">ວິທີການ EAP</translation> +<translation id="802154636333426148">ການດາວໂຫຼດບໍ່ສຳເລັດ</translation> <translation id="8041089156583427627">ສົ່ງຄຳຕິຊົມ</translation> <translation id="8075838845814659848">ການສາກທີ່ເຫຼືອ</translation> <translation id="808894953321890993">ປ່ຽນລະຫັດຜ່ານ</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb index a70f056..e4ec904 100644 --- a/chromeos/strings/chromeos_strings_lt.xtb +++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Skyra</translation> <translation id="3941014780699102620">Nepavyko nustatyti prieglobos pavadinimo</translation> <translation id="3942420633017001071">Diagnostika</translation> +<translation id="3967822245660637423">Atsisiuntimas baigtas</translation> <translation id="397105322502079400">Skaičiuojama...</translation> <translation id="39823212440917567">Senesnės nei <ph name="NUMBER_OF_DAYS" /> d. spausdinimo užduotys bus pašalintos</translation> <translation id="4003384961948020559">Nepavyko – išvestis pilna</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Nuskaitymas baigtas. Nuskaitytas vienas puslapis}one{Nuskaitymas baigtas. Nuskaitytas {NUMBER_OF_PAGES} puslapis}few{Nuskaitymas baigtas. Nuskaityti {NUMBER_OF_PAGES} puslapiai}many{Nuskaitymas baigtas. Nuskaityta {NUMBER_OF_PAGES} puslapio}other{Nuskaitymas baigtas. Nuskaityta {NUMBER_OF_PAGES} puslapių}}</translation> +<translation id="7449585358422953039">Valdo „<ph name="MANAGER" />“.</translation> <translation id="7469648432129124067">Aptiktas portalas</translation> <translation id="7487067081878637334">Technologija</translation> <translation id="7490813197707563893">MAC adresas</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Domenų pavadinimų serverių nerasta</translation> <translation id="7960831585769876809">Temperatūra</translation> <translation id="7994702968232966508">EAP metodas</translation> +<translation id="802154636333426148">Įvyko atsisiuntimo klaida</translation> <translation id="8041089156583427627">Siųsti atsiliepimą</translation> <translation id="8075838845814659848">Likusio įkrovimo rodiklis</translation> <translation id="808894953321890993">Keisti slaptažodį</translation>
diff --git a/chromeos/strings/chromeos_strings_lv.xtb b/chromeos/strings/chromeos_strings_lv.xtb index 900ece8e..6553f056 100644 --- a/chromeos/strings/chromeos_strings_lv.xtb +++ b/chromeos/strings/chromeos_strings_lv.xtb
@@ -90,6 +90,7 @@ <translation id="315738237743207937">Konstatēta caurlaides lapa</translation> <translation id="3188257591659621405">Mani faili</translation> <translation id="3199982728237701504">Dokumentu padevējs (divpusēji)</translation> +<translation id="3226405216343213872">Notiek skeneru meklēšana…</translation> <translation id="3246869037381808805">Drukas uzdevumi, kas ir vecāki par vienu dienu, tiks noņemti</translation> <translation id="3268178239013324452">Neizdevās — durtiņas ir atvērtas</translation> <translation id="3310640316857623290">DNS latentums ievērojami pārsniedz pieļaujamo slieksni</translation> @@ -117,6 +118,7 @@ <translation id="3865414814144988605">Izšķirtspēja</translation> <translation id="3941014780699102620">Neizdevās atrisināt saimniekdatora nosaukumu</translation> <translation id="3942420633017001071">Diagnostika</translation> +<translation id="3967822245660637423">Lejupielāde pabeigta</translation> <translation id="397105322502079400">Aprēķina...</translation> <translation id="39823212440917567">Drukas uzdevumi, kas ir vecāki par <ph name="NUMBER_OF_DAYS" /> dienām, tiks noņemti</translation> <translation id="4003384961948020559">Neizdevās — izvades paliktnis pilns</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Netika atrasts neviens nosaukumu serveris</translation> <translation id="7960831585769876809">Temperatūra</translation> <translation id="7994702968232966508">EAP metode</translation> +<translation id="802154636333426148">Lejupielāde neizdevās</translation> <translation id="8041089156583427627">Sūtīt atsauksmes</translation> <translation id="8075838845814659848">Atlikusī akumulatora enerģija</translation> <translation id="808894953321890993">Mainīt paroli</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb index 3c48f12..13b8fa6 100644 --- a/chromeos/strings/chromeos_strings_mk.xtb +++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Резолуција</translation> <translation id="3941014780699102620">Неуспешно отворање на хостот</translation> <translation id="3942420633017001071">Дијагностика</translation> +<translation id="3967822245660637423">Преземањето е завршено</translation> <translation id="397105322502079400">Се пресметува…</translation> <translation id="39823212440917567">Задачите за печатење постари од <ph name="NUMBER_OF_DAYS" /> дена ќе се отстранат</translation> <translation id="4003384961948020559">Неуспешно - излезната фиока е полна</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Скенирањето е завршено. Скенирана е 1 страница}one{Скенирањето е завршено. Скенирана е {NUMBER_OF_PAGES} страница}other{Скенирањето е завршено. Скенирани се {NUMBER_OF_PAGES} страници}}</translation> +<translation id="7449585358422953039">Управувано од <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Откриен е портал</translation> <translation id="7487067081878637334">Технологија</translation> <translation id="7490813197707563893">MAC-адреса</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Не се најдени сервери за име</translation> <translation id="7960831585769876809">Температура</translation> <translation id="7994702968232966508">EAP-метод</translation> +<translation id="802154636333426148">Неуспешно преземање</translation> <translation id="8041089156583427627">Испратете повратни информации</translation> <translation id="8075838845814659848">Преостанато полнење</translation> <translation id="808894953321890993">Промени лозинка</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index 084aa1b..196745f86 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -90,6 +90,7 @@ <translation id="315738237743207937">ക്യാപ്റ്റീവ് പോർട്ടൽ തിരിച്ചറിഞ്ഞു</translation> <translation id="3188257591659621405">എൻ്റെ ഫയലുകൾ</translation> <translation id="3199982728237701504">ഡോക്യുമെന്റ് ഫീഡർ (രണ്ട് വശമുള്ളത്)</translation> +<translation id="3226405216343213872">സ്കാനറുകൾ തിരയുന്നു</translation> <translation id="3246869037381808805">1 ദിവസം മുമ്പുള്ള പ്രിന്റ് ജോലികൾ നീക്കം ചെയ്യും</translation> <translation id="3268178239013324452">പ്രിന്റ് ചെയ്യാനായില്ല - വാതിൽ തുറന്നിരിക്കുന്നു</translation> <translation id="3310640316857623290">DNS പ്രതികരണ സമയം അനുവദിക്കപ്പെട്ട പരിധിയേക്കാൾ വളരെ മുകളിലാണ്</translation> @@ -117,6 +118,7 @@ <translation id="3865414814144988605">റെസല്യൂഷൻ</translation> <translation id="3941014780699102620">ഹോസ്റ്റ് പരിഹരിക്കാനായില്ല</translation> <translation id="3942420633017001071">പ്രശ്നനിർണ്ണയം</translation> +<translation id="3967822245660637423">ഡൗൺലോഡ് പൂർത്തിയായി</translation> <translation id="397105322502079400">കണക്കാക്കുന്നു...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> ദിവസം മുമ്പുള്ള പ്രിന്റ് ജോലികൾ നീക്കം ചെയ്യും</translation> <translation id="4003384961948020559">പ്രിന്റ് ചെയ്യാനായില്ല - ഔട്ട്പുട്ട് നിറഞ്ഞിരിക്കുന്നു</translation> @@ -302,6 +304,7 @@ <translation id="7936303884198020182">നെയിം സെർവറുകളൊന്നും കണ്ടെത്തിയില്ല</translation> <translation id="7960831585769876809">താപനില</translation> <translation id="7994702968232966508">EAP രീതി</translation> +<translation id="802154636333426148">ഡൗൺലോഡ് പരാജയപ്പെട്ടു</translation> <translation id="8041089156583427627">ഫീഡ്ബാക്ക് അയയ്ക്കുക</translation> <translation id="8075838845814659848">ശേഷിക്കുന്ന ചാർജ്</translation> <translation id="808894953321890993">പാസ്വേഡ് മാറ്റുക</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb index 3923eca..21260517c 100644 --- a/chromeos/strings/chromeos_strings_mn.xtb +++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Нягтрал</translation> <translation id="3941014780699102620">Хостыг шийдвэрлэж чадсангүй</translation> <translation id="3942420633017001071">Оношилгоо</translation> +<translation id="3967822245660637423">Татаж авч дууслаа</translation> <translation id="397105322502079400">Тооцоолж байна ...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> хоногоос дээш хугацаагаар хадгалсан хэвлэлийн ажлуудыг хасах болно</translation> <translation id="4003384961948020559">Амжилтгүй болсон - Гаралт дүүрсэн</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">DNS олдсонгүй</translation> <translation id="7960831585769876809">Температур</translation> <translation id="7994702968232966508">EAP арга</translation> +<translation id="802154636333426148">Татаж чадсангүй</translation> <translation id="8041089156583427627">Санал хүсэлт илгээх</translation> <translation id="8075838845814659848">Үлдсэн цэнэг</translation> <translation id="808894953321890993">Нууц үгийг солих</translation>
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb index e2b613c..595d0aff 100644 --- a/chromeos/strings/chromeos_strings_mr.xtb +++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -116,6 +116,7 @@ <translation id="3865414814144988605">रिझोल्युशन</translation> <translation id="3941014780699102620">होस्टचे निराकरण करता आले नाही</translation> <translation id="3942420633017001071">निदान</translation> +<translation id="3967822245660637423">पूर्ण डाउनलोड करा</translation> <translation id="397105322502079400">गणना करत आहे...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> दिवसांपेक्षा जुने प्रिंट जॉब काढून टाकले जातील</translation> <translation id="4003384961948020559">अयशस्वी झाले - आउटपुट भरले आहे</translation> @@ -300,6 +301,7 @@ <translation id="7936303884198020182">नेम सर्व्हर आढळले नाहीत</translation> <translation id="7960831585769876809">तापमान</translation> <translation id="7994702968232966508">EAP पद्धत</translation> +<translation id="802154636333426148">डाउनलोड अयशस्वी झाले</translation> <translation id="8041089156583427627">अभिप्राय पाठवा</translation> <translation id="8075838845814659848">शिल्लक चार्जिंग</translation> <translation id="808894953321890993">पासवर्ड बदला</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb index 89d92a5..7e0d625 100644 --- a/chromeos/strings/chromeos_strings_ms.xtb +++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Peleraian</translation> <translation id="3941014780699102620">Gagal untuk menyelesaikan hos</translation> <translation id="3942420633017001071">Diagnostik</translation> +<translation id="3967822245660637423">Muat turun selesai</translation> <translation id="397105322502079400">Mengira...</translation> <translation id="39823212440917567">Tugas cetak yang melebihi <ph name="NUMBER_OF_DAYS" /> hari akan dialih keluar</translation> <translation id="4003384961948020559">Gagal - Output penuh</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Pengimbasan selesai. 1 halaman diimbas}other{Pengimbasan selesai. {NUMBER_OF_PAGES} halaman diimbas}}</translation> +<translation id="7449585358422953039">Diurus oleh <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Portal dikesan</translation> <translation id="7487067081878637334">Teknologi</translation> <translation id="7490813197707563893">Alamat MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Pelayan tanpa nama ditemukan</translation> <translation id="7960831585769876809">Suhu</translation> <translation id="7994702968232966508">Kaedah EAP</translation> +<translation id="802154636333426148">Muat turun gagal</translation> <translation id="8041089156583427627">Hantar Maklum Balas</translation> <translation id="8075838845814659848">Baki cas</translation> <translation id="808894953321890993">Tukar kata laluan</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb index e3de85e..79908e9 100644 --- a/chromeos/strings/chromeos_strings_my.xtb +++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">ပုံရိပ်ပြတ်သားကိန်း</translation> <translation id="3941014780699102620">ဆာဗာပင်ရင်းကို မဖြေရှင်းနိုင်ပါ</translation> <translation id="3942420633017001071">အမှားရှာဖွေမှုများ</translation> +<translation id="3967822245660637423">ဒေါင်းလုဒ်လုပ်ခြင်း ပြည့်စုံပါပြီ</translation> <translation id="397105322502079400">တွက်ချက်နေ...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> ရက်အထက် ပရင့်ထုတ်ရန်ဖိုင်များကို ဖယ်ရှားပါမည်</translation> <translation id="4003384961948020559">မအောင်မြင်ပါ - စာရွက်ထုတ်သည့်နေရာ ပြည့်နေသည်</translation> @@ -302,6 +303,7 @@ <translation id="7936303884198020182">အမည်ဆာဗာတစ်ခုမျှ ရှာမတွေ့ပါ</translation> <translation id="7960831585769876809">အပူချိန်</translation> <translation id="7994702968232966508">EAP နည်းလမ်း</translation> +<translation id="802154636333426148">ဒေါင်းလုဒ်လုပ်မှု မအောင်မြင်ပါ</translation> <translation id="8041089156583427627">အကြံပြုချက် ပို့ရန်</translation> <translation id="8075838845814659848">ကျန်ရှိသော အားပမာဏ</translation> <translation id="808894953321890993">စကားဝှက် ပြောင်းရန်</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb index bb77bc1b..e2af13d 100644 --- a/chromeos/strings/chromeos_strings_ne.xtb +++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -90,6 +90,7 @@ <translation id="315738237743207937">क्याप्टिभ पोर्टल भेटियो</translation> <translation id="3188257591659621405">मेरा फाइलहरू</translation> <translation id="3199982728237701504">डकुमेन्ट फिडर (दुईतर्फी)</translation> +<translation id="3226405216343213872">स्क्यानरहरू खोजिँदै छ</translation> <translation id="3246869037381808805">१ दिनभन्दा पहिलेका प्रिन्टसम्बन्धी कार्यहरू हटाइने छन्</translation> <translation id="3268178239013324452">प्रिन्ट गर्न सकिएन - प्रिन्टरको कभर खुला छ</translation> <translation id="3310640316857623290">DNS को विलम्बता तोकिएको समयसीमाभन्दा अत्याधिक मात्रामा बढी छ</translation> @@ -117,6 +118,7 @@ <translation id="3865414814144988605">रिजोलुसन</translation> <translation id="3941014780699102620">होस्टको समस्या समाधान गर्न सकिएन</translation> <translation id="3942420633017001071">निदान</translation> +<translation id="3967822245660637423">डाउनलोड पूर्ण भयो</translation> <translation id="397105322502079400">हिसाब गर्दै...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> दिनभन्दा पहिलेका प्रिन्टसम्बन्धी कार्यहरू हटाइने छ</translation> <translation id="4003384961948020559">प्रिन्ट गर्न सकिएन - ट्रे भरियो</translation> @@ -278,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{स्क्यान गरिसकियो। एउटा पेज स्क्यान गरियो}other{स्क्यान गरिसकियो। {NUMBER_OF_PAGES} पेज स्क्यान गरिए}}</translation> +<translation id="7449585358422953039"><ph name="MANAGER" /> ले व्यवस्थापन गर्छ।</translation> <translation id="7469648432129124067">पोर्टल पत्ता लागेको छ</translation> <translation id="7487067081878637334">प्रविधि</translation> <translation id="7490813197707563893">MAC ठेगाना</translation> @@ -302,6 +305,7 @@ <translation id="7936303884198020182">कुनै पनि डोमेन नेम सर्भर फेला परेन</translation> <translation id="7960831585769876809">तापक्रम</translation> <translation id="7994702968232966508">EAP विधि</translation> +<translation id="802154636333426148">डाउनलोड गर्न सकिएन</translation> <translation id="8041089156583427627">प्रतिक्रिया पठाउनुहोस्।</translation> <translation id="8075838845814659848">बाँकी ब्याट्री</translation> <translation id="808894953321890993">पासवर्ड परिवर्तन गर्नुहोस्</translation>
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb index 2c82ef0..f1f7665c 100644 --- a/chromeos/strings/chromeos_strings_nl.xtb +++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Resolutie</translation> <translation id="3941014780699102620">Kan host niet omzetten</translation> <translation id="3942420633017001071">Diagnose</translation> +<translation id="3967822245660637423">Downloaden voltooid</translation> <translation id="397105322502079400">Berekenen...</translation> <translation id="39823212440917567">Afdruktaken ouder dan <ph name="NUMBER_OF_DAYS" /> dagen worden verwijderd</translation> <translation id="4003384961948020559">Mislukt - Uitvoer is vol</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">Geen naamservers gevonden</translation> <translation id="7960831585769876809">Temperatuur</translation> <translation id="7994702968232966508">EAP-methode</translation> +<translation id="802154636333426148">Downloaden mislukt</translation> <translation id="8041089156583427627">Feedback sturen</translation> <translation id="8075838845814659848">Resterende batterijlading</translation> <translation id="808894953321890993">Wachtwoord wijzigen</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb index b4a2d8b2..16ac422 100644 --- a/chromeos/strings/chromeos_strings_no.xtb +++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Oppløsning</translation> <translation id="3941014780699102620">Kunne ikke finne tilknytning til verten</translation> <translation id="3942420633017001071">Diagnostikk</translation> +<translation id="3967822245660637423">Nedlasting fullført</translation> <translation id="397105322502079400">Beregner …</translation> <translation id="39823212440917567">Utskriftsjobber som er eldre enn <ph name="NUMBER_OF_DAYS" /> dager, blir fjernet</translation> <translation id="4003384961948020559">Mislykket – utskriftsmottaket er fullt</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Skanningen er fullført. 1 side er skannet}other{Skanningen er fullført. {NUMBER_OF_PAGES} sider er skannet}}</translation> +<translation id="7449585358422953039">Administreres av <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Oppdaget en portal</translation> <translation id="7487067081878637334">Teknologi</translation> <translation id="7490813197707563893">MAC-adresse</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Fant ingen navnetjenere</translation> <translation id="7960831585769876809">Temperatur</translation> <translation id="7994702968232966508">EAP-metode</translation> +<translation id="802154636333426148">Nedlastingen mislyktes</translation> <translation id="8041089156583427627">Send tilbakemelding</translation> <translation id="8075838845814659848">Gjenværende batteri</translation> <translation id="808894953321890993">Endre passord</translation>
diff --git a/chromeos/strings/chromeos_strings_or.xtb b/chromeos/strings/chromeos_strings_or.xtb index 691b4157..2cc6a72 100644 --- a/chromeos/strings/chromeos_strings_or.xtb +++ b/chromeos/strings/chromeos_strings_or.xtb
@@ -116,6 +116,7 @@ <translation id="3865414814144988605">ରିଜୋଲ୍ୟୁଶନ୍</translation> <translation id="3941014780699102620">ହୋଷ୍ଟ ସମ୍ବନ୍ଧିତ ସମସ୍ୟାର ସମାଧାନ କରିବାରେ ବିଫଳ ହୋଇଛି</translation> <translation id="3942420633017001071">ଡାଏଗ୍ନୋଷ୍ଟିକ୍ସ</translation> +<translation id="3967822245660637423">ଡାଉନ୍ଲୋଡ୍ ଶେଷ ହୋଇଛି</translation> <translation id="397105322502079400">ଗଣନା କରାଯାଉଛି…</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> ଦିନରୁ ଅଧିକ ପୁରୁଣା ପ୍ରିଣ୍ଟ କାର୍ଯ୍ୟଗୁଡ଼ିକୁ କାଢ଼ି ଦିଆଯିବ</translation> <translation id="4003384961948020559">ବିଫଳ ହୋଇଛି - ଆଉଟପୁଟ୍ ଟ୍ରେ ପୂର୍ଣ୍ଣ ଅଛି</translation> @@ -277,6 +278,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{ସ୍କାନ୍ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଯାଇଛି। 1ଟି ପୃଷ୍ଠାକୁ ସ୍କାନ୍ କରାଯାଇଛି}other{ସ୍କାନ୍ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଯାଇଛି। {NUMBER_OF_PAGES}ଟି ପୃଷ୍ଠାକୁ ସ୍କାନ୍ କରାଯାଇଛି}}</translation> +<translation id="7449585358422953039"><ph name="MANAGER" /> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି।</translation> <translation id="7469648432129124067">ପୋର୍ଟାଲକୁ ଚିହ୍ନଟ କରାଯାଇଛି</translation> <translation id="7487067081878637334">ଟେକ୍ନୋଲୋଜି</translation> <translation id="7490813197707563893">MAC ଠିକଣା</translation> @@ -300,6 +302,7 @@ <translation id="7936303884198020182">କୌଣସି ନେମ୍ ସର୍ଭର୍ ମିଳୁ ନାହିଁ</translation> <translation id="7960831585769876809">ତାପମାତ୍ରା</translation> <translation id="7994702968232966508">EAP ପଦ୍ଧତି</translation> +<translation id="802154636333426148">ଡାଉନ୍ଲୋଡ୍ ବିଫଳ ହୋଇଛି</translation> <translation id="8041089156583427627">ମତାମତ ପଠାନ୍ତୁ</translation> <translation id="8075838845814659848">ବାକି ଥିବା ଚାର୍ଜ</translation> <translation id="808894953321890993">ପାସ୍ୱାର୍ଡ ବଦଳାନ୍ତୁ</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb index f865323..58f2277e 100644 --- a/chromeos/strings/chromeos_strings_pa.xtb +++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -90,6 +90,7 @@ <translation id="315738237743207937">ਕੈਪਟਿਵ ਪੋਰਟਲ ਦਾ ਪਤਾ ਲੱਗਾ</translation> <translation id="3188257591659621405">ਮੇਰੀਆਂ ਫ਼ਾਈਲਾਂ</translation> <translation id="3199982728237701504">ਦਸਤਾਵੇਜ਼ ਫ਼ੀਡਰ (ਦੋ ਪਾਸੜ)</translation> +<translation id="3226405216343213872">ਸਕੈਨਰ ਲੱਭੇ ਜਾ ਰਹੇ ਹਨ</translation> <translation id="3246869037381808805">1 ਦਿਨ ਤੋਂ ਜ਼ਿਆਦਾ ਪੁਰਾਣੀਆਂ ਪ੍ਰਿੰਟ ਜੌਬਾਂ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ</translation> <translation id="3268178239013324452">ਅਸਫਲ ਰਹੀ - ਢੱਕਣ ਖੁੱਲ੍ਹਾ ਹੈ</translation> <translation id="3310640316857623290">DNS ਵਿਲੰਬਤਾ ਇਜਾਜ਼ਤਯੋਗ ਨਿਊਨਤਮ ਸੀਮਾ ਤੋਂ ਕਾਫ਼ੀ ਉੱਤੇ ਹੈ</translation> @@ -117,6 +118,7 @@ <translation id="3865414814144988605">ਰੈਜ਼ੋਲਿਊਸ਼ਨ</translation> <translation id="3941014780699102620">ਹੋਸਟ ਨੂੰ ਹੱਲ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ</translation> <translation id="3942420633017001071">ਤਸ਼ਖੀਸ</translation> +<translation id="3967822245660637423">ਡਾਊਨਲੋਡ ਪੂਰਾ ਹੋਇਆ</translation> <translation id="397105322502079400">ਅਨੁਮਾਨ ਲਗਾ ਰਿਹਾ ਹੈ...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> ਦਿਨਾਂ ਤੋਂ ਜ਼ਿਆਦਾ ਪੁਰਾਣੀਆਂ ਪ੍ਰਿੰਟ ਜੌਬਾਂ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ</translation> <translation id="4003384961948020559">ਅਸਫਲ ਰਹੀ - ਆਊਟਪੁੱਟ ਭਰ ਗਿਆ ਹੈ</translation> @@ -278,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{ਸਕੈਨਿੰਗ ਪੂਰੀ ਹੋਈ। 1 ਪੰਨਾ ਸਕੈਨ ਕੀਤਾ ਗਿਆ}one{ਸਕੈਨਿੰਗ ਪੂਰੀ ਹੋਈ। {NUMBER_OF_PAGES} ਪੰਨਾ ਸਕੈਨ ਕੀਤਾ ਗਿਆ}other{ਸਕੈਨਿੰਗ ਪੂਰੀ ਹੋਈ। {NUMBER_OF_PAGES} ਪੰਨੇ ਸਕੈਨ ਕੀਤੇ ਗਏ}}</translation> +<translation id="7449585358422953039"><ph name="MANAGER" /> ਵੱਲੋਂ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।</translation> <translation id="7469648432129124067">ਪੋਰਟਲ ਦਾ ਪਤਾ ਲੱਗਾ</translation> <translation id="7487067081878637334">ਤਕਨਾਲੋਜੀ</translation> <translation id="7490813197707563893">MAC ਪਤਾ</translation> @@ -302,6 +305,7 @@ <translation id="7936303884198020182">ਕੋਈ ਨਾਮ ਸਰਵਰ ਨਹੀਂ ਮਿਲਿਆ</translation> <translation id="7960831585769876809">ਤਾਪਮਾਨ</translation> <translation id="7994702968232966508">EAP ਵਿਧੀ</translation> +<translation id="802154636333426148">ਡਾਊਨਲੋਡ ਅਸਫਲ ਰਿਹਾ</translation> <translation id="8041089156583427627">ਵਿਚਾਰ ਭੇਜੋ</translation> <translation id="8075838845814659848">ਬਾਕੀ ਚਾਰਜ</translation> <translation id="808894953321890993">ਪਾਸਵਰਡ ਬਦਲੋ</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb index 2aafed2..f274c0cd 100644 --- a/chromeos/strings/chromeos_strings_pl.xtb +++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Rozdzielczość</translation> <translation id="3941014780699102620">Nie udało się znaleźć hosta</translation> <translation id="3942420633017001071">Diagnostyka</translation> +<translation id="3967822245660637423">Pobieranie zakończone</translation> <translation id="397105322502079400">Obliczanie...</translation> <translation id="39823212440917567">Zadania drukowania starsze niż <ph name="NUMBER_OF_DAYS" /> dni zostaną usunięte</translation> <translation id="4003384961948020559">Niepowodzenie – odbiornik papieru jest pełny</translation> @@ -278,6 +279,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Gotowe. Zeskanowano 1 stronę.}few{Gotowe. Zeskanowano {NUMBER_OF_PAGES} strony.}many{Gotowe. Zeskanowano {NUMBER_OF_PAGES} stron.}other{Gotowe. Zeskanowano {NUMBER_OF_PAGES} strony.}}</translation> +<translation id="7449585358422953039">Zarządzane przez <ph name="MANAGER" /></translation> <translation id="7469648432129124067">Wykryto portal</translation> <translation id="7487067081878637334">Technologia</translation> <translation id="7490813197707563893">Adres MAC</translation> @@ -301,6 +303,7 @@ <translation id="7936303884198020182">Nie znaleziono serwerów nazw</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">Metoda EAP</translation> +<translation id="802154636333426148">Nie udało się pobrać</translation> <translation id="8041089156583427627">Prześlij opinię</translation> <translation id="8075838845814659848">Stan naładowania</translation> <translation id="808894953321890993">Zmień hasło</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb index d301668..78dfdc62 100644 --- a/chromeos/strings/chromeos_strings_pt-BR.xtb +++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Resolução</translation> <translation id="3941014780699102620">Falha na resolução do host</translation> <translation id="3942420633017001071">Diagnóstico</translation> +<translation id="3967822245660637423">Download concluído</translation> <translation id="397105322502079400">Calculando...</translation> <translation id="39823212440917567">Trabalhos de impressão enviados há mais de <ph name="NUMBER_OF_DAYS" /> dias serão removidos</translation> <translation id="4003384961948020559">Falha - Saída cheia</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Digitalização concluída. 1 página digitalizada}one{Digitalização concluída. {NUMBER_OF_PAGES} página digitalizada}other{Digitalização concluída. {NUMBER_OF_PAGES} páginas digitalizadas}}</translation> +<translation id="7449585358422953039">Gerenciado por <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Portal detectado</translation> <translation id="7487067081878637334">Tecnologia</translation> <translation id="7490813197707563893">Endereço MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Nenhum servidor de nomes encontrado</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">Método EAP</translation> +<translation id="802154636333426148">Falha no download</translation> <translation id="8041089156583427627">Enviar comentários</translation> <translation id="8075838845814659848">Carga restante</translation> <translation id="808894953321890993">Alterar senha</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb index 3a85b4c..6a28ca46 100644 --- a/chromeos/strings/chromeos_strings_pt-PT.xtb +++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Resolução</translation> <translation id="3941014780699102620">Falha ao resolver anfitrião.</translation> <translation id="3942420633017001071">Diagnósticos</translation> +<translation id="3967822245660637423">Transferência concluída</translation> <translation id="397105322502079400">A calcular...</translation> <translation id="39823212440917567">As tarefas de impressão com mais de <ph name="NUMBER_OF_DAYS" /> dias serão removidas.</translation> <translation id="4003384961948020559">Falha – Saída cheia</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Digitalização concluída. 1 página digitalizada}other{Digitalização concluída. {NUMBER_OF_PAGES} páginas digitalizadas}}</translation> +<translation id="7449585358422953039">Gerido por <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Portal detetado</translation> <translation id="7487067081878637334">Tecnologia</translation> <translation id="7490813197707563893">Endereço MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Não foram encontrados servidores de nomes.</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">Método EAP</translation> +<translation id="802154636333426148">Falha ao transferir</translation> <translation id="8041089156583427627">Enviar feedback</translation> <translation id="8075838845814659848">Carregamento restante</translation> <translation id="808894953321890993">Alterar palavra-passe</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb index afba1d0d..14391aec 100644 --- a/chromeos/strings/chromeos_strings_ro.xtb +++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Rezoluție</translation> <translation id="3941014780699102620">Nu s-a putut rezolva gazda</translation> <translation id="3942420633017001071">Diagnosticare</translation> +<translation id="3967822245660637423">Descărcare finalizată</translation> <translation id="397105322502079400">Se calculează...</translation> <translation id="39823212440917567">Sarcinile de printare mai vechi de <ph name="NUMBER_OF_DAYS" /> zile vor fi eliminate</translation> <translation id="4003384961948020559">Nereușită – Tavă de ieșire plină</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">Nu s-au găsit servere de nume</translation> <translation id="7960831585769876809">Temperatură</translation> <translation id="7994702968232966508">Metodă EAP</translation> +<translation id="802154636333426148">Descărcarea nu a reușit</translation> <translation id="8041089156583427627">Trimiteți feedback</translation> <translation id="8075838845814659848">Nivel de încărcare rămas</translation> <translation id="808894953321890993">Schimbă parola</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb index 6b39382..a936c83 100644 --- a/chromeos/strings/chromeos_strings_ru.xtb +++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Разрешение</translation> <translation id="3941014780699102620">Не удалось преобразовать имя хоста.</translation> <translation id="3942420633017001071">Диагностика</translation> +<translation id="3967822245660637423">Скачивание завершено.</translation> <translation id="397105322502079400">Вычисление…</translation> <translation id="39823212440917567">Задания печати, хранящиеся дольше <ph name="NUMBER_OF_DAYS" /> дн., будут удалены</translation> <translation id="4003384961948020559">Сбой: выходной лоток заполнен</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Сканирование завершено. Отсканирована 1 страница.}one{Сканирование завершено. Отсканирована {NUMBER_OF_PAGES} страница.}few{Сканирование завершено. Отсканировано {NUMBER_OF_PAGES} страницы.}many{Сканирование завершено. Отсканировано {NUMBER_OF_PAGES} страниц.}other{Сканирование завершено. Отсканировано {NUMBER_OF_PAGES} страницы.}}</translation> +<translation id="7449585358422953039">Устройством управляет <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Обнаружен сетевой портал.</translation> <translation id="7487067081878637334">Технологии</translation> <translation id="7490813197707563893">MAC-адрес</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Не найдены серверы доменных имен.</translation> <translation id="7960831585769876809">Температура</translation> <translation id="7994702968232966508">Метод EAP</translation> +<translation id="802154636333426148">Ошибка скачивания</translation> <translation id="8041089156583427627">Отправить отзыв</translation> <translation id="8075838845814659848">Уровень заряда</translation> <translation id="808894953321890993">Сменить пароль</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb index 8a9c7954..c61c702 100644 --- a/chromeos/strings/chromeos_strings_si.xtb +++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">විභේදනය</translation> <translation id="3941014780699102620">සත්කාරක විසඳීම අසාර්ථක විය</translation> <translation id="3942420633017001071">දෝෂ විනිශ්චය</translation> +<translation id="3967822245660637423">බාගැනීම සම්පූර්ණයි</translation> <translation id="397105322502079400">ගණනය කරමින්...</translation> <translation id="39823212440917567">දින <ph name="NUMBER_OF_DAYS" />කට වඩා පැරණි මුද්රණ කාර්ය ඉවත් කරනු ඇත</translation> <translation id="4003384961948020559">අසාර්ථක විය - ප්රතිදානය පිරී ඇත</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{ස්කෑන් කිරීම සම්පූර්ණ කරන ලදි. පිටු 1ක් ස්කෑන් කරන ලදි}one{ස්කෑන් කිරීම සම්පූර්ණ කරන ලදි. පිටු {NUMBER_OF_PAGES}ක් ස්කෑන් කරන ලදි}other{ස්කෑන් කිරීම සම්පූර්ණ කරන ලදි. පිටු {NUMBER_OF_PAGES}ක් ස්කෑන් කරන ලදි}}</translation> +<translation id="7449585358422953039"><ph name="MANAGER" /> විසින් කළමනාකරණය කෙරේ.</translation> <translation id="7469648432129124067">ද්වාරය අනාවරණය කර ගන්නා ලදි</translation> <translation id="7487067081878637334">තාක්ෂණය</translation> <translation id="7490813197707563893">MAC ලිපිනය</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">නම් සේවාදායක හමු නොවීය</translation> <translation id="7960831585769876809">උෂ්ණත්වය</translation> <translation id="7994702968232966508">EAP ආකාරය</translation> +<translation id="802154636333426148">බාගැනීම අසමත් විය</translation> <translation id="8041089156583427627">ප්රතිපෝෂණ යවන්න</translation> <translation id="8075838845814659848">ඉතිරි ආරෝපණය</translation> <translation id="808894953321890993">මුරපදය වෙනස් කරන්න</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb index 17ab8706..89f0d0e 100644 --- a/chromeos/strings/chromeos_strings_sk.xtb +++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Rozlíšenie</translation> <translation id="3941014780699102620">Hostiteľa sa nepodarilo vybrať</translation> <translation id="3942420633017001071">Diagnostika</translation> +<translation id="3967822245660637423">Sťahovanie dokončené</translation> <translation id="397105322502079400">Prebieha výpočet...</translation> <translation id="39823212440917567">Tlačové úlohy staršie ako <ph name="NUMBER_OF_DAYS" /> d. budú odstránené</translation> <translation id="4003384961948020559">Nepodarilo sa – výstup je plný</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">Nenašli sa žiadne servery DNS</translation> <translation id="7960831585769876809">Teplota</translation> <translation id="7994702968232966508">Metóda EAP</translation> +<translation id="802154636333426148">Stiahnutie zlyhalo</translation> <translation id="8041089156583427627">Odoslať spätnú väzbu</translation> <translation id="8075838845814659848">Zostávajúca úroveň batérie</translation> <translation id="808894953321890993">Zmeniť heslo</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb index 4a26899..24995207 100644 --- a/chromeos/strings/chromeos_strings_sl.xtb +++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Ločljivost</translation> <translation id="3941014780699102620">Ni bilo mogoče razrešiti gostitelja</translation> <translation id="3942420633017001071">Diagnostika</translation> +<translation id="3967822245660637423">Prenos končan</translation> <translation id="397105322502079400">Izračunavanje …</translation> <translation id="39823212440917567">Odstranjena bodo tiskalna opravila, starejša od toliko dni: <ph name="NUMBER_OF_DAYS" /></translation> <translation id="4003384961948020559">Napaka – izhodni pladenj je poln</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">Najden ni bil noben imenski strežnik</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">Način EAP</translation> +<translation id="802154636333426148">Prenos ni uspel</translation> <translation id="8041089156583427627">Pošlji povratne informacije</translation> <translation id="8075838845814659848">Preostanek polnjenja</translation> <translation id="808894953321890993">Sprememba gesla</translation>
diff --git a/chromeos/strings/chromeos_strings_sq.xtb b/chromeos/strings/chromeos_strings_sq.xtb index 59315ea..b7bcb6c 100644 --- a/chromeos/strings/chromeos_strings_sq.xtb +++ b/chromeos/strings/chromeos_strings_sq.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Rezolucioni</translation> <translation id="3941014780699102620">Zgjidhja e pritësit dështoi</translation> <translation id="3942420633017001071">Diagnostikimi</translation> +<translation id="3967822245660637423">Shkarkimi përfundoi</translation> <translation id="397105322502079400">Po llogarit...</translation> <translation id="39823212440917567">Printimet më të vjetra se <ph name="NUMBER_OF_DAYS" /> ditë do të hiqen</translation> <translation id="4003384961948020559">Dështoi - Dalja është plot</translation> @@ -278,6 +279,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Skanimi përfundoi. U skanua 1 faqe}other{Skanimi përfundoi. U skanuan {NUMBER_OF_PAGES} faqe}}</translation> +<translation id="7449585358422953039">Menaxhohet nga <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">U zbulua një portal</translation> <translation id="7487067081878637334">Teknologjia</translation> <translation id="7490813197707563893">Adresa MAC</translation> @@ -302,6 +304,7 @@ <translation id="7936303884198020182">Nuk u gjetën serverë DNS</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">Metoda EAP</translation> +<translation id="802154636333426148">Shkarkimi dështoi</translation> <translation id="8041089156583427627">Dërgo komentet</translation> <translation id="8075838845814659848">Karikimi i mbetur</translation> <translation id="808894953321890993">Ndrysho fjalëkalimin</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb index 852e902..4e11f92 100644 --- a/chromeos/strings/chromeos_strings_sr-Latn.xtb +++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Rezolucija</translation> <translation id="3941014780699102620">Razrešenje hosta nije uspelo</translation> <translation id="3942420633017001071">Dijagnostika</translation> +<translation id="3967822245660637423">Preuzimanje je dovršeno</translation> <translation id="397105322502079400">Izračunavanje...</translation> <translation id="39823212440917567">Zadaci štampanja stariji od <ph name="NUMBER_OF_DAYS" /> dana se uklanjaju</translation> <translation id="4003384961948020559">Nije uspelo – izlaz je pun</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Skeniranje je završeno. Skenirana je 1 stranica}one{Skeniranje je završeno. Skenirana je {NUMBER_OF_PAGES} stranica}few{Skeniranje je završeno. Skenirane su {NUMBER_OF_PAGES} stranice}other{Skeniranje je završeno. Skenirano je {NUMBER_OF_PAGES} stranica}}</translation> +<translation id="7449585358422953039">Ovim upravlja <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Otkriven je portal</translation> <translation id="7487067081878637334">Tehnologija</translation> <translation id="7490813197707563893">MAC adresa</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Nije pronađen nijedan server za imena</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">EAP metod</translation> +<translation id="802154636333426148">Preuzimanje nije uspelo</translation> <translation id="8041089156583427627">Pošalji povratne informacije</translation> <translation id="8075838845814659848">Preostali nivo napunjenosti baterije</translation> <translation id="808894953321890993">Promeni lozinku</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index eddee01..0844be2 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Резолуција</translation> <translation id="3941014780699102620">Разрешење хоста није успело</translation> <translation id="3942420633017001071">Дијагностика</translation> +<translation id="3967822245660637423">Преузимање је довршено</translation> <translation id="397105322502079400">Израчунавање...</translation> <translation id="39823212440917567">Задаци штампања старији од <ph name="NUMBER_OF_DAYS" /> дана се уклањају</translation> <translation id="4003384961948020559">Није успело – излаз је пун</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Скенирање је завршено. Скенирана је 1 страница}one{Скенирање је завршено. Скенирана је {NUMBER_OF_PAGES} страница}few{Скенирање је завршено. Скениране су {NUMBER_OF_PAGES} странице}other{Скенирање је завршено. Скенирано је {NUMBER_OF_PAGES} страница}}</translation> +<translation id="7449585358422953039">Овим управља <ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Откривен је портал</translation> <translation id="7487067081878637334">Технологија</translation> <translation id="7490813197707563893">MAC адреса</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Није пронађен ниједан сервер за имена</translation> <translation id="7960831585769876809">Температура</translation> <translation id="7994702968232966508">EAP метод</translation> +<translation id="802154636333426148">Преузимање није успело</translation> <translation id="8041089156583427627">Пошаљи повратне информације</translation> <translation id="8075838845814659848">Преостали ниво напуњености батерије</translation> <translation id="808894953321890993">Промени лозинку</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb index d5e931f..51adf6e 100644 --- a/chromeos/strings/chromeos_strings_sv.xtb +++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Upplösning</translation> <translation id="3941014780699102620">DNS-matchningen misslyckades för värden</translation> <translation id="3942420633017001071">Diagnostik</translation> +<translation id="3967822245660637423">Nedladdning slutförd</translation> <translation id="397105322502079400">Beräknar ...</translation> <translation id="39823212440917567">Utskriftsjobb som är äldre än <ph name="NUMBER_OF_DAYS" /> dagar tas bort</translation> <translation id="4003384961948020559">Misslyckades – utmatningsfacket är fullt</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">Inga namnservrar hittades</translation> <translation id="7960831585769876809">Temperatur</translation> <translation id="7994702968232966508">EAP-metod</translation> +<translation id="802154636333426148">Nedladdningen misslyckades</translation> <translation id="8041089156583427627">Skicka feedback</translation> <translation id="8075838845814659848">Batteritid som återstår</translation> <translation id="808894953321890993">Ändra lösenord</translation>
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb index ddeca69..6f75a0f2 100644 --- a/chromeos/strings/chromeos_strings_sw.xtb +++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Ubora</translation> <translation id="3941014780699102620">Imeshindwa kusuluhisha seva pangishi</translation> <translation id="3942420633017001071">Vichunguzi</translation> +<translation id="3967822245660637423">Faili imekamilika kupakuliwa</translation> <translation id="397105322502079400">Inakokotoa...</translation> <translation id="39823212440917567">Kazi za kuchapisha zilizohifadhiwa kwa zaidi ya siku <ph name="NUMBER_OF_DAYS" /> zitaondolewa</translation> <translation id="4003384961948020559">Haijakamilika - Sehemu ya kutoa karatasi imejaa</translation> @@ -302,6 +303,7 @@ <translation id="7936303884198020182">Hakuna seva za majina zilizopatikana</translation> <translation id="7960831585769876809">Halijoto</translation> <translation id="7994702968232966508">Mbinu ya EAP</translation> +<translation id="802154636333426148">Haikuweza kupakua</translation> <translation id="8041089156583427627">Tuma Maoni</translation> <translation id="8075838845814659848">Chaji iliyosalia</translation> <translation id="808894953321890993">Badilisha nenosiri</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb index 7b7ef049..d0ada40 100644 --- a/chromeos/strings/chromeos_strings_ta.xtb +++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -90,6 +90,7 @@ <translation id="315738237743207937">கேப்டிவ் போர்டல் கண்டறியப்பட்டது</translation> <translation id="3188257591659621405">எனது கோப்புகள்</translation> <translation id="3199982728237701504">டாக்குமெண்ட் ஃபீடர் (இரண்டு பக்கமும்)</translation> +<translation id="3226405216343213872">ஸ்கேனர்களைத் தேடுகிறது</translation> <translation id="3246869037381808805">1 நாளுக்கும் முன்னதாக உள்ள பிரிண்ட்டிங் பணிகள் அகற்றப்படும்</translation> <translation id="3268178239013324452">பிரிண்டரின் மூடி திறந்துள்ளதால் அச்சிட முடியவில்லை</translation> <translation id="3310640316857623290">DNSஸில் ஏற்படும் தாமதம் அனுமதிக்கப்படும் வரம்பைவிடக் குறிப்பிடத்தக்க அளவு அதிகமாக உள்ளது</translation> @@ -117,6 +118,7 @@ <translation id="3865414814144988605">தெளிவு</translation> <translation id="3941014780699102620">ஹோஸ்ட்டைச் சரிசெய்ய முடியவில்லை</translation> <translation id="3942420633017001071">கண்டறிதல்</translation> +<translation id="3967822245660637423">பதிவிறக்கம் முடிந்தது</translation> <translation id="397105322502079400">கணக்கிடுகிறது...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> நாட்களுக்கும் மேலாக இருக்கும் பிரிண்ட்டிங் பணிகள் அகற்றப்படும்</translation> <translation id="4003384961948020559">பிரிண்ட் வெளியே வரும் டிரே நிரம்பி விட்டதால் அச்சிட முடியவில்லை</translation> @@ -279,6 +281,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{ஸ்கேன் செய்யப்பட்டது. ஒரு பக்கம் ஸ்கேன் செய்யப்பட்டது}other{ஸ்கேன் செய்யப்பட்டது. {NUMBER_OF_PAGES} பக்கங்கள் ஸ்கேன் செய்யப்பட்டன}}</translation> +<translation id="7449585358422953039"><ph name="MANAGER" /> நிர்வகிக்கிறது.</translation> <translation id="7469648432129124067">போர்டல் கண்டறியப்பட்டது</translation> <translation id="7487067081878637334">தொழில்நுட்பம்</translation> <translation id="7490813197707563893">MAC முகவரி</translation> @@ -303,6 +306,7 @@ <translation id="7936303884198020182">பெயர் சேவையகங்கள் எதுவும் இல்லை</translation> <translation id="7960831585769876809">வெப்பநிலை</translation> <translation id="7994702968232966508">EAP முறை</translation> +<translation id="802154636333426148">பதிவிறக்க முடியவில்லை</translation> <translation id="8041089156583427627">கருத்துத் தெரிவிக்கவும்</translation> <translation id="8075838845814659848">மீதமுள்ள சார்ஜ்</translation> <translation id="808894953321890993">கடவுச்சொல்லை மாற்று</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb index e5ef38b..4a6ca4a 100644 --- a/chromeos/strings/chromeos_strings_te.xtb +++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -90,6 +90,7 @@ <translation id="315738237743207937">క్యాప్టివ్ పోర్టల్ గుర్తించబడింది</translation> <translation id="3188257591659621405">నా ఫైల్లు</translation> <translation id="3199982728237701504">డాక్యుమెంట్ ఫీడర్ (రెండు వైపులా)</translation> +<translation id="3226405216343213872">స్కానర్ల కోసం వెతుకుతోంది</translation> <translation id="3246869037381808805">1 రోజుకు పైగా ఉన్న ప్రింట్ టాస్క్లు తీసివేయబడతాయి</translation> <translation id="3268178239013324452">విఫలమైంది - తలుపు తెరుచుకుని ఉంది</translation> <translation id="3310640316857623290">DNS ప్రతిస్పందన సమయం అనుమతించదగిన పరిమితికి మించి ఉంది</translation> @@ -117,6 +118,7 @@ <translation id="3865414814144988605">రిజల్యూషన్</translation> <translation id="3941014780699102620">హోస్ట్ను పరిష్కరించడంలో విఫలమైంది</translation> <translation id="3942420633017001071">నిర్ధారణలు</translation> +<translation id="3967822245660637423">డౌన్లోడ్ పూర్తయింది</translation> <translation id="397105322502079400">గణిస్తోంది...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> రోజులకు పైగా ఉన్న ప్రింట్ టాస్క్లు తీసివేయబడతాయి</translation> <translation id="4003384961948020559">విఫలమైంది - అవుట్పుట్, ప్రింటింగ్ జాబ్లతో నిండి ఉంది</translation> @@ -302,6 +304,7 @@ <translation id="7936303884198020182">పేరుతో సర్వర్లు కనుగొనబడలేదు</translation> <translation id="7960831585769876809">ఉష్ణోగ్రత</translation> <translation id="7994702968232966508">EAP పద్ధతి</translation> +<translation id="802154636333426148">డౌన్లోడ్ విఫలమైంది</translation> <translation id="8041089156583427627">ప్రతిస్పందనను పంపండి</translation> <translation id="8075838845814659848">మిగిలిన ఛార్జ్</translation> <translation id="808894953321890993">పాస్వర్డ్ను మార్చు</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index 24d0868..e862d94f 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">ความละเอียด</translation> <translation id="3941014780699102620">แก้ไขโฮสต์ไม่สำเร็จ</translation> <translation id="3942420633017001071">การวินิจฉัย</translation> +<translation id="3967822245660637423">ดาวน์โหลดเสร็จสมบูรณ์</translation> <translation id="397105322502079400">กำลังคำนวณ...</translation> <translation id="39823212440917567">ระบบจะนำงานพิมพ์ที่เก่ากว่า <ph name="NUMBER_OF_DAYS" /> วันออก</translation> <translation id="4003384961948020559">ไม่สำเร็จ - ถาดกระดาษขาออกเต็ม</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{การสแกนเสร็จสมบูรณ์ สแกนแล้ว 1 หน้า}other{การสแกนเสร็จสมบูรณ์ สแกนแล้ว {NUMBER_OF_PAGES} หน้า}}</translation> +<translation id="7449585358422953039">จัดการโดย <ph name="MANAGER" /></translation> <translation id="7469648432129124067">ตรวจพบพอร์ทัล</translation> <translation id="7487067081878637334">เทคโนโลยี</translation> <translation id="7490813197707563893">ที่อยู่ MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">ไม่พบเนมเซิร์ฟเวอร์</translation> <translation id="7960831585769876809">อุณหภูมิ</translation> <translation id="7994702968232966508">วิธีการ EAP</translation> +<translation id="802154636333426148">การดาวน์โหลดล้มเหลว</translation> <translation id="8041089156583427627">ส่งความคิดเห็น</translation> <translation id="8075838845814659848">การชาร์จที่เหลือ</translation> <translation id="808894953321890993">เปลี่ยนรหัสผ่าน</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb index c02b443..6f61f73 100644 --- a/chromeos/strings/chromeos_strings_tr.xtb +++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Çözünürlük</translation> <translation id="3941014780699102620">Ana makine çözümlenemedi</translation> <translation id="3942420633017001071">Teşhis</translation> +<translation id="3967822245660637423">İndirme tamamlandı</translation> <translation id="397105322502079400">Hesaplanııyor...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> günden eski yazdırma işleri silinir</translation> <translation id="4003384961948020559">İşlem başarısız - Çıkış dolu</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Tarama işlemi tamamlandı. 1 sayfa tarandı}other{Tarama işlemi tamamlandı. {NUMBER_OF_PAGES} sayfa tarandı}}</translation> +<translation id="7449585358422953039"><ph name="MANAGER" /> tarafından yönetiliyor.</translation> <translation id="7469648432129124067">Portal algılandı</translation> <translation id="7487067081878637334">Teknoloji</translation> <translation id="7490813197707563893">MAC adresi</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Alan adı sunucusu bulunamadı</translation> <translation id="7960831585769876809">Sıcaklık</translation> <translation id="7994702968232966508">EAP yöntemi</translation> +<translation id="802154636333426148">İndirilemedi</translation> <translation id="8041089156583427627">Görüş bildirin</translation> <translation id="8075838845814659848">Kalan şarj seviyesi</translation> <translation id="808894953321890993">Şifreyi değiştir</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb index 6182ea7..3135ffd5 100644 --- a/chromeos/strings/chromeos_strings_uk.xtb +++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Роздільна здатність</translation> <translation id="3941014780699102620">не вдалося розпізнати хост</translation> <translation id="3942420633017001071">Діагностика</translation> +<translation id="3967822245660637423">Завантажено</translation> <translation id="397105322502079400">Обчислення...</translation> <translation id="39823212440917567">Завдання друку, старіші за <ph name="NUMBER_OF_DAYS" /> дн., буде вилучено</translation> <translation id="4003384961948020559">Не надруковано – вихідний лоток заповнений</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">не знайдено серверів імен</translation> <translation id="7960831585769876809">Температура</translation> <translation id="7994702968232966508">Метод EAP</translation> +<translation id="802154636333426148">Не вдалося завантажити</translation> <translation id="8041089156583427627">Надіслати відгук</translation> <translation id="8075838845814659848">Рівень заряду</translation> <translation id="808894953321890993">Змінити пароль</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb index 18a286c..b2a1226 100644 --- a/chromeos/strings/chromeos_strings_ur.xtb +++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -90,6 +90,7 @@ <translation id="315738237743207937">کیپٹو پورٹل کا پتا چلا</translation> <translation id="3188257591659621405">میری فائلز</translation> <translation id="3199982728237701504">دستاویز فیڈر (دو طرفہ)</translation> +<translation id="3226405216343213872">اسکینرز کی تلاش جاری ہے</translation> <translation id="3246869037381808805">1 دن سے پرانی پرنٹ جابز کو ہٹا دیا جائے گا</translation> <translation id="3268178239013324452">ناکام ہو گیا - دروازہ کھلا ہے</translation> <translation id="3310640316857623290">DNS تاخیر قابل اجازت حد سے نمایاں طور پر زیادہ ہے</translation> @@ -117,6 +118,7 @@ <translation id="3865414814144988605">ریزولیوشن</translation> <translation id="3941014780699102620">میزبان کو حل کرنے میں ناکام</translation> <translation id="3942420633017001071">تشخیصات</translation> +<translation id="3967822245660637423">ڈاؤن لوڈ مکمل ہوگیا ہے</translation> <translation id="397105322502079400">حساب لگایا جا رہا ہے…</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> دن سے پرانی پرنٹ جابز کو ہٹا دیا جائے گا</translation> <translation id="4003384961948020559">ناکام ہو گیا - آؤٹ پٹ مکمل</translation> @@ -302,6 +304,7 @@ <translation id="7936303884198020182">کوئی نام سرور نہیں ملا</translation> <translation id="7960831585769876809">درجہ حرارت</translation> <translation id="7994702968232966508">EAP طریقہ</translation> +<translation id="802154636333426148">ڈاؤن لوڈ ناکام ہوگیا</translation> <translation id="8041089156583427627">تاثرات بھیجیں</translation> <translation id="8075838845814659848">باقی چارج</translation> <translation id="808894953321890993">پاس ورڈ تبدیل کریں</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb index a38a9cb..fb182b6 100644 --- a/chromeos/strings/chromeos_strings_uz.xtb +++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Piksellar sig‘imi</translation> <translation id="3941014780699102620">Host aniqlanmadi</translation> <translation id="3942420633017001071">Diagnostika</translation> +<translation id="3967822245660637423">Yuklab olindi</translation> <translation id="397105322502079400">Hisoblanmoqda...</translation> <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> kundan eski chop etish vazifalari avtomatik tozalanadi</translation> <translation id="4003384961948020559">Bajarilmadi - Boʻsh joy qolmadi</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Skanerlandi. 1 ta sahifa skanerlandi}other{Skanerlandi. {NUMBER_OF_PAGES} ta sahifa skanerlandi}}</translation> +<translation id="7449585358422953039"><ph name="MANAGER" /> tomonidan boshqariladi.</translation> <translation id="7469648432129124067">Portal aniqlandi</translation> <translation id="7487067081878637334">Texnologiya</translation> <translation id="7490813197707563893">MAC manzil</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Nom serverlari topilmadi</translation> <translation id="7960831585769876809">Harorat</translation> <translation id="7994702968232966508">EAP usuli</translation> +<translation id="802154636333426148">Yuklab olib bo‘lmadi</translation> <translation id="8041089156583427627">Fikr-mulohaza</translation> <translation id="8075838845814659848">Batareya quvvati</translation> <translation id="808894953321890993">Parolni almashtirish</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb index ed38d48..e1b13b5 100644 --- a/chromeos/strings/chromeos_strings_vi.xtb +++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Độ phân giải</translation> <translation id="3941014780699102620">Không phân giải được máy chủ</translation> <translation id="3942420633017001071">Chẩn đoán</translation> +<translation id="3967822245660637423">Đã tải xuống xong</translation> <translation id="397105322502079400">Đang tính...</translation> <translation id="39823212440917567">Các lệnh in quá <ph name="NUMBER_OF_DAYS" /> ngày sẽ bị xóa</translation> <translation id="4003384961948020559">Không thành công – Khay đầu ra đã đầy</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">Không tìm thấy máy chủ định danh</translation> <translation id="7960831585769876809">Nhiệt độ</translation> <translation id="7994702968232966508">Phương pháp EAP</translation> +<translation id="802154636333426148">Tải xuống không thành công</translation> <translation id="8041089156583427627">Gửi phản hồi</translation> <translation id="8075838845814659848">Mức pin còn lại</translation> <translation id="808894953321890993">Đổi mật khẩu</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb index 6a247d08..a727155 100644 --- a/chromeos/strings/chromeos_strings_zh-CN.xtb +++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">分辨率</translation> <translation id="3941014780699102620">未能解析主机</translation> <translation id="3942420633017001071">诊断</translation> +<translation id="3967822245660637423">下载完毕</translation> <translation id="397105322502079400">正在计算...</translation> <translation id="39823212440917567">系统会自动移除存在时长已超过 <ph name="NUMBER_OF_DAYS" /> 天的打印任务</translation> <translation id="4003384961948020559">失败 - 出纸盘已满</translation> @@ -303,6 +304,7 @@ <translation id="7936303884198020182">找不到任何域名服务器</translation> <translation id="7960831585769876809">温度</translation> <translation id="7994702968232966508">EAP 方法</translation> +<translation id="802154636333426148">下载失败</translation> <translation id="8041089156583427627">发送反馈</translation> <translation id="8075838845814659848">剩余电量</translation> <translation id="808894953321890993">更改密码</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb index 58a0846..a31e8e2 100644 --- a/chromeos/strings/chromeos_strings_zh-HK.xtb +++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">解像度</translation> <translation id="3941014780699102620">無法解析主機</translation> <translation id="3942420633017001071">診斷</translation> +<translation id="3967822245660637423">下載完成</translation> <translation id="397105322502079400">計算中…</translation> <translation id="39823212440917567">超過 <ph name="NUMBER_OF_DAYS" /> 天前的列印工作將被移除</translation> <translation id="4003384961948020559">失敗 - 輸出紙匣已滿</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{完成咗掃瞄。掃瞄咗 1 個頁面}other{完成咗掃瞄。掃瞄咗 {NUMBER_OF_PAGES} 個頁面}}</translation> +<translation id="7449585358422953039">由 <ph name="MANAGER" /> 管理。</translation> <translation id="7469648432129124067">已偵測到網絡入口</translation> <translation id="7487067081878637334">科技資訊</translation> <translation id="7490813197707563893">MAC 地址</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">找不到域名伺服器</translation> <translation id="7960831585769876809">溫度</translation> <translation id="7994702968232966508">EAP 方法</translation> +<translation id="802154636333426148">下載失敗</translation> <translation id="8041089156583427627">提供意見</translation> <translation id="8075838845814659848">剩餘電量</translation> <translation id="808894953321890993">變更密碼</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb index e8034c9..4e2f0f6 100644 --- a/chromeos/strings/chromeos_strings_zh-TW.xtb +++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">解析度</translation> <translation id="3941014780699102620">無法解析主機</translation> <translation id="3942420633017001071">診斷</translation> +<translation id="3967822245660637423">下載完成</translation> <translation id="397105322502079400">計算中…</translation> <translation id="39823212440917567">系統會移除 <ph name="NUMBER_OF_DAYS" /> 天前的列印工作</translation> <translation id="4003384961948020559">失敗 - 輸出紙匣已滿</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">EAP</translation> <translation id="7427315641433634153">MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{掃描完成,已掃描 1 個頁面}other{掃描完成,已掃描 {NUMBER_OF_PAGES} 個頁面}}</translation> +<translation id="7449585358422953039">由 <ph name="MANAGER" /> 管理。</translation> <translation id="7469648432129124067">已偵測到網路入口</translation> <translation id="7487067081878637334">科技資訊</translation> <translation id="7490813197707563893">MAC 位址</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">找不到任何名稱伺服器</translation> <translation id="7960831585769876809">溫度</translation> <translation id="7994702968232966508">EAP 方法</translation> +<translation id="802154636333426148">下載失敗</translation> <translation id="8041089156583427627">提供意見</translation> <translation id="8075838845814659848">剩餘電量</translation> <translation id="808894953321890993">變更密碼</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb index 2e8a3c6..89bdea1 100644 --- a/chromeos/strings/chromeos_strings_zu.xtb +++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -117,6 +117,7 @@ <translation id="3865414814144988605">Isixazululo</translation> <translation id="3941014780699102620">Yehlulekile ukulungisa umsingathi</translation> <translation id="3942420633017001071">Ukuxilonga</translation> +<translation id="3967822245660637423">Ukulanda kuqedile</translation> <translation id="397105322502079400">Iyabala...</translation> <translation id="39823212440917567">Imisebenzi yokuphrinta engaphezu kwezinsuku ezingu-<ph name="NUMBER_OF_DAYS" /> izosuswa</translation> <translation id="4003384961948020559">Yehlulekile - Okukhiphayo kugcwele</translation> @@ -279,6 +280,7 @@ <translation id="7375053625150546623">I-EAP</translation> <translation id="7427315641433634153">I-MSCHAP</translation> <translation id="7435977162516949853">{NUMBER_OF_PAGES,plural, =1{Ukuskena kuqedile. Ikhasi eli-1 liskeniwe}one{Ukuskena kuqedile. Amakhasi angu-{NUMBER_OF_PAGES} askeniwe}other{Ukuskena kuqedile. Amakhasi angu-{NUMBER_OF_PAGES} askeniwe}}</translation> +<translation id="7449585358422953039">Iphethwe i-<ph name="MANAGER" />.</translation> <translation id="7469648432129124067">Iphothali itholakele</translation> <translation id="7487067081878637334">Ubuchwepheshe</translation> <translation id="7490813197707563893">Ikheli le-MAC</translation> @@ -303,6 +305,7 @@ <translation id="7936303884198020182">Awekho amaseva wegama atholakele</translation> <translation id="7960831585769876809">Izinga lokushisa</translation> <translation id="7994702968232966508">Indlela ye-EAP</translation> +<translation id="802154636333426148">Ukulanda kwehlulekile</translation> <translation id="8041089156583427627">Thumela impendulo</translation> <translation id="8075838845814659848">Inkokhelo esele</translation> <translation id="808894953321890993">Shintsha iphasiwedi</translation>
diff --git a/components/arc/intent_helper/custom_tab.cc b/components/arc/intent_helper/custom_tab.cc index 14626de..6f924a9 100644 --- a/components/arc/intent_helper/custom_tab.cc +++ b/components/arc/intent_helper/custom_tab.cc
@@ -78,7 +78,7 @@ void CustomTab::UpdateHostBounds(aura::Window* arc_app_window) { DCHECK(arc_app_window); - auto* surface = exo::GetShellMainSurface(arc_app_window); + auto* surface = exo::GetShellRootSurface(arc_app_window); if (!surface) return;
diff --git a/components/arc/usb/usb_host_bridge.cc b/components/arc/usb/usb_host_bridge.cc index 4495b4fa..16bc3735 100644 --- a/components/arc/usb/usb_host_bridge.cc +++ b/components/arc/usb/usb_host_bridge.cc
@@ -23,6 +23,9 @@ namespace arc { namespace { +// USB class codes are detailed at https://www.usb.org/defined-class-codes +constexpr int kUsbClassMassStorage = 0x08; + // Singleton factory for ArcUsbHostBridge class ArcUsbHostBridgeFactory : public internal::ArcBrowserContextKeyedServiceFactoryBase< @@ -42,6 +45,26 @@ ~ArcUsbHostBridgeFactory() override = default; }; +bool IsMassStorageInterface(const device::mojom::UsbInterfaceInfo& interface) { + for (const auto& alternate : interface.alternates) { + if (alternate->class_code == kUsbClassMassStorage) + return true; + } + return false; +} + +bool ShouldExposeDevice(const device::mojom::UsbDeviceInfo& device_info) { + // ChromeOS allows mass storage devices to be detached, but we don't expose + // these directly to ARC. + for (const auto& configuration : device_info.configurations) { + for (const auto& interface : configuration->interfaces) { + if (!IsMassStorageInterface(*interface)) + return true; + } + } + return false; +} + void OnDeviceOpened(mojom::UsbHostHost::OpenDeviceCallback callback, base::ScopedFD fd) { if (!fd.is_valid()) { @@ -291,6 +314,9 @@ if (iter == devices_.end()) return; + if (!ShouldExposeDevice(*iter->second)) + return; + mojom::UsbHostInstance* usb_host_instance = ARC_GET_INSTANCE_FOR_METHOD( arc_bridge_service_->usb_host(), OnDeviceAdded);
diff --git a/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc b/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc index 4ee2a51..1ddefa6 100644 --- a/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc +++ b/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc
@@ -32,8 +32,7 @@ // Currently we have no way to know the resources are not enough to create more // VEAs. Currently this value is selected as 40 instances are enough to pass // the CTS tests. -// TODO(b/168422427): Decrease this to 8 once media_codecs_c2.xml is updated. -constexpr size_t kMaxConcurrentClients = 40; +constexpr size_t kMaxConcurrentClients = 8; base::Optional<media::VideoFrameLayout> CreateVideoFrameLayout( media::VideoPixelFormat format,
diff --git a/components/autofill_assistant/browser/metrics.cc b/components/autofill_assistant/browser/metrics.cc index 09265d86..bb2f39e 100644 --- a/components/autofill_assistant/browser/metrics.cc +++ b/components/autofill_assistant/browser/metrics.cc
@@ -113,9 +113,11 @@ // static void Metrics::RecordLiteScriptFinished(ukm::UkmRecorder* ukm_recorder, content::WebContents* web_contents, + TriggerUIType trigger_ui_type, LiteScriptFinishedState event) { ukm::builders::AutofillAssistant_LiteScriptFinished( ukm::GetSourceIdForWebContentsDocument(web_contents)) + .SetTriggerUIType(static_cast<int64_t>(trigger_ui_type)) .SetLiteScriptFinished(static_cast<int64_t>(event)) .Record(ukm_recorder); } @@ -123,9 +125,11 @@ // static void Metrics::RecordLiteScriptShownToUser(ukm::UkmRecorder* ukm_recorder, content::WebContents* web_contents, + TriggerUIType trigger_ui_type, LiteScriptShownToUser event) { ukm::builders::AutofillAssistant_LiteScriptShownToUser( ukm::GetSourceIdForWebContentsDocument(web_contents)) + .SetTriggerUIType(static_cast<int64_t>(trigger_ui_type)) .SetLiteScriptShownToUser(static_cast<int64_t>(event)) .Record(ukm_recorder); } @@ -133,9 +137,11 @@ // static void Metrics::RecordLiteScriptOnboarding(ukm::UkmRecorder* ukm_recorder, content::WebContents* web_contents, + TriggerUIType trigger_ui_type, LiteScriptOnboarding event) { ukm::builders::AutofillAssistant_LiteScriptOnboarding( ukm::GetSourceIdForWebContentsDocument(web_contents)) + .SetTriggerUIType(static_cast<int64_t>(trigger_ui_type)) .SetLiteScriptOnboarding(static_cast<int64_t>(event)) .Record(ukm_recorder); }
diff --git a/components/autofill_assistant/browser/metrics.h b/components/autofill_assistant/browser/metrics.h index acd5afc..9416af5 100644 --- a/components/autofill_assistant/browser/metrics.h +++ b/components/autofill_assistant/browser/metrics.h
@@ -6,6 +6,7 @@ #define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_METRICS_H_ #include <ostream> +#include "components/autofill_assistant/browser/service.pb.h" #include "content/public/browser/web_contents.h" #include "services/metrics/public/cpp/ukm_recorder.h" @@ -342,12 +343,15 @@ bool success); static void RecordLiteScriptFinished(ukm::UkmRecorder* ukm_recorder, content::WebContents* web_contents, + TriggerUIType trigger_ui_type, LiteScriptFinishedState event); static void RecordLiteScriptShownToUser(ukm::UkmRecorder* ukm_recorder, content::WebContents* web_contents, + TriggerUIType trigger_ui_type, LiteScriptShownToUser event); static void RecordLiteScriptOnboarding(ukm::UkmRecorder* ukm_recorder, content::WebContents* web_contents, + TriggerUIType trigger_ui_type, LiteScriptOnboarding event); // Intended for debugging: writes string representation of |reason| to |out|.
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto index bb4cbc2..354a798 100644 --- a/components/autofill_assistant/browser/service.proto +++ b/components/autofill_assistant/browser/service.proto
@@ -572,9 +572,24 @@ optional TriggerScriptAction on_swipe_to_dismiss = 4 [default = CANCEL_SESSION]; + // An identifier for the type of trigger UI this trigger represents, for UKM. + optional TriggerUIType trigger_ui_type = 5; + reserved 2; } +// Set of TriggerUIType to group UKM metrics by. +// +// The set of available values is defined by AutofillAssistantTriggerUIType in +// tools/metrics/histograms/enums.xml +enum TriggerUIType { + UNSPECIFIED_TRIGGER_UI_TYPE = 0; + CART_FIRST_TIME_USER = 1; + CART_RETURNING_USER = 2; + CHECKOUT_FIRST_TIME_USER = 3; + CHECKOUT_RETURNING_USER = 4; +} + message TriggerScriptConditionProto { oneof type { // The condition matches if all of these conditions match.
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script.h b/components/autofill_assistant/browser/trigger_scripts/trigger_script.h index 748996a1..bf6b4f9 100644 --- a/components/autofill_assistant/browser/trigger_scripts/trigger_script.h +++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script.h
@@ -33,6 +33,8 @@ bool waiting_for_precondition_no_longer_true() const; void waiting_for_precondition_no_longer_true(bool waiting); + TriggerUIType trigger_ui_type() const { return proto_.trigger_ui_type(); } + private: friend class TriggerScriptTest;
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc index 6a2c10ad..e0ac96f3 100644 --- a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc +++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc
@@ -126,7 +126,7 @@ initial_trigger_condition_evaluations_; Metrics::RecordLiteScriptShownToUser( - ukm_recorder_, web_contents(), + ukm_recorder_, web_contents(), UNSPECIFIED_TRIGGER_UI_TYPE, Metrics::LiteScriptShownToUser::LITE_SCRIPT_RUNNING); StartCheckingTriggerConditions(); } @@ -137,7 +137,7 @@ case TriggerScriptProto::NOT_NOW: if (visible_trigger_script_ != -1) { Metrics::RecordLiteScriptShownToUser( - ukm_recorder_, web_contents(), + ukm_recorder_, web_contents(), GetTriggerUiTypeForVisibleScript(), Metrics::LiteScriptShownToUser::LITE_SCRIPT_NOT_NOW); trigger_scripts_[visible_trigger_script_] ->waiting_for_precondition_no_longer_true(true); @@ -174,36 +174,37 @@ // TODO(b/174445633): Replace -1 with a constant like kTriggerScriptNotVisible // at all relevant places if (visible_trigger_script_ != -1) { + TriggerUIType trigger_ui_type = GetTriggerUiTypeForVisibleScript(); if (onboardingShown) { switch (result) { case OnboardingResult::DISMISSED: Metrics::RecordLiteScriptOnboarding( - ukm_recorder_, web_contents(), + ukm_recorder_, web_contents(), trigger_ui_type, Metrics::LiteScriptOnboarding:: LITE_SCRIPT_ONBOARDING_SEEN_AND_DISMISSED); break; case OnboardingResult::REJECTED: Metrics::RecordLiteScriptOnboarding( - ukm_recorder_, web_contents(), + ukm_recorder_, web_contents(), trigger_ui_type, Metrics::LiteScriptOnboarding:: LITE_SCRIPT_ONBOARDING_SEEN_AND_REJECTED); break; case OnboardingResult::NAVIGATION: Metrics::RecordLiteScriptOnboarding( - ukm_recorder_, web_contents(), + ukm_recorder_, web_contents(), trigger_ui_type, Metrics::LiteScriptOnboarding:: LITE_SCRIPT_ONBOARDING_SEEN_AND_INTERRUPTED_BY_NAVIGATION); break; case OnboardingResult::ACCEPTED: Metrics::RecordLiteScriptOnboarding( - ukm_recorder_, web_contents(), + ukm_recorder_, web_contents(), trigger_ui_type, Metrics::LiteScriptOnboarding:: LITE_SCRIPT_ONBOARDING_SEEN_AND_ACCEPTED); break; } } else { Metrics::RecordLiteScriptOnboarding( - ukm_recorder_, web_contents(), + ukm_recorder_, web_contents(), trigger_ui_type, Metrics::LiteScriptOnboarding:: LITE_SCRIPT_ONBOARDING_ALREADY_ACCEPTED); } @@ -213,6 +214,7 @@ // transition to the regular flow. StopCheckingTriggerConditions(); NotifyOnTriggerScriptFinished( + trigger_ui_type, Metrics::LiteScriptFinishedState::LITE_SCRIPT_PROMPT_SUCCEEDED); } else if (!IsDialogOnboardingEnabled()) { Stop(Metrics::LiteScriptFinishedState:: @@ -228,7 +230,7 @@ return; } Metrics::RecordLiteScriptShownToUser( - ukm_recorder_, web_contents(), + ukm_recorder_, web_contents(), GetTriggerUiTypeForVisibleScript(), Metrics::LiteScriptShownToUser::LITE_SCRIPT_SWIPE_DISMISSED); PerformTriggerScriptAction(trigger_scripts_[visible_trigger_script_] ->AsProto() @@ -270,9 +272,10 @@ void TriggerScriptCoordinator::Stop(Metrics::LiteScriptFinishedState state) { VLOG(2) << "Stopping with status " << state; + TriggerUIType trigger_ui_type = GetTriggerUiTypeForVisibleScript(); HideTriggerScript(); StopCheckingTriggerConditions(); - NotifyOnTriggerScriptFinished(state); + NotifyOnTriggerScriptFinished(trigger_ui_type, state); } void TriggerScriptCoordinator::AddObserver(Observer* observer) { @@ -368,7 +371,7 @@ void TriggerScriptCoordinator::WebContentsDestroyed() { if (!finished_state_recorded_) { Metrics::RecordLiteScriptFinished( - ukm_recorder_, web_contents(), + ukm_recorder_, web_contents(), GetTriggerUiTypeForVisibleScript(), visible_trigger_script_ == -1 ? Metrics::LiteScriptFinishedState:: LITE_SCRIPT_WEB_CONTENTS_DESTROYED_WHILE_INVISIBLE @@ -411,10 +414,13 @@ return; } - Metrics::RecordLiteScriptShownToUser( - ukm_recorder_, web_contents(), - Metrics::LiteScriptShownToUser::LITE_SCRIPT_SHOWN_TO_USER); visible_trigger_script_ = index; + // GetTriggerUiTypeForVisibleScript() requires visible_trigger_script_ to be + // set first thing. + + Metrics::RecordLiteScriptShownToUser( + ukm_recorder_, web_contents(), GetTriggerUiTypeForVisibleScript(), + Metrics::LiteScriptShownToUser::LITE_SCRIPT_SHOWN_TO_USER); auto proto = trigger_scripts_[index]->AsProto().user_interface(); for (Observer& observer : observers_) { observer.OnTriggerScriptShown(proto); @@ -460,7 +466,7 @@ if (visible_trigger_script_ != -1 && !evaluated_trigger_conditions[visible_trigger_script_]) { Metrics::RecordLiteScriptShownToUser( - ukm_recorder_, web_contents(), + ukm_recorder_, web_contents(), GetTriggerUiTypeForVisibleScript(), Metrics::LiteScriptShownToUser:: LITE_SCRIPT_HIDE_ON_TRIGGER_CONDITION_NO_LONGER_TRUE); HideTriggerScript(); @@ -526,10 +532,12 @@ } void TriggerScriptCoordinator::NotifyOnTriggerScriptFinished( + TriggerUIType trigger_ui_type, Metrics::LiteScriptFinishedState state) { if (!finished_state_recorded_) { finished_state_recorded_ = true; - Metrics::RecordLiteScriptFinished(ukm_recorder_, web_contents(), state); + Metrics::RecordLiteScriptFinished(ukm_recorder_, web_contents(), + trigger_ui_type, state); } for (Observer& observer : observers_) { @@ -537,6 +545,15 @@ } } +TriggerUIType TriggerScriptCoordinator::GetTriggerUiTypeForVisibleScript() + const { + if (visible_trigger_script_ >= 0 && + static_cast<size_t>(visible_trigger_script_) < trigger_scripts_.size()) { + return trigger_scripts_[visible_trigger_script_]->trigger_ui_type(); + } + return UNSPECIFIED_TRIGGER_UI_TYPE; +} + GURL TriggerScriptCoordinator::GetCurrentURL() const { GURL current_url = web_contents()->GetLastCommittedURL(); if (current_url.is_empty()) {
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.h b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.h index 8550c78..b66abab4 100644 --- a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.h +++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.h
@@ -132,7 +132,14 @@ // previous results to reuse. void RunOutOfScheduleTriggerConditionCheck(); - void NotifyOnTriggerScriptFinished(Metrics::LiteScriptFinishedState state); + void NotifyOnTriggerScriptFinished(TriggerUIType trigger_ui_type, + Metrics::LiteScriptFinishedState state); + + // Value of trigger_ui_type for the currently visible script, if there is one. + // + // When recording a hide or stop action, be sure to capture the type before + // hiding the script. + TriggerUIType GetTriggerUiTypeForVisibleScript() const; // Used to query login information for the current webcontents. WebsiteLoginManager* website_login_manager_;
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 b409862..16c825d 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
@@ -119,17 +119,23 @@ content::WebContentsTester::For(web_contents())->TestSetIsLoading(false); } - void AssertRecordedFinishedState(Metrics::LiteScriptFinishedState state) { + void AssertRecordedFinishedState(TriggerUIType type, + Metrics::LiteScriptFinishedState state) { auto entries = ukm_recorder_.GetEntriesByName("AutofillAssistant.LiteScriptFinished"); ASSERT_THAT(entries.size(), Eq(1u)); ukm_recorder_.ExpectEntrySourceHasUrl( entries[0], web_contents()->GetLastCommittedURL()); + EXPECT_EQ(*ukm_recorder_.GetEntryMetric(entries[0], "TriggerUIType"), + static_cast<int64_t>(type)); EXPECT_EQ(*ukm_recorder_.GetEntryMetric(entries[0], "LiteScriptFinished"), static_cast<int64_t>(state)); } - void AssertRecordedShownToUserState(Metrics::LiteScriptShownToUser state, + // Make sure that an UKM entry with |state| has been recorded + // |expected_times|, and has been associated each time with |type|. + void AssertRecordedShownToUserState(TriggerUIType type, + Metrics::LiteScriptShownToUser state, int expected_times) { auto entries = ukm_recorder_.GetEntriesByName( "AutofillAssistant.LiteScriptShownToUser"); @@ -139,6 +145,8 @@ for (const auto* entry : entries) { if (*ukm_recorder_.GetEntryMetric(entry, "LiteScriptShownToUser") == static_cast<int64_t>(state)) { + EXPECT_EQ(*ukm_recorder_.GetEntryMetric(entry, "TriggerUIType"), + static_cast<int64_t>(type)); actual_times++; } } @@ -146,6 +154,7 @@ } void AssertRecordedLiteScriptOnboardingState( + TriggerUIType type, Metrics::LiteScriptOnboarding state, int expected_times) { auto entries = ukm_recorder_.GetEntriesByName( @@ -156,6 +165,8 @@ for (const auto* entry : entries) { if (*ukm_recorder_.GetEntryMetric(entry, "LiteScriptOnboarding") == static_cast<int64_t>(state)) { + EXPECT_EQ(*ukm_recorder_.GetEntryMetric(entry, "TriggerUIType"), + static_cast<int64_t>(type)); actual_times++; } } @@ -227,6 +238,7 @@ coordinator_->Start(GURL(kFakeDeepLink), std::make_unique<TriggerContextImpl>()); AssertRecordedFinishedState( + UNSPECIFIED_TRIGGER_UI_TYPE, Metrics::LiteScriptFinishedState::LITE_SCRIPT_GET_ACTIONS_FAILED); } @@ -239,6 +251,7 @@ coordinator_->Start(GURL(kFakeDeepLink), std::make_unique<TriggerContextImpl>()); AssertRecordedFinishedState( + UNSPECIFIED_TRIGGER_UI_TYPE, Metrics::LiteScriptFinishedState::LITE_SCRIPT_GET_ACTIONS_PARSE_ERROR); } @@ -250,7 +263,8 @@ LITE_SCRIPT_NO_TRIGGER_SCRIPT_AVAILABLE)); coordinator_->Start(GURL(kFakeDeepLink), std::make_unique<TriggerContextImpl>()); - AssertRecordedFinishedState(Metrics::LiteScriptFinishedState:: + AssertRecordedFinishedState(UNSPECIFIED_TRIGGER_UI_TYPE, + Metrics::LiteScriptFinishedState:: LITE_SCRIPT_NO_TRIGGER_SCRIPT_AVAILABLE); } @@ -410,9 +424,10 @@ TEST_F(TriggerScriptCoordinatorTest, PerformTriggerScriptActionCancelSession) { GetTriggerScriptsResponseProto response; - *response.add_trigger_scripts() - ->mutable_trigger_condition() - ->mutable_selector() = ToSelectorProto("#selector"); + TriggerScriptProto* script = response.add_trigger_scripts(); + *script->mutable_trigger_condition()->mutable_selector() = + ToSelectorProto("#selector"); + script->set_trigger_ui_type(CART_RETURNING_USER); std::string serialized_response; response.SerializeToString(&serialized_response); @@ -434,15 +449,17 @@ .Times(1); EXPECT_CALL(mock_observer_, OnTriggerScriptHidden).Times(1); coordinator_->PerformTriggerScriptAction(TriggerScriptProto::CANCEL_SESSION); - AssertRecordedFinishedState(Metrics::LiteScriptFinishedState:: + AssertRecordedFinishedState(CART_RETURNING_USER, + Metrics::LiteScriptFinishedState:: LITE_SCRIPT_PROMPT_FAILED_CANCEL_SESSION); } TEST_F(TriggerScriptCoordinatorTest, PerformTriggerScriptActionCancelForever) { GetTriggerScriptsResponseProto response; - *response.add_trigger_scripts() - ->mutable_trigger_condition() - ->mutable_selector() = ToSelectorProto("#selector"); + TriggerScriptProto* script = response.add_trigger_scripts(); + *script->mutable_trigger_condition()->mutable_selector() = + ToSelectorProto("#selector"); + script->set_trigger_ui_type(CART_RETURNING_USER); std::string serialized_response; response.SerializeToString(&serialized_response); @@ -464,15 +481,17 @@ .Times(1); EXPECT_CALL(mock_observer_, OnTriggerScriptHidden).Times(1); coordinator_->PerformTriggerScriptAction(TriggerScriptProto::CANCEL_FOREVER); - AssertRecordedFinishedState(Metrics::LiteScriptFinishedState:: + AssertRecordedFinishedState(CART_RETURNING_USER, + Metrics::LiteScriptFinishedState:: LITE_SCRIPT_PROMPT_FAILED_CANCEL_FOREVER); } TEST_F(TriggerScriptCoordinatorTest, PerformTriggerScriptActionAccept) { GetTriggerScriptsResponseProto response; - *response.add_trigger_scripts() - ->mutable_trigger_condition() - ->mutable_selector() = ToSelectorProto("#selector"); + TriggerScriptProto* script = response.add_trigger_scripts(); + *script->mutable_trigger_condition()->mutable_selector() = + ToSelectorProto("#selector"); + script->set_trigger_ui_type(CHECKOUT_RETURNING_USER); std::string serialized_response; response.SerializeToString(&serialized_response); @@ -494,9 +513,10 @@ TEST_F(TriggerScriptCoordinatorTest, CancelOnNavigateAway) { GetTriggerScriptsResponseProto response; response.add_additional_allowed_domains("other-example.com"); - *response.add_trigger_scripts() - ->mutable_trigger_condition() - ->mutable_selector() = ToSelectorProto("#selector"); + TriggerScriptProto* script = response.add_trigger_scripts(); + *script->mutable_trigger_condition()->mutable_selector() = + ToSelectorProto("#selector"); + script->set_trigger_ui_type(CART_RETURNING_USER); std::string serialized_response; response.SerializeToString(&serialized_response); @@ -523,7 +543,7 @@ SimulateNavigateToUrl(GURL("https://other-example.com/page")); // Navigating to subdomain of whitelisted domain is ok. - SimulateNavigateToUrl(GURL("https://other-example.com/page")); + SimulateNavigateToUrl(GURL("https://subdomain.other-example.com/page")); // Navigating to non-whitelisted domain is not ok. EXPECT_CALL( @@ -533,14 +553,16 @@ .Times(1); SimulateNavigateToUrl(GURL("https://example.different.com/page")); AssertRecordedFinishedState( + CART_RETURNING_USER, Metrics::LiteScriptFinishedState::LITE_SCRIPT_PROMPT_FAILED_NAVIGATE); } TEST_F(TriggerScriptCoordinatorTest, IgnoreNavigationEventsWhileNotStarted) { GetTriggerScriptsResponseProto response; - *response.add_trigger_scripts() - ->mutable_trigger_condition() - ->mutable_selector() = ToSelectorProto("#selector"); + TriggerScriptProto* script = response.add_trigger_scripts(); + *script->mutable_trigger_condition()->mutable_selector() = + ToSelectorProto("#selector"); + script->set_trigger_ui_type(CART_RETURNING_USER); std::string serialized_response; response.SerializeToString(&serialized_response); @@ -577,14 +599,16 @@ LITE_SCRIPT_NO_TRIGGER_SCRIPT_AVAILABLE)) .Times(1); SimulateWebContentsVisibilityChanged(content::Visibility::VISIBLE); - AssertRecordedFinishedState(Metrics::LiteScriptFinishedState:: + AssertRecordedFinishedState(UNSPECIFIED_TRIGGER_UI_TYPE, + Metrics::LiteScriptFinishedState:: LITE_SCRIPT_NO_TRIGGER_SCRIPT_AVAILABLE); } TEST_F(TriggerScriptCoordinatorTest, BottomSheetClosedWithSwipe) { GetTriggerScriptsResponseProto response; - response.add_trigger_scripts()->set_on_swipe_to_dismiss( - TriggerScriptProto::NOT_NOW); + TriggerScriptProto* script = response.add_trigger_scripts(); + script->set_on_swipe_to_dismiss(TriggerScriptProto::NOT_NOW); + script->set_trigger_ui_type(CART_RETURNING_USER); std::string serialized_response; response.SerializeToString(&serialized_response); @@ -601,14 +625,16 @@ EXPECT_CALL(mock_observer_, OnTriggerScriptHidden).Times(1); coordinator_->OnBottomSheetClosedWithSwipe(); AssertRecordedShownToUserState( + CART_RETURNING_USER, Metrics::LiteScriptShownToUser::LITE_SCRIPT_SWIPE_DISMISSED, 1); } TEST_F(TriggerScriptCoordinatorTest, TimeoutAfterInvisibleForTooLong) { GetTriggerScriptsResponseProto response; - *response.add_trigger_scripts() - ->mutable_trigger_condition() - ->mutable_selector() = ToSelectorProto("#selector"); + TriggerScriptProto* script = response.add_trigger_scripts(); + *script->mutable_trigger_condition()->mutable_selector() = + ToSelectorProto("#selector"); + script->set_trigger_ui_type(CHECKOUT_RETURNING_USER); response.set_timeout_ms(3000); response.set_trigger_condition_check_interval_ms(1000); std::string serialized_response; @@ -637,14 +663,16 @@ LITE_SCRIPT_TRIGGER_CONDITION_TIMEOUT)); task_environment()->FastForwardBy(base::TimeDelta::FromSeconds(1)); AssertRecordedFinishedState( + UNSPECIFIED_TRIGGER_UI_TYPE, Metrics::LiteScriptFinishedState::LITE_SCRIPT_TRIGGER_CONDITION_TIMEOUT); } TEST_F(TriggerScriptCoordinatorTest, TimeoutResetsAfterTriggerScriptShown) { GetTriggerScriptsResponseProto response; - *response.add_trigger_scripts() - ->mutable_trigger_condition() - ->mutable_selector() = ToSelectorProto("#selector"); + TriggerScriptProto* script = response.add_trigger_scripts(); + *script->mutable_trigger_condition()->mutable_selector() = + ToSelectorProto("#selector"); + script->set_trigger_ui_type(CART_RETURNING_USER); response.set_timeout_ms(3000); response.set_trigger_condition_check_interval_ms(1000); std::string serialized_response; @@ -682,6 +710,7 @@ LITE_SCRIPT_TRIGGER_CONDITION_TIMEOUT)); task_environment()->FastForwardBy(base::TimeDelta::FromSeconds(1)); AssertRecordedFinishedState( + UNSPECIFIED_TRIGGER_UI_TYPE, Metrics::LiteScriptFinishedState::LITE_SCRIPT_TRIGGER_CONDITION_TIMEOUT); } @@ -758,6 +787,7 @@ LITE_SCRIPT_TRIGGER_CONDITION_TIMEOUT)); task_environment()->FastForwardBy(base::TimeDelta::FromSeconds(1)); AssertRecordedFinishedState( + UNSPECIFIED_TRIGGER_UI_TYPE, Metrics::LiteScriptFinishedState::LITE_SCRIPT_TRIGGER_CONDITION_TIMEOUT); } @@ -856,7 +886,8 @@ TEST_F(TriggerScriptCoordinatorTest, OnTriggerScriptFailedToShow) { GetTriggerScriptsResponseProto response; - response.add_trigger_scripts(); + TriggerScriptProto* script = response.add_trigger_scripts(); + script->set_trigger_ui_type(CART_RETURNING_USER); std::string serialized_response; response.SerializeToString(&serialized_response); @@ -878,6 +909,7 @@ coordinator_->Start(GURL(kFakeDeepLink), std::make_unique<TriggerContextImpl>()); AssertRecordedFinishedState( + CART_RETURNING_USER, Metrics::LiteScriptFinishedState::LITE_SCRIPT_FAILED_TO_SHOW); } @@ -905,7 +937,8 @@ LITE_SCRIPT_DISABLED_PROACTIVE_HELP_SETTING)); coordinator_->OnProactiveHelpSettingChanged( /* proactive_help_enabled = */ false); - AssertRecordedFinishedState(Metrics::LiteScriptFinishedState:: + AssertRecordedFinishedState(UNSPECIFIED_TRIGGER_UI_TYPE, + Metrics::LiteScriptFinishedState:: LITE_SCRIPT_DISABLED_PROACTIVE_HELP_SETTING); } @@ -959,7 +992,8 @@ TEST_F(TriggerScriptCoordinatorTest, OnboardingShownAndAccepted) { GetTriggerScriptsResponseProto response; - response.add_trigger_scripts(); + auto* script = response.add_trigger_scripts(); + script->set_trigger_ui_type(CART_RETURNING_USER); std::string serialized_response; response.SerializeToString(&serialized_response); @@ -984,9 +1018,11 @@ /* result= */ OnboardingResult::ACCEPTED); AssertRecordedLiteScriptOnboardingState( + CART_RETURNING_USER, Metrics::LiteScriptOnboarding::LITE_SCRIPT_ONBOARDING_SEEN_AND_ACCEPTED, 1); AssertRecordedFinishedState( + CART_RETURNING_USER, Metrics::LiteScriptFinishedState::LITE_SCRIPT_PROMPT_SUCCEEDED); } @@ -995,7 +1031,8 @@ auto feature_list = CreateScopedFeatureList(/* dialog_onboarding= */ true); GetTriggerScriptsResponseProto response; - response.add_trigger_scripts(); + auto* script = response.add_trigger_scripts(); + script->set_trigger_ui_type(CART_RETURNING_USER); std::string serialized_response; response.SerializeToString(&serialized_response); @@ -1029,16 +1066,20 @@ /* result= */ OnboardingResult::ACCEPTED); AssertRecordedLiteScriptOnboardingState( + CART_RETURNING_USER, Metrics::LiteScriptOnboarding::LITE_SCRIPT_ONBOARDING_SEEN_AND_REJECTED, 1); AssertRecordedLiteScriptOnboardingState( + CART_RETURNING_USER, Metrics::LiteScriptOnboarding::LITE_SCRIPT_ONBOARDING_SEEN_AND_ACCEPTED, 1); AssertRecordedLiteScriptOnboardingState( + CART_RETURNING_USER, Metrics::LiteScriptOnboarding:: LITE_SCRIPT_ONBOARDING_SEEN_AND_INTERRUPTED_BY_NAVIGATION, 1); AssertRecordedFinishedState( + CART_RETURNING_USER, Metrics::LiteScriptFinishedState::LITE_SCRIPT_PROMPT_SUCCEEDED); } @@ -1047,7 +1088,8 @@ auto feature_list = CreateScopedFeatureList(/* dialog_onboarding= */ false); GetTriggerScriptsResponseProto response; - response.add_trigger_scripts(); + auto* script = response.add_trigger_scripts(); + script->set_trigger_ui_type(CART_RETURNING_USER); std::string serialized_response; response.SerializeToString(&serialized_response); @@ -1073,15 +1115,18 @@ /* result= */ OnboardingResult::REJECTED); AssertRecordedLiteScriptOnboardingState( + CART_RETURNING_USER, Metrics::LiteScriptOnboarding::LITE_SCRIPT_ONBOARDING_SEEN_AND_REJECTED, 1); - AssertRecordedFinishedState(Metrics::LiteScriptFinishedState:: + AssertRecordedFinishedState(CART_RETURNING_USER, + Metrics::LiteScriptFinishedState:: LITE_SCRIPT_BOTTOMSHEET_ONBOARDING_REJECTED); } TEST_F(TriggerScriptCoordinatorTest, OnboardingNotShown) { GetTriggerScriptsResponseProto response; - response.add_trigger_scripts(); + auto* script = response.add_trigger_scripts(); + script->set_trigger_ui_type(CART_RETURNING_USER); std::string serialized_response; response.SerializeToString(&serialized_response); @@ -1106,9 +1151,11 @@ /* result= */ OnboardingResult::ACCEPTED); AssertRecordedLiteScriptOnboardingState( + CART_RETURNING_USER, Metrics::LiteScriptOnboarding::LITE_SCRIPT_ONBOARDING_ALREADY_ACCEPTED, 1); AssertRecordedFinishedState( + CART_RETURNING_USER, Metrics::LiteScriptFinishedState::LITE_SCRIPT_PROMPT_SUCCEEDED); }
diff --git a/components/crx_file/crx_verifier.cc b/components/crx_file/crx_verifier.cc index 4a1a752..df9bcc6 100644 --- a/components/crx_file/crx_verifier.cc +++ b/components/crx_file/crx_verifier.cc
@@ -4,6 +4,7 @@ #include "components/crx_file/crx_verifier.h" +#include <climits> #include <cstring> #include <iterator> #include <memory> @@ -15,6 +16,7 @@ #include "base/callback.h" #include "base/files/file.h" #include "base/files/file_path.h" +#include "base/numerics/safe_conversions.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "components/crx_file/crx3.pb.h" @@ -29,9 +31,6 @@ namespace { -// The maximum size the Crx3 parser will tolerate for a header. -constexpr uint32_t kMaxHeaderSize = 1 << 18; - // The SHA256 hash of the DER SPKI "ecdsa_2017_public" Crx3 key. constexpr uint8_t kPublisherKeyHash[] = { 0x61, 0xf7, 0xf2, 0xa6, 0xbf, 0xcf, 0x74, 0xcd, 0x0b, 0xc1, 0xfe, @@ -102,14 +101,15 @@ bool require_publisher_key, bool accept_publisher_test_key) { // Parse [header-size] and [header]. - const uint32_t header_size = ReadAndHashLittleEndianUInt32(file, hash); - if (header_size > kMaxHeaderSize) + int header_size = + base::saturated_cast<int>(ReadAndHashLittleEndianUInt32(file, hash)); + if (header_size == INT_MAX) return VerifierResult::ERROR_HEADER_INVALID; std::vector<uint8_t> header_bytes(header_size); - // Assuming kMaxHeaderSize can fit in an int, the following cast is safe. if (ReadAndHashBuffer(header_bytes.data(), header_size, file, hash) != - static_cast<int>(header_size)) + header_size) { return VerifierResult::ERROR_HEADER_INVALID; + } CrxFileHeader header; if (!header.ParseFromArray(header_bytes.data(), header_size)) return VerifierResult::ERROR_HEADER_INVALID;
diff --git a/components/embedder_support/android/metrics/android_metrics_service_client.cc b/components/embedder_support/android/metrics/android_metrics_service_client.cc index 907f3cf..b2913a5 100644 --- a/components/embedder_support/android/metrics/android_metrics_service_client.cc +++ b/components/embedder_support/android/metrics/android_metrics_service_client.cc
@@ -6,6 +6,7 @@ #include <jni.h> #include <cstdint> +#include <string> #include "base/android/jni_android.h" #include "base/android/jni_string.h" @@ -244,7 +245,7 @@ pref_service_ = pref_service; metrics_state_manager_ = - MetricsStateManager::Create(pref_service_, this, base::string16(), + MetricsStateManager::Create(pref_service_, this, std::wstring(), base::BindRepeating(&StoreClientInfo), base::BindRepeating(&LoadClientInfo));
diff --git a/components/exo/fullscreen_shell_surface.cc b/components/exo/fullscreen_shell_surface.cc index c2c1d350..e56ff328 100644 --- a/components/exo/fullscreen_shell_surface.cc +++ b/components/exo/fullscreen_shell_surface.cc
@@ -100,7 +100,7 @@ if (root_surface()) root_surface()->RemoveSurfaceObserver(this); SetRootSurface(surface); - SetShellMainSurface(widget_->GetNativeWindow(), root_surface()); + SetShellRootSurface(widget_->GetNativeWindow(), root_surface()); if (surface) { surface->AddSurfaceObserver(this); host_window()->Show(); @@ -162,7 +162,7 @@ SetRootSurface(nullptr); if (widget_) - SetShellMainSurface(widget_->GetNativeWindow(), nullptr); + SetShellRootSurface(widget_->GetNativeWindow(), nullptr); // Hide widget before surface is destroyed. This allows hide animations to // run using the current surface contents. @@ -293,7 +293,7 @@ SetShellApplicationId(window, application_id_); SetShellStartupId(window, startup_id_); - SetShellMainSurface(window, root_surface()); + SetShellRootSurface(window, root_surface()); window->AddObserver(this); }
diff --git a/components/exo/gaming_seat.cc b/components/exo/gaming_seat.cc index 72ea93e..655aff3 100644 --- a/components/exo/gaming_seat.cc +++ b/components/exo/gaming_seat.cc
@@ -43,7 +43,7 @@ if (!target) { aura::Window* top_level_window = gained_focus->GetToplevelWindow(); if (top_level_window) - target = GetShellMainSurface(top_level_window); + target = GetShellRootSurface(top_level_window); } }
diff --git a/components/exo/keyboard.cc b/components/exo/keyboard.cc index dd74e6d..ca124fa 100644 --- a/components/exo/keyboard.cc +++ b/components/exo/keyboard.cc
@@ -232,7 +232,7 @@ if (!focus_) return; - DCHECK(GetShellMainSurface(static_cast<aura::Window*>(event->target())) || + DCHECK(GetShellRootSurface(static_cast<aura::Window*>(event->target())) || Surface::AsSurface(static_cast<aura::Window*>(event->target()))); // Ignore synthetic key repeat events.
diff --git a/components/exo/shell_surface_base.cc b/components/exo/shell_surface_base.cc index 6b74939..0a81339c 100644 --- a/components/exo/shell_surface_base.cc +++ b/components/exo/shell_surface_base.cc
@@ -200,7 +200,7 @@ if (IsInResizeHandle(window, event, local_point)) return true; - Surface* surface = GetShellMainSurface(window); + Surface* surface = GetShellRootSurface(window); if (!surface) return false; @@ -663,7 +663,7 @@ SetRootSurface(nullptr); if (widget_) - SetShellMainSurface(widget_->GetNativeWindow(), nullptr); + SetShellRootSurface(widget_->GetNativeWindow(), nullptr); // Hide widget before surface is destroyed. This allows hide animations to // run using the current surface contents. @@ -915,7 +915,7 @@ /*for_creation=*/true, params.init_properties_container); SetShellApplicationId(¶ms.init_properties_container, application_id_); - SetShellMainSurface(¶ms.init_properties_container, root_surface()); + SetShellRootSurface(¶ms.init_properties_container, root_surface()); SetShellStartupId(¶ms.init_properties_container, startup_id_); bool activatable = activatable_;
diff --git a/components/exo/shell_surface_util.cc b/components/exo/shell_surface_util.cc index 93abef8..313ef1ee6 100644 --- a/components/exo/shell_surface_util.cc +++ b/components/exo/shell_surface_util.cc
@@ -32,7 +32,7 @@ namespace { -DEFINE_UI_CLASS_PROPERTY_KEY(Surface*, kMainSurfaceKey, nullptr) +DEFINE_UI_CLASS_PROPERTY_KEY(Surface*, kRootSurfaceKey, nullptr) // Application Id set by the client. For example: // "org.chromium.arc.<task-id>" for ARC++ shell surfaces. @@ -136,18 +136,18 @@ return id; } -void SetShellMainSurface(ui::PropertyHandler* property_handler, +void SetShellRootSurface(ui::PropertyHandler* property_handler, Surface* surface) { - property_handler->SetProperty(kMainSurfaceKey, surface); + property_handler->SetProperty(kRootSurfaceKey, surface); } -Surface* GetShellMainSurface(const aura::Window* window) { - return window->GetProperty(kMainSurfaceKey); +Surface* GetShellRootSurface(const aura::Window* window) { + return window->GetProperty(kRootSurfaceKey); } ShellSurfaceBase* GetShellSurfaceBaseForWindow(aura::Window* window) { // Only windows with a surface can have a shell surface. - if (!GetShellMainSurface(window)) + if (!GetShellRootSurface(window)) return nullptr; views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window); if (!widget) @@ -164,14 +164,14 @@ static_cast<aura::Window*>(original_event->target())); } - Surface* main_surface = GetShellMainSurface(window); + Surface* root_surface = GetShellRootSurface(window); // Skip if the event is captured by non exo windows. - if (!main_surface) { + if (!root_surface) { auto* widget = views::Widget::GetTopLevelWidgetForNativeView(window); if (!widget) return nullptr; - main_surface = GetShellMainSurface(widget->GetNativeWindow()); - if (!main_surface) + root_surface = GetShellRootSurface(widget->GetNativeWindow()); + if (!root_surface) return nullptr; } @@ -213,7 +213,7 @@ aura::Window* parent_window = wm::GetTransientParent(window); if (!parent_window) - return main_surface; + return root_surface; event->set_location_f(location_in_target_f); event_target->ConvertEventToTarget(parent_window, event);
diff --git a/components/exo/shell_surface_util.h b/components/exo/shell_surface_util.h index 5dde84c..765bc0e 100644 --- a/components/exo/shell_surface_util.h +++ b/components/exo/shell_surface_util.h
@@ -57,13 +57,13 @@ const base::Optional<int32_t> GetShellClientAccessibilityId( aura::Window* window); -// Sets the main surface to the property handler. -void SetShellMainSurface(ui::PropertyHandler* property_handler, +// Sets the root surface to the property handler. +void SetShellRootSurface(ui::PropertyHandler* property_handler, Surface* surface); // Returns the main Surface instance or nullptr if it is not set. // |window| must not be nullptr. -Surface* GetShellMainSurface(const aura::Window* window); +Surface* GetShellRootSurface(const aura::Window* window); // Returns the ShellSurfaceBase for the given |window|, or nullptr if no such // surface exists.
diff --git a/components/exo/ui_lock_controller.cc b/components/exo/ui_lock_controller.cc index 2897354..54c8c58 100644 --- a/components/exo/ui_lock_controller.cc +++ b/components/exo/ui_lock_controller.cc
@@ -39,7 +39,7 @@ void UILockController::OnKeyEvent(ui::KeyEvent* event) { // If the event target is not an exo::Surface, let another handler process the // event. - if (!GetShellMainSurface(static_cast<aura::Window*>(event->target())) && + if (!GetShellRootSurface(static_cast<aura::Window*>(event->target())) && !Surface::AsSurface(static_cast<aura::Window*>(event->target()))) { return; }
diff --git a/components/exo/wayland/zcr_remote_shell.cc b/components/exo/wayland/zcr_remote_shell.cc index 8116d75..806c088 100644 --- a/components/exo/wayland/zcr_remote_shell.cc +++ b/components/exo/wayland/zcr_remote_shell.cc
@@ -59,7 +59,7 @@ Surface* FindRootSurface(aura::Window* window) { if (!window) return nullptr; - Surface* root = GetShellMainSurface(window); + Surface* root = GetShellRootSurface(window); if (root) return root; root = Surface::AsSurface(window);
diff --git a/components/feed/core/v2/config.h b/components/feed/core/v2/config.h index c876a96..1f375149 100644 --- a/components/feed/core/v2/config.h +++ b/components/feed/core/v2/config.h
@@ -18,7 +18,7 @@ int max_feed_query_requests_per_day = 20; int max_action_upload_requests_per_day = 20; // We'll always attempt to refresh content older than this. - base::TimeDelta stale_content_threshold = base::TimeDelta::FromHours(24); + base::TimeDelta stale_content_threshold = base::TimeDelta::FromHours(4); // Content older than this threshold will not be shown to the user. base::TimeDelta content_expiration_threshold = base::TimeDelta::FromHours(48); // How long the window is for background refresh tasks. If the task cannot be
diff --git a/components/feed/core/v2/feed_stream_unittest.cc b/components/feed/core/v2/feed_stream_unittest.cc index 49d5b365..07d3c5e 100644 --- a/components/feed/core/v2/feed_stream_unittest.cc +++ b/components/feed/core/v2/feed_stream_unittest.cc
@@ -1348,11 +1348,12 @@ TEST_F(FeedStreamTest, LoadStreamFromStore) { // Fill the store with stream data that is just barely fresh, and verify it // loads. - store_->OverwriteStream(MakeTypicalInitialModelState( - /*first_cluster_id=*/0, - kTestTimeEpoch - base::TimeDelta::FromHours(12) + - base::TimeDelta::FromMinutes(1)), - base::DoNothing()); + store_->OverwriteStream( + MakeTypicalInitialModelState( + /*first_cluster_id=*/0, kTestTimeEpoch - + GetFeedConfig().stale_content_threshold + + base::TimeDelta::FromMinutes(1)), + base::DoNothing()); TestSurface surface(stream_.get()); WaitForIdleTaskQueue();
diff --git a/components/feed/feed_feature_list.cc b/components/feed/feed_feature_list.cc index 7b42df4b..d3c1ae7 100644 --- a/components/feed/feed_feature_list.cc +++ b/components/feed/feed_feature_list.cc
@@ -16,7 +16,7 @@ // InterestFeedV2 is cached in ChromeCachedFlags. If the default value here is // changed, please update the cached one's default value in CachedFeatureFlags. const base::Feature kInterestFeedV2{"InterestFeedV2", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kInterestFeedV2Hearts{"InterestFeedV2Hearts", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -55,8 +55,7 @@ const base::Feature kXsurfaceMetricsReporting{ "XsurfaceMetricsReporting", base::FEATURE_DISABLED_BY_DEFAULT}; -const char kDefaultReferrerUrl[] = - "https://www.googleapis.com/auth/chrome-content-suggestions"; +const char kDefaultReferrerUrl[] = "https://www.google.com/"; std::string GetFeedReferrerUrl() { const base::Feature* feature = base::FeatureList::IsEnabled(kInterestFeedV2)
diff --git a/components/media_message_center/media_notification_view_modern_impl.cc b/components/media_message_center/media_notification_view_modern_impl.cc index 4974300c..3cdf83d1 100644 --- a/components/media_message_center/media_notification_view_modern_impl.cc +++ b/components/media_message_center/media_notification_view_modern_impl.cc
@@ -26,6 +26,7 @@ #include "ui/views/border.h" #include "ui/views/controls/button/image_button_factory.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/metadata/metadata_header_macros.h" #include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/style/typography.h" #include "ui/views/view_class_properties.h" @@ -62,12 +63,17 @@ // An image view with a rounded rectangle vignette class MediaArtworkView : public views::ImageView { public: + METADATA_HEADER(MediaArtworkView); explicit MediaArtworkView(float corner_radius) : corner_radius_(corner_radius) {} void SetVignetteColor(const SkColor& vignette_color) { + if (vignette_color_ == vignette_color) + return; vignette_color_ = vignette_color; + OnPropertyChanged(&vignette_color_, views::kPropertyEffectsPaint); } + SkColor GetVignetteColor() const { return vignette_color_; } // ImageView void OnPaint(gfx::Canvas* canvas) override; @@ -77,6 +83,10 @@ float corner_radius_; }; +BEGIN_METADATA(MediaArtworkView, views::ImageView) +ADD_PROPERTY_METADATA(SkColor, VignetteColor) +END_METADATA + void MediaArtworkView::OnPaint(gfx::Canvas* canvas) { views::ImageView::OnPaint(canvas); auto path = SkPath().addRoundRect(RectToSkRect(GetLocalBounds()),
diff --git a/components/metrics/clean_exit_beacon.cc b/components/metrics/clean_exit_beacon.cc index 05ca59a..a6c0904 100644 --- a/components/metrics/clean_exit_beacon.cc +++ b/components/metrics/clean_exit_beacon.cc
@@ -20,7 +20,7 @@ namespace metrics { -CleanExitBeacon::CleanExitBeacon(const base::string16& backup_registry_key, +CleanExitBeacon::CleanExitBeacon(const std::wstring& backup_registry_key, PrefService* local_state) : local_state_(local_state), initial_value_(local_state->GetBoolean(prefs::kStabilityExitedCleanly)), @@ -45,7 +45,7 @@ base::win::RegKey regkey; DWORD value = 0u; - if (regkey.Open(HKEY_CURRENT_USER, base::as_wcstr(backup_registry_key_), + if (regkey.Open(HKEY_CURRENT_USER, backup_registry_key_.c_str(), KEY_ALL_ACCESS) == ERROR_SUCCESS && regkey.ReadValueDW( base::ASCIIToWide(prefs::kStabilityExitedCleanly).c_str(), &value) == @@ -80,7 +80,7 @@ #if defined(OS_WIN) base::win::RegKey regkey; - if (regkey.Create(HKEY_CURRENT_USER, base::as_wcstr(backup_registry_key_), + if (regkey.Create(HKEY_CURRENT_USER, backup_registry_key_.c_str(), KEY_ALL_ACCESS) == ERROR_SUCCESS) { regkey.WriteValue(base::ASCIIToWide(prefs::kStabilityExitedCleanly).c_str(), value ? 1u : 0u);
diff --git a/components/metrics/clean_exit_beacon.h b/components/metrics/clean_exit_beacon.h index 00435967..28f1ae7 100644 --- a/components/metrics/clean_exit_beacon.h +++ b/components/metrics/clean_exit_beacon.h
@@ -5,8 +5,9 @@ #ifndef COMPONENTS_METRICS_CLEAN_EXIT_BEACON_H_ #define COMPONENTS_METRICS_CLEAN_EXIT_BEACON_H_ +#include <string> + #include "base/macros.h" -#include "base/strings/string16.h" #include "base/time/time.h" class PrefRegistrySimple; @@ -22,9 +23,8 @@ // |local_state| must be fully initialized. // On Windows, |backup_registry_key| is used to store a backup of the beacon. // It is ignored on other platforms. - CleanExitBeacon( - const base::string16& backup_registry_key, - PrefService* local_state); + CleanExitBeacon(const std::wstring& backup_registry_key, + PrefService* local_state); ~CleanExitBeacon(); @@ -53,7 +53,7 @@ // time of construction. It notes a timestamp from the previous browser // session when the browser was known to be alive. const base::Time initial_browser_last_live_timestamp_; - const base::string16 backup_registry_key_; + const std::wstring backup_registry_key_; DISALLOW_COPY_AND_ASSIGN(CleanExitBeacon); };
diff --git a/components/metrics/metrics_service_unittest.cc b/components/metrics/metrics_service_unittest.cc index b159eb1f..a7d1bd86 100644 --- a/components/metrics/metrics_service_unittest.cc +++ b/components/metrics/metrics_service_unittest.cc
@@ -146,7 +146,7 @@ // stability state from prefs after tests have a chance to initialize it. if (!metrics_state_manager_) { metrics_state_manager_ = MetricsStateManager::Create( - GetLocalState(), enabled_state_provider_.get(), base::string16(), + GetLocalState(), enabled_state_provider_.get(), std::wstring(), base::BindRepeating(&StoreNoClientInfoBackup), base::BindRepeating(&ReturnNoBackup)); }
diff --git a/components/metrics/metrics_state_manager.cc b/components/metrics/metrics_state_manager.cc index b093e6e..44f3df5 100644 --- a/components/metrics/metrics_state_manager.cc +++ b/components/metrics/metrics_state_manager.cc
@@ -8,6 +8,7 @@ #include <cstdint> #include <limits> #include <memory> +#include <string> #include <utility> #include "base/guid.h" @@ -141,7 +142,7 @@ MetricsStateManager::MetricsStateManager( PrefService* local_state, EnabledStateProvider* enabled_state_provider, - const base::string16& backup_registry_key, + const std::wstring& backup_registry_key, StoreClientInfoCallback store_client_info, LoadClientInfoCallback retrieve_client_info) : local_state_(local_state), @@ -328,7 +329,7 @@ std::unique_ptr<MetricsStateManager> MetricsStateManager::Create( PrefService* local_state, EnabledStateProvider* enabled_state_provider, - const base::string16& backup_registry_key, + const std::wstring& backup_registry_key, StoreClientInfoCallback store_client_info, LoadClientInfoCallback retrieve_client_info) { std::unique_ptr<MetricsStateManager> result;
diff --git a/components/metrics/metrics_state_manager.h b/components/metrics/metrics_state_manager.h index 1f6b5822..d44bac0 100644 --- a/components/metrics/metrics_state_manager.h +++ b/components/metrics/metrics_state_manager.h
@@ -104,7 +104,7 @@ static std::unique_ptr<MetricsStateManager> Create( PrefService* local_state, EnabledStateProvider* enabled_state_provider, - const base::string16& backup_registry_key, + const std::wstring& backup_registry_key, StoreClientInfoCallback store_client_info, LoadClientInfoCallback load_client_info); @@ -140,7 +140,7 @@ // that it is later retrievable by |load_client_info|. MetricsStateManager(PrefService* local_state, EnabledStateProvider* enabled_state_provider, - const base::string16& backup_registry_key, + const std::wstring& backup_registry_key, StoreClientInfoCallback store_client_info, LoadClientInfoCallback load_client_info);
diff --git a/components/metrics/metrics_state_manager_unittest.cc b/components/metrics/metrics_state_manager_unittest.cc index baa9f8f..48def1fd 100644 --- a/components/metrics/metrics_state_manager_unittest.cc +++ b/components/metrics/metrics_state_manager_unittest.cc
@@ -57,7 +57,7 @@ std::unique_ptr<MetricsStateManager> CreateStateManager() { return MetricsStateManager::Create( - &prefs_, enabled_state_provider_.get(), base::string16(), + &prefs_, enabled_state_provider_.get(), std::wstring(), base::BindRepeating(&MetricsStateManagerTest::MockStoreClientInfoBackup, base::Unretained(this)), base::BindRepeating(&MetricsStateManagerTest::LoadFakeClientInfoBackup,
diff --git a/components/metrics/structured/histogram_util.h b/components/metrics/structured/histogram_util.h index b3926ceb..1e1799a 100644 --- a/components/metrics/structured/histogram_util.h +++ b/components/metrics/structured/histogram_util.h
@@ -27,7 +27,11 @@ kKeyParseError = 6, kKeyWriteError = 7, kKeySerializationError = 8, - kMaxValue = kKeySerializationError, + kEventReadError = 5, + kEventParseError = 6, + kEventWriteError = 7, + kEventSerializationError = 8, + kMaxValue = kEventSerializationError, }; // Whether a single event was recorded correctly, or otherwise what error state
diff --git a/components/metrics/structured/key_data.cc b/components/metrics/structured/key_data.cc index 11a0024..83168f7 100644 --- a/components/metrics/structured/key_data.cc +++ b/components/metrics/structured/key_data.cc
@@ -27,9 +27,6 @@ // The default maximum number of days before rotating keys. constexpr int kDefaultRotationPeriod = 90; -// The delay period for the PersistentProto. -constexpr int kSaveDelayMs = 1000; - // Generates a key, which is the string representation of // base::UnguessableToken, and is of size |kKeySize| bytes. std::string GenerateKey() { @@ -45,11 +42,12 @@ } // namespace KeyData::KeyData(const base::FilePath& path, + const base::TimeDelta& save_delay, base::OnceCallback<void()> on_initialized) : on_initialized_(std::move(on_initialized)) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); proto_ = std::make_unique<PersistentProto<KeyDataProto>>( - path, base::TimeDelta::FromMilliseconds(kSaveDelayMs), + path, save_delay, base::BindOnce(&KeyData::OnRead, weak_factory_.GetWeakPtr()), base::BindRepeating(&KeyData::OnWrite, weak_factory_.GetWeakPtr())); } @@ -69,6 +67,7 @@ LogInternalError(StructuredMetricsError::kKeyParseError); break; } + std::move(on_initialized_).Run(); }
diff --git a/components/metrics/structured/key_data.h b/components/metrics/structured/key_data.h index f5bb36eb..f04fe79 100644 --- a/components/metrics/structured/key_data.h +++ b/components/metrics/structured/key_data.h
@@ -46,6 +46,7 @@ class KeyData { public: KeyData(const base::FilePath& path, + const base::TimeDelta& save_delay, base::OnceCallback<void()> on_initialized); ~KeyData();
diff --git a/components/metrics/structured/key_data_unittest.cc b/components/metrics/structured/key_data_unittest.cc index a97ecec..02e95fa 100644 --- a/components/metrics/structured/key_data_unittest.cc +++ b/components/metrics/structured/key_data_unittest.cc
@@ -81,7 +81,8 @@ base::FilePath GetPath() { return temp_dir_.GetPath().Append("keys"); } void MakeKeyData() { - key_data_ = std::make_unique<KeyData>(GetPath(), base::DoNothing()); + key_data_ = std::make_unique<KeyData>( + GetPath(), base::TimeDelta::FromSeconds(0), base::DoNothing()); Wait(); }
diff --git a/components/metrics/structured/persistent_proto.cc b/components/metrics/structured/persistent_proto.cc index 1c9b274..7b63421 100644 --- a/components/metrics/structured/persistent_proto.cc +++ b/components/metrics/structured/persistent_proto.cc
@@ -99,6 +99,13 @@ QueueWrite(); } + if (wipe_after_reading_) { + proto_.reset(); + proto_ = std::make_unique<T>(); + QueueWrite(); + wipe_after_reading_ = false; + } + std::move(on_read_).Run(result.first); } @@ -140,6 +147,17 @@ on_write_.Run(status); } +template <class T> +void PersistentProto<T>::Wipe() { + if (proto_) { + proto_.reset(); + proto_ = std::make_unique<T>(); + QueueWrite(); + } else { + wipe_after_reading_ = true; + } +} + // A list of all types that the PersistentProto can be used with. template class PersistentProto<EventsProto>; template class PersistentProto<KeyDataProto>;
diff --git a/components/metrics/structured/persistent_proto.h b/components/metrics/structured/persistent_proto.h index 79a86ad..537f2368 100644 --- a/components/metrics/structured/persistent_proto.h +++ b/components/metrics/structured/persistent_proto.h
@@ -88,6 +88,12 @@ // Write the backing proto to disk 'now'. void StartWrite(); + // Safely clear this proto from memory and disk. This is preferred to clearing + // the proto, because it ensures the proto is wiped even if called before the + // backing file is read from disk. In this case, the file is overwritten after + // it has been read. + void Wipe(); + private: void OnReadComplete(std::pair<ReadStatus, std::unique_ptr<T>> result); void OnWriteComplete(WriteStatus status); @@ -102,6 +108,9 @@ // Whether or not a write is currently scheduled. bool write_is_queued_ = false; + // Whether we should immediately clear the proto after reading it. + bool wipe_after_reading_ = false; + // Run when the cache finishes reading from disk, if provided. ReadCallback on_read_;
diff --git a/components/metrics/structured/structured_metrics_provider.cc b/components/metrics/structured/structured_metrics_provider.cc index 6494d7fe..628d4e2 100644 --- a/components/metrics/structured/structured_metrics_provider.cc +++ b/components/metrics/structured/structured_metrics_provider.cc
@@ -10,8 +10,7 @@ #include "base/strings/string_number_conversions.h" #include "base/task/current_thread.h" #include "components/metrics/structured/histogram_util.h" -#include "components/prefs/json_pref_store.h" -#include "components/prefs/writeable_pref_store.h" +#include "components/metrics/structured/storage.pb.h" #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h" namespace metrics { @@ -19,242 +18,197 @@ namespace { using ::metrics::ChromeUserMetricsExtension; -using PrefReadError = ::PersistentPrefStore::PrefReadError; -constexpr char kAssociatedEventsKey[] = "associated"; -constexpr char kIndependentEventsKey[] = "independent"; - -// Given a Value representing a string containing a uint, return a uint64_t. If -// the Value is not a string or the conversion fails, returns nullopt. -base::Optional<uint64_t> StringValueToUint(const base::Value* string_value) { - DCHECK(string_value); - DCHECK(string_value->is_string()); - if (!string_value || !string_value->is_string()) { - LogInternalError(StructuredMetricsError::kFailedUintConversion); - return base::nullopt; - } - - uint64_t result = 0; - if (!base::StringToUint64(string_value->GetString(), &result)) { - LogInternalError(StructuredMetricsError::kFailedUintConversion); - return base::nullopt; - } - return result; -} - -// Populate the structured_event repeated field of an |uma_proto| using an -// |events| list. -void PopulateUmaProto(const base::Value* events, - ChromeUserMetricsExtension* uma_proto) { - DCHECK(events->is_list()); - auto* data_proto = uma_proto->mutable_structured_data(); - for (const auto& event : events->GetList()) { - auto* event_proto = data_proto->add_events(); - - const auto event_name_hash = StringValueToUint(event.FindKey("name")); - if (!event_name_hash) - continue; - event_proto->set_event_name_hash(event_name_hash.value()); - - const auto user_event_id = StringValueToUint(event.FindKey("id")); - if (!user_event_id) - continue; - event_proto->set_profile_event_id(user_event_id.value()); - - for (const auto& metric : event.FindKey("metrics")->GetList()) { - auto* metric_proto = event_proto->add_metrics(); - const auto name_hash = StringValueToUint(metric.FindKey("name")); - if (!name_hash) - continue; - metric_proto->set_name_hash(name_hash.value()); - - const auto* value = metric.FindKey("value"); - if (value->is_string()) { - const auto hmac = StringValueToUint(value); - if (!hmac) - continue; - metric_proto->set_value_hmac(hmac.value()); - } else if (value->is_int()) { - metric_proto->set_value_int64(value->GetInt()); - } - } - } -} +// The delay period for the PersistentProto. +constexpr int kSaveDelayMs = 1000; } // namespace int StructuredMetricsProvider::kMaxEventsPerUpload = 100; -char StructuredMetricsProvider::kStorageFileName[] = "structured_metrics.json"; - char StructuredMetricsProvider::kStorageDirectory[] = "structured_metrics"; -StructuredMetricsProvider::StructuredMetricsProvider() = default; +StructuredMetricsProvider::StructuredMetricsProvider() { + Recorder::GetInstance()->AddObserver(this); +} StructuredMetricsProvider::~StructuredMetricsProvider() { - if (storage_) - storage_->RemoveObserver(this); - if (recording_enabled_) - Recorder::GetInstance()->RemoveObserver(this); + Recorder::GetInstance()->RemoveObserver(this); DCHECK(!IsInObserverList()); } -StructuredMetricsProvider::PrefStoreErrorDelegate::PrefStoreErrorDelegate() = - default; +void StructuredMetricsProvider::OnKeyDataInitialized() { + DCHECK(base::CurrentUIThread::IsSet()); -StructuredMetricsProvider::PrefStoreErrorDelegate::~PrefStoreErrorDelegate() = - default; - -void StructuredMetricsProvider::PrefStoreErrorDelegate::OnError( - PrefReadError error) { - LogPrefReadError(error); -} - -StructuredMetricsProvider::StorageType -StructuredMetricsProvider::StorageTypeForIdType( - EventBase::IdentifierType type) { - switch (type) { - case EventBase::IdentifierType::kUmaId: - return StructuredMetricsProvider::StorageType::kAssociated; - case EventBase::IdentifierType::kProjectId: - case EventBase::IdentifierType::kUnidentified: - return StructuredMetricsProvider::StorageType::kIndependent; + switch (init_state_) { + case InitState::kProfileAdded: + init_state_ = InitState::kKeysInitialized; + break; + case InitState::kEventsInitialized: + init_state_ = InitState::kInitialized; + break; + default: + NOTREACHED(); } } -base::StringPiece StructuredMetricsProvider::ListKeyForStorageType( - StructuredMetricsProvider::StorageType type) { - switch (type) { - case StructuredMetricsProvider::StorageType::kAssociated: - return base::StringPiece(kAssociatedEventsKey); - case StructuredMetricsProvider::StorageType::kIndependent: - return base::StringPiece(kIndependentEventsKey); +void StructuredMetricsProvider::OnRead(const ReadStatus status) { + DCHECK(base::CurrentUIThread::IsSet()); + + switch (status) { + case ReadStatus::kOk: + case ReadStatus::kMissing: + break; + case ReadStatus::kReadError: + LogInternalError(StructuredMetricsError::kEventReadError); + break; + case ReadStatus::kParseError: + LogInternalError(StructuredMetricsError::kEventParseError); + break; + } + + switch (init_state_) { + case InitState::kProfileAdded: + init_state_ = InitState::kEventsInitialized; + break; + case InitState::kKeysInitialized: + init_state_ = InitState::kInitialized; + break; + default: + NOTREACHED(); } } -base::Value* StructuredMetricsProvider::GetEventsList(StorageType type) { - // Ensure the events key exists. The "events" key was a list of event objects, - // and is now a dict of lists. Migrate to the new layout if needed. - base::Value* events = nullptr; - if (!storage_->GetMutableValue("events", &events)) { - storage_->SetValue( - "events", std::make_unique<base::Value>(base::Value::Type::DICTIONARY), - WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); - storage_->GetMutableValue("events", &events); - } else if (events->is_list()) { - auto new_events = - std::make_unique<base::Value>(base::Value::Type::DICTIONARY); - // All existing events have previously been associated with the UMA - // client_id, so move them to the associated events list. - new_events->SetKey(kAssociatedEventsKey, events->Clone()); - storage_->SetValue("events", std::move(new_events), - WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); - storage_->GetMutableValue("events", &events); +void StructuredMetricsProvider::OnWrite(const WriteStatus status) { + DCHECK(base::CurrentUIThread::IsSet()); + + switch (status) { + case WriteStatus::kOk: + break; + case WriteStatus::kWriteError: + LogInternalError(StructuredMetricsError::kEventWriteError); + break; + case WriteStatus::kSerializationError: + LogInternalError(StructuredMetricsError::kEventSerializationError); + break; } - - DCHECK(events->is_dict()); - - // Choose the key for |type|, ensure the list Value actually exists, and - // return it. - const base::StringPiece list_key = ListKeyForStorageType(type); - base::Value* events_list = events->FindKey(list_key); - if (events_list) { - return events_list; - } else { - base::Value events_list(base::Value::Type::LIST); - return events->SetKey(list_key, std::move(events_list)); - } -} - -void StructuredMetricsProvider::OnRecord(const EventBase& event) { - // Records the information in |event|, to be logged to UMA on the next call to - // ProvideCurrentSessionData. Should only be called from the browser UI - // sequence. - - // One more state for the EventRecordingState exists: kMetricsProviderMissing. - // This is recorded in Recorder::Record. - if (!recording_enabled_) { - LogEventRecordingState(EventRecordingState::kRecordingDisabled); - } else if (!initialized_) { - LogEventRecordingState(EventRecordingState::kProviderUninitialized); - } else { - LogEventRecordingState(EventRecordingState::kRecorded); - } - - if (!recording_enabled_ || !initialized_) - return; - - // TODO(crbug.com/1148168): Reimplement recording using proto instead of json - // storage. } void StructuredMetricsProvider::OnProfileAdded( const base::FilePath& profile_path) { DCHECK(base::CurrentUIThread::IsSet()); - if (initialized_) + + // We do not handle multiprofile, instead initializing with the state stored + // in the first logged-in user's cryptohome. So if a second profile is added + // we should ignore it. All init state beyond |InitState::kUninitialized| mean + // a profile has already been added. + if (init_state_ != InitState::kUninitialized) return; + init_state_ = InitState::kProfileAdded; - storage_ = new JsonPrefStore( - profile_path.Append(StructuredMetricsProvider::kStorageFileName)); - storage_->AddObserver(this); + const auto storage_directory = profile_path.Append(kStorageDirectory); + const auto save_delay = base::TimeDelta::FromMilliseconds(kSaveDelayMs); + key_data_ = std::make_unique<KeyData>( + storage_directory.Append("keys"), save_delay, + base::BindOnce(&StructuredMetricsProvider::OnKeyDataInitialized, + weak_factory_.GetWeakPtr())); + events_ = std::make_unique<PersistentProto<EventsProto>>( + storage_directory.Append("events"), save_delay, + base::BindOnce(&StructuredMetricsProvider::OnRead, + weak_factory_.GetWeakPtr()), + base::BindRepeating(&StructuredMetricsProvider::OnWrite, + weak_factory_.GetWeakPtr())); - // |storage_| takes ownership of the error delegate. - storage_->ReadPrefsAsync(new PrefStoreErrorDelegate()); + // See OnRecordingDisabled for more information. + if (wipe_events_on_init_) { + events_->Wipe(); + } } -void StructuredMetricsProvider::OnInitializationCompleted(const bool success) { - if (!success) +void StructuredMetricsProvider::OnRecord(const EventBase& event) { + DCHECK(base::CurrentUIThread::IsSet()); + + // One more state for the EventRecordingState exists: kMetricsProviderMissing. + // This is recorded in Recorder::Record. + if (!recording_enabled_) { + LogEventRecordingState(EventRecordingState::kRecordingDisabled); + } else if (init_state_ != InitState::kInitialized) { + LogEventRecordingState(EventRecordingState::kProviderUninitialized); + } else { + LogEventRecordingState(EventRecordingState::kRecorded); + } + + if (!recording_enabled_ || init_state_ != InitState::kInitialized) return; - DCHECK(!storage_->ReadOnly()); - // TODO(crbug.com/1148168): Replace storage_directory with a member once we - // use it for StructuredMetricsProvider as well as KeyData. - const base::FilePath storage_directory(kStorageDirectory); - key_data_ = std::make_unique<KeyData>(storage_directory.Append("keys"), - base::DoNothing()); - initialized_ = true; + + DCHECK(key_data_->is_initialized()); + + // TODO(crbug.com/1148168): use the identifier type for an event to choose + // which list of events to save to: uma or non-uma. + auto* event_proto = events_.get()->get()->add_uma_events(); + + event_proto->set_profile_event_id(key_data_->Id(event.project_name_hash())); + event_proto->set_event_name_hash(event.name_hash()); + for (const auto& metric : event.metrics()) { + auto* metric_proto = event_proto->add_metrics(); + metric_proto->set_name_hash(metric.name_hash); + + switch (metric.type) { + case EventBase::MetricType::kInt: + metric_proto->set_value_int64(metric.int_value); + break; + case EventBase::MetricType::kString: + const int64_t hmac = key_data_->HmacMetric( + event.project_name_hash(), metric.name_hash, metric.string_value); + metric_proto->set_value_hmac(hmac); + break; + } + } + + events_->QueueWrite(); } void StructuredMetricsProvider::OnRecordingEnabled() { DCHECK(base::CurrentUIThread::IsSet()); - if (!recording_enabled_) - Recorder::GetInstance()->AddObserver(this); recording_enabled_ = true; } void StructuredMetricsProvider::OnRecordingDisabled() { DCHECK(base::CurrentUIThread::IsSet()); - if (recording_enabled_) - Recorder::GetInstance()->RemoveObserver(this); recording_enabled_ = false; - // Clear the cache of unsent logs. Either |storage_| or its "events" key can - // be nullptr if OnRecordingDisabled is called before initialization is - // complete. In that case, there are no cached events to clear. See the class - // comment in the header for more details on the initialization process. + // Delete the cache of unsent logs. We need to handle two cases: // - // "events" was migrated from a list to a dict of lists. Handle both cases in - // case recording is disabled before initialization can complete the - // migration. - base::Value* events = nullptr; - if (storage_ && storage_->GetMutableValue("events", &events)) { - if (events->is_list()) { - events->ClearList(); - } else if (events->is_dict()) { - events->DictClear(); - } + // 1. A profile has been added and so |events_| has been constructed. In this + // case just call Wipe. + // + // 2. A profile hasn't been added and |events_| is nullptr. In this case set + // |wipe_events_on_init_| and let OnProfileAdded call Wipe after |events_| + // is initialized. + // + // Note that Wipe will ensure the events are deleted from disk even if the + // PersistentProto hasn't itself finished initializing. + if (events_) { + events_->Wipe(); + } else { + wipe_events_on_init_ = true; } } void StructuredMetricsProvider::ProvideCurrentSessionData( ChromeUserMetricsExtension* uma_proto) { DCHECK(base::CurrentUIThread::IsSet()); - if (!recording_enabled_ || !initialized_) + if (!recording_enabled_ || init_state_ != InitState::kInitialized) return; - base::Value* events = GetEventsList(StorageType::kAssociated); - PopulateUmaProto(events, uma_proto); - LogNumEventsInUpload(events->GetList().size()); - events->ClearList(); + // TODO(crbug.com/1148168): Consider splitting this into two metrics, one for + // UMA metrics and one for non-UMA metrics. + LogNumEventsInUpload(events_.get()->get()->uma_events_size()); + + auto* structured_data = uma_proto->mutable_structured_data(); + structured_data->mutable_events()->Swap( + events_.get()->get()->mutable_uma_events()); + events_.get()->get()->clear_uma_events(); } bool StructuredMetricsProvider::HasIndependentMetrics() { @@ -269,32 +223,30 @@ ChromeUserMetricsExtension* uma_proto, base::HistogramSnapshotManager*) { DCHECK(base::CurrentUIThread::IsSet()); - if (!recording_enabled_ || !initialized_) { + if (!recording_enabled_ || init_state_ != InitState::kInitialized) { std::move(done_callback).Run(false); return; } - base::Value* events = GetEventsList(StorageType::kIndependent); - const size_t num_events = events->GetList().size(); - if (num_events == 0) { - std::move(done_callback).Run(false); - return; - } + // TODO(crbug.com/1148168): Add unit tests for independent metrics once we are + // able to record them. // TODO(crbug.com/1148168): Add histograms for independent metrics upload // size. + auto* structured_data = uma_proto->mutable_structured_data(); + structured_data->mutable_events()->Swap( + events_.get()->get()->mutable_non_uma_events()); + events_.get()->get()->clear_non_uma_events(); + // Independent events should not be associated with the client_id, so clear // it. uma_proto->clear_client_id(); - PopulateUmaProto(events, uma_proto); - events->ClearList(); - std::move(done_callback).Run(true); } -void StructuredMetricsProvider::CommitPendingWriteForTest() { - storage_->CommitPendingWrite(); +void StructuredMetricsProvider::WriteNowForTest() { + events_->StartWrite(); } } // namespace structured
diff --git a/components/metrics/structured/structured_metrics_provider.h b/components/metrics/structured/structured_metrics_provider.h index 3a0a44a..e7e63843 100644 --- a/components/metrics/structured/structured_metrics_provider.h +++ b/components/metrics/structured/structured_metrics_provider.h
@@ -17,52 +17,34 @@ #include "components/metrics/structured/event_base.h" #include "components/metrics/structured/key_data.h" #include "components/metrics/structured/recorder.h" -#include "components/prefs/persistent_pref_store.h" -#include "components/prefs/pref_store.h" - -class JsonPrefStore; namespace metrics { namespace structured { +class EventsProto; + // StructuredMetricsProvider is responsible for filling out the // |structured_metrics_event| section of the UMA proto. This class should not be // instantiated except by the ChromeMetricsServiceClient. This class is not // thread safe and should only be called on the browser UI sequence, because // calls from the metrics service come on the UI sequence. // -// Each structured metrics event is sent with other UMA data, and so is -// associated with the UMA client ID when received by the UMA server. The client -// ID is stripped from the events after they reach the server, and so data at -// rest is not attached to the client ID. However, please note that structured -// events are *not* separated from the client ID at the point of upload from -// the device. -// -// Currently, the structured metrics system is cros-only and relies on the cros -// cryptohome to store keys and unsent logs, collectively called 'state'. This -// means structured metrics collection cannot begin until a profile eligible -// for metrics collection is added. -// -// TODO(crbug.com/1016655): generalize structured metrics beyond cros. -// // Initialization of the StructuredMetricsProvider must wait until a profile is // added, because state is stored within the profile directory. Initialization // happens in several steps: // // 1. A StructuredMetricsProvider instance is constructed and owned by the -// MetricsService. +// MetricsService. It registers itself as an observer of +// metrics::structured::Recorder. // -// 2. When recording is enabled, the provider registers itself as an observer of -// Recorder. -// -// 3. When a profile is added that is eligible for recording, +// 2. When a profile is added that is eligible for recording, // ChromeMetricsServiceClient calls Recorder::ProfileAdded, which notifies // this class. // -// 4. This class then begins initialization by asynchronously reading keys and -// unsent logs from a JsonPrefStore within the profile path. +// 3. This class then begins initialization by asynchronously reading keys and +// unsent logs from the cryptohome. // -// 5. If the read succeeds, initialization is complete and this class starts +// 4. If the read succeeds, initialization is complete and this class starts // accepting events to record. // // After initialization, this class accepts events to record from @@ -73,8 +55,7 @@ // On a call to ProvideCurrentSessionData, the cache of unsent logs is added to // a ChromeUserMetricsExtension for upload, and is then cleared. class StructuredMetricsProvider : public metrics::MetricsProvider, - public Recorder::Observer, - public PrefStore::Observer { + public Recorder::Observer { public: StructuredMetricsProvider(); ~StructuredMetricsProvider() override; @@ -86,27 +67,28 @@ friend class Recorder; friend class StructuredMetricsProviderTest; - enum class StorageType { - kAssociated, - kIndependent, + // State machine for step 4 of initialization. These are stored in two files + // that are asynchronously read from disk at startup. When both files have + // been read, the provider has been initialized. + enum class InitState { + kUninitialized = 1, + // Set after we observe the recorder, which happens on construction. + kProfileAdded = 2, + // Set after the key file is read from disk. + kKeysInitialized = 3, + // Set after the event file is read from disk. + kEventsInitialized = 4, + // Set after both the key and event files are read from disk. + kInitialized = 5, }; - // An error delegate called when |storage_| has finished reading prefs from - // disk. - class PrefStoreErrorDelegate : public PersistentPrefStore::ReadErrorDelegate { - public: - PrefStoreErrorDelegate(); - ~PrefStoreErrorDelegate() override; + void OnKeyDataInitialized(); + void OnRead(ReadStatus status); + void OnWrite(WriteStatus status); - // PersistentPrefStore::ReadErrorDelegate: - void OnError(PersistentPrefStore::PrefReadError error) override; - }; - - StructuredMetricsProvider::StorageType StorageTypeForIdType( - EventBase::IdentifierType type); - base::StringPiece ListKeyForStorageType( - StructuredMetricsProvider::StorageType type); - base::Value* GetEventsList(StorageType type); + // Recorder::Observer: + void OnProfileAdded(const base::FilePath& profile_path) override; + void OnRecord(const EventBase& event) override; // metrics::MetricsProvider: void OnRecordingEnabled() override; @@ -118,27 +100,14 @@ ChromeUserMetricsExtension* uma_proto, base::HistogramSnapshotManager*) override; - // Recorder::Observer: - void OnRecord(const EventBase& event) override; - void OnProfileAdded(const base::FilePath& profile_path) override; - - // PrefStore::Observer: - void OnInitializationCompleted(bool success) override; - void OnPrefValueChanged(const std::string& key) override {} - - // Makes the |storage_| PrefStore flush to disk. Used for flushing any - // modified but not-yet-written data to disk during unit tests. - void CommitPendingWriteForTest(); + void WriteNowForTest(); // Beyond this number of logging events between successive calls to // ProvideCurrentSessionData, we stop recording events. static int kMaxEventsPerUpload; - // The basename of the file to store key data and unsent logs. A JsonPrefStore - // is initialized at {profile_path}/{kStorageFileName}. - static char kStorageFileName[]; - // TODO(crbug.com/1016655): This is here just for the sake of KeyData. We will - // also use it for the provider itself soon. The directory to store keys and - // events in. Relative to the user's cryptohome. + + // The directory used to store unsent logs and keys. Relative to the user's + // cryptohome. static char kStorageDirectory[]; // Whether the metrics provider has completed initialization. Initialization @@ -148,35 +117,29 @@ // Execution is: // - A profile is added. // - OnProfileAdded is called, which constructs |storage_| and - // asynchronously reads prefs. - // - OnInitializationCompleted is called once pref reading is complete, which - // sets |initialized_| to true. + // asynchronously reads events and keys. + // - OnInitializationCompleted is called once reading from disk is complete, + // which sets |initialized_| to true. // // The metrics provider does not handle multiprofile: initialization happens // only once, for the first-logged-in account aka. primary user. - bool initialized_ = false; + // + InitState init_state_ = InitState::kUninitialized; // Tracks the recording state signalled to the metrics provider by // OnRecordingEnabled and OnRecordingDisabled. bool recording_enabled_ = false; - // On-device storage within the user's cryptohome for keys and unsent logs. - // This is constructed as part of initialization and is guaranteed to be - // initialized if |initialized_| is true. - // - // For details of key storage, see key_data.h - // - // Unsent logs are stored in hashed, ready-to-upload form in the structure: - // - // events.<events_list>[i].metrics[j].name - // .value - // - // The <events_list> key is either "associated" or "independent", for storing - // events that are or aren't associated with the UMA client_id. - scoped_refptr<JsonPrefStore> storage_; + // Set by OnRecordingDisabled if |events_| hasn't been initialized yet to + // indicate events should be deleted from disk when |events_| is initialized. + // See OnRecordingDisabled for more information. + bool wipe_events_on_init_ = false; + + // On-device storage within the user's cryptohome for unsent logs. + std::unique_ptr<PersistentProto<EventsProto>> events_; // Storage for all event's keys, and hashing logic for values. This stores - // keys on-disk using the |storage_| JsonPrefStore. + // keys on disk. std::unique_ptr<KeyData> key_data_; base::WeakPtrFactory<StructuredMetricsProvider> weak_factory_{this};
diff --git a/components/metrics/structured/structured_metrics_provider_unittest.cc b/components/metrics/structured/structured_metrics_provider_unittest.cc index 7081aad..1df70f8 100644 --- a/components/metrics/structured/structured_metrics_provider_unittest.cc +++ b/components/metrics/structured/structured_metrics_provider_unittest.cc
@@ -19,8 +19,6 @@ #include "components/metrics/structured/recorder.h" #include "components/metrics/structured/storage.pb.h" #include "components/metrics/structured/structured_events.h" -#include "components/prefs/json_pref_store.h" -#include "components/prefs/persistent_pref_store.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h" @@ -43,7 +41,7 @@ // The name hash of "TestProjectOne". constexpr uint64_t kProjectOneHash = UINT64_C(16881314472396226433); // The name hash of "TestProjectTwo". -constexpr uint64_t kProjectTwoHash = UINT64_C(15619026293081468407); +constexpr uint64_t kProjectTwoHash = UINT64_C(5876808001962504629); // The name hash of "chrome::TestProjectOne::TestEventOne". constexpr uint64_t kEventOneHash = UINT64_C(13593049295042080097); @@ -78,7 +76,6 @@ protected: void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - storage_ = new JsonPrefStore(temp_dir_.GetPath().Append("storage.json")); Recorder::GetInstance()->SetUiTaskRunner( task_environment_.GetMainThreadTaskRunner()); } @@ -124,7 +121,10 @@ Wait(); } - bool is_initialized() { return provider_->initialized_; } + bool is_initialized() { + return provider_->init_state_ == + StructuredMetricsProvider::InitState::kInitialized; + } bool is_recording_enabled() { return provider_->recording_enabled_; } void OnRecordingEnabled() { provider_->OnRecordingEnabled(); } @@ -135,26 +135,29 @@ provider_->OnProfileAdded(path); } - void CommitPendingWrite() { - provider_->CommitPendingWriteForTest(); + void WriteNow() { + provider_->WriteNowForTest(); Wait(); } - StructuredDataProto GetStructuredData() { + StructuredDataProto GetSessionData() { ChromeUserMetricsExtension uma_proto; provider_->ProvideCurrentSessionData(&uma_proto); return uma_proto.structured_data(); } - // Most tests start without an existing structured_metrics.json storage file - // on-disk, and so will trigger a single PREF_READ_ERROR_NO_FILE metric. - // Expect that, and no other errors. - void ExpectOnlyFileReadError() { + StructuredDataProto GetIndependentMetrics() { + CHECK(provider_->HasIndependentMetrics()); + ChromeUserMetricsExtension uma_proto; + provider_->ProvideIndependentMetrics( + base::BindOnce([](bool success) { CHECK(success); }), &uma_proto, + nullptr); + return uma_proto.structured_data(); + } + + void ExpectNoErrors() { histogram_tester_.ExpectTotalCount("UMA.StructuredMetrics.InternalError", 0); - histogram_tester_.ExpectUniqueSample( - "UMA.StructuredMetrics.PrefReadError", - PersistentPrefStore::PREF_READ_ERROR_NO_FILE, 1); } protected: @@ -166,7 +169,6 @@ base::test::TaskEnvironment::MainThreadType::UI, base::test::TaskEnvironment::ThreadPoolExecutionMode::QUEUED}; base::ScopedTempDir temp_dir_; - scoped_refptr<JsonPrefStore> storage_; }; // Simple test to ensure initialization works correctly in the case of a @@ -175,7 +177,7 @@ Init(); EXPECT_TRUE(is_initialized()); EXPECT_TRUE(is_recording_enabled()); - ExpectOnlyFileReadError(); + ExpectNoErrors(); } // Ensure a call to OnRecordingDisabled prevents reporting. @@ -183,8 +185,8 @@ Init(); OnRecordingDisabled(); events::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); - EXPECT_EQ(GetStructuredData().events_size(), 0); - ExpectOnlyFileReadError(); + EXPECT_EQ(GetSessionData().events_size(), 0); + ExpectNoErrors(); } // Ensure that, if recording is disabled part-way through initialization, the @@ -202,7 +204,7 @@ EXPECT_TRUE(is_initialized()); EXPECT_FALSE(is_recording_enabled()); - ExpectOnlyFileReadError(); + ExpectNoErrors(); } // Ensure that recording is disabled until explicitly enabled with a call to @@ -218,10 +220,10 @@ OnRecordingEnabled(); EXPECT_TRUE(is_recording_enabled()); - ExpectOnlyFileReadError(); + ExpectNoErrors(); } -TEST_F(StructuredMetricsProviderTest, DISABLED_RecordedEventAppearsInReport) { +TEST_F(StructuredMetricsProviderTest, RecordedEventAppearsInReport) { Init(); events::test_project_one::TestEventOne() @@ -237,11 +239,11 @@ .SetTestMetricTwo(12345) .Record(); - EXPECT_EQ(GetStructuredData().events_size(), 3); - ExpectOnlyFileReadError(); + EXPECT_EQ(GetSessionData().events_size(), 3); + ExpectNoErrors(); } -TEST_F(StructuredMetricsProviderTest, DISABLED_EventsReportedCorrectly) { +TEST_F(StructuredMetricsProviderTest, EventsReportedCorrectly) { WriteTestingKeys(); Init(); @@ -253,7 +255,7 @@ .SetTestMetricThree(kValueTwo) .Record(); - const auto data = GetStructuredData(); + const auto data = GetSessionData(); ASSERT_EQ(data.events_size(), 2); { // First event @@ -298,8 +300,7 @@ histogram_tester_.ExpectTotalCount("UMA.StructuredMetrics.PrefReadError", 0); } -TEST_F(StructuredMetricsProviderTest, - DISABLED_EventsWithinProjectReportedWithSameID) { +TEST_F(StructuredMetricsProviderTest, EventsWithinProjectReportedWithSameID) { WriteTestingKeys(); Init(); @@ -307,7 +308,7 @@ events::test_project_two::TestEventTwo().Record(); events::test_project_two::TestEventThree().Record(); - const auto data = GetStructuredData(); + const auto data = GetSessionData(); ASSERT_EQ(data.events_size(), 3); const auto& event_one = data.events(0); @@ -331,44 +332,43 @@ // Test that a call to ProvideCurrentSessionData clears the provided events from // the cache, and a subsequent call does not return those events again. -TEST_F(StructuredMetricsProviderTest, DISABLED_EventsClearedAfterReport) { +TEST_F(StructuredMetricsProviderTest, EventsClearedAfterReport) { Init(); events::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); events::test_project_one::TestEventOne().SetTestMetricTwo(2).Record(); // Should provide both the previous events. - EXPECT_EQ(GetStructuredData().events_size(), 2); + EXPECT_EQ(GetSessionData().events_size(), 2); // But the previous events shouldn't appear in the second report. - EXPECT_EQ(GetStructuredData().events_size(), 0); + EXPECT_EQ(GetSessionData().events_size(), 0); events::test_project_one::TestEventOne().SetTestMetricTwo(3).Record(); // The third request should only contain the third event. - EXPECT_EQ(GetStructuredData().events_size(), 1); + EXPECT_EQ(GetSessionData().events_size(), 1); - ExpectOnlyFileReadError(); + ExpectNoErrors(); } // Test that events recorded in one session are correctly persisted and are // uploaded in the first report from a subsequent session. -TEST_F(StructuredMetricsProviderTest, - DISABLED_EventsFromPreviousSessionAreReported) { +TEST_F(StructuredMetricsProviderTest, EventsFromPreviousSessionAreReported) { // Start first session and record one event. Init(); events::test_project_one::TestEventOne().SetTestMetricTwo(1234).Record(); // Write events to disk, then destroy the provider. - CommitPendingWrite(); + WriteNow(); provider_.reset(); // Start a second session and ensure the event is reported. Init(); - const auto data = GetStructuredData(); + const auto data = GetSessionData(); ASSERT_EQ(data.events_size(), 1); ASSERT_EQ(data.events(0).metrics_size(), 1); EXPECT_EQ(data.events(0).metrics(0).value_int64(), 1234); - ExpectOnlyFileReadError(); + ExpectNoErrors(); } // Test that events reported at various stages before and during initialization @@ -386,9 +386,9 @@ // done, because the provider hasn't finished loading the keys from disk. events::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); Wait(); - EXPECT_EQ(GetStructuredData().events_size(), 0); + EXPECT_EQ(GetSessionData().events_size(), 0); - ExpectOnlyFileReadError(); + ExpectNoErrors(); } // Ensure a call to OnRecordingDisabled not only prevents the reporting of new @@ -401,14 +401,14 @@ events::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); OnRecordingDisabled(); events::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); - EXPECT_EQ(GetStructuredData().events_size(), 0); + EXPECT_EQ(GetSessionData().events_size(), 0); - ExpectOnlyFileReadError(); + ExpectNoErrors(); } // Ensure that recording and reporting is re-enabled after recording is disabled // and then enabled again. -TEST_F(StructuredMetricsProviderTest, DISABLED_ReportingResumesWhenEnabled) { +TEST_F(StructuredMetricsProviderTest, ReportingResumesWhenEnabled) { Init(); events::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); events::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); @@ -418,9 +418,9 @@ OnRecordingEnabled(); events::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); events::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); - EXPECT_EQ(GetStructuredData().events_size(), 2); + EXPECT_EQ(GetSessionData().events_size(), 2); - ExpectOnlyFileReadError(); + ExpectNoErrors(); } // Ensure that a call to ProvideCurrentSessionData before initialization @@ -428,11 +428,11 @@ TEST_F(StructuredMetricsProviderTest, ReportsNothingBeforeInitializationComplete) { provider_ = std::make_unique<StructuredMetricsProvider>(); - EXPECT_EQ(GetStructuredData().events_size(), 0); + EXPECT_EQ(GetSessionData().events_size(), 0); OnRecordingEnabled(); - EXPECT_EQ(GetStructuredData().events_size(), 0); + EXPECT_EQ(GetSessionData().events_size(), 0); OnProfileAdded(TempDirPath()); - EXPECT_EQ(GetStructuredData().events_size(), 0); + EXPECT_EQ(GetSessionData().events_size(), 0); } } // namespace structured
diff --git a/components/omnibox/browser/autocomplete_provider_client.h b/components/omnibox/browser/autocomplete_provider_client.h index 73dfd4c..dd3b14b 100644 --- a/components/omnibox/browser/autocomplete_provider_client.h +++ b/components/omnibox/browser/autocomplete_provider_client.h
@@ -48,6 +48,10 @@ class ComponentUpdateService; } +namespace signin { +class IdentityManager; +} + namespace query_tiles { class TileService; } @@ -111,6 +115,9 @@ virtual component_updater::ComponentUpdateService* GetComponentUpdateService() = 0; + // Returns the signin::IdentityManager associated with the current profile. + virtual signin::IdentityManager* GetIdentityManager() const = 0; + virtual bool IsOffTheRecord() const = 0; virtual bool SearchSuggestEnabled() const = 0;
diff --git a/components/omnibox/browser/bookmark_provider.cc b/components/omnibox/browser/bookmark_provider.cc index 33c4441e..a7abf2a4 100644 --- a/components/omnibox/browser/bookmark_provider.cc +++ b/components/omnibox/browser/bookmark_provider.cc
@@ -15,7 +15,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/trace_event/trace_event.h" #include "components/bookmarks/browser/bookmark_model.h" -#include "components/bookmarks/browser/titled_url_match.h" #include "components/omnibox/browser/autocomplete_provider_client.h" #include "components/omnibox/browser/autocomplete_result.h" #include "components/omnibox/browser/omnibox_field_trial.h" @@ -110,9 +109,8 @@ // Please refer to the code for TitledUrlIndex::GetResultsMatching for // complete details of how searches are performed against the user's // bookmarks. - std::vector<TitledUrlMatch> matches = bookmark_model_->GetBookmarksMatching( - input.text(), kMaxBookmarkMatches, GetMatchingAlgorithm(input), - base::FeatureList::IsEnabled(omnibox::kBookmarkPaths)); + std::vector<TitledUrlMatch> matches = + GetMatchesWithBookmarkPaths(input, kMaxBookmarkMatches); if (matches.empty()) return; // There were no matches. const base::string16 fixed_up_input(FixupUserInput(input).second); @@ -140,6 +138,51 @@ matches_.resize(num_matches); } +std::vector<TitledUrlMatch> BookmarkProvider::GetMatchesWithBookmarkPaths( + const AutocompleteInput& input, + size_t kMaxBookmarkMatches) { + // Determining whether the |kBookmarkPaths| feature had, or would have had, an + // impact for counterfactual logging is expensive as it requires invoking + // |BookmarkModel::GetBookmarksMatching()| twice. Therefore, the param + // |kBookmarkPathsCounterfactual| determines whether to counterfactual log: + // - When empty, counterfactual logging won't occur. + // - When set to "control" counterfactual logging will occur like usual; i.e. + // path matched bookmarks won't be returned but will be compared to + // determine if the feature triggered. + // - When set to "enabled", counterfactual logging will occur and path matched + // bookmarks will be returned. + std::string counterfactual = base::GetFieldTrialParamValueByFeature( + omnibox::kBookmarkPaths, OmniboxFieldTrial::kBookmarkPathsCounterfactual); + + bool match_paths = base::FeatureList::IsEnabled(omnibox::kBookmarkPaths) && + counterfactual != "control"; + + query_parser::MatchingAlgorithm matching_algorithm = + GetMatchingAlgorithm(input); + + if (counterfactual.empty()) { + return bookmark_model_->GetBookmarksMatching( + input.text(), kMaxBookmarkMatches, matching_algorithm, match_paths); + } + + std::vector<TitledUrlMatch> matches_without_paths = + bookmark_model_->GetBookmarksMatching(input.text(), kMaxBookmarkMatches, + matching_algorithm); + std::vector<TitledUrlMatch> matches_with_paths = + bookmark_model_->GetBookmarksMatching(input.text(), kMaxBookmarkMatches, + matching_algorithm, true); + DCHECK_LE(matches_without_paths.size(), matches_with_paths.size()); + + // It's unnecessary to compare the matches themselves because all + // |matches_without_paths| should be contained in |matches_with_paths|. + if (matches_without_paths.size() != matches_with_paths.size()) { + client_->GetOmniboxTriggeredFeatureService()->TriggerFeature( + OmniboxTriggeredFeatureService::Feature::kBookmarkPaths); + } + + return match_paths ? matches_with_paths : matches_without_paths; +} + query_parser::MatchingAlgorithm BookmarkProvider::GetMatchingAlgorithm( AutocompleteInput input) { if (OmniboxFieldTrial::IsShortBookmarkSuggestionsEnabled())
diff --git a/components/omnibox/browser/bookmark_provider.h b/components/omnibox/browser/bookmark_provider.h index 4200f82d..6af51eac 100644 --- a/components/omnibox/browser/bookmark_provider.h +++ b/components/omnibox/browser/bookmark_provider.h
@@ -10,6 +10,7 @@ #include <string> #include "base/gtest_prod_util.h" +#include "components/bookmarks/browser/titled_url_match.h" #include "components/omnibox/browser/autocomplete_input.h" #include "components/omnibox/browser/autocomplete_provider.h" @@ -55,6 +56,13 @@ // |matches_|. void DoAutocomplete(const AutocompleteInput& input); + // Get the matches from |bookmark_model_| using the appropriate matching + // algorithm, determined by |GetMatchingAlgorithm()|, and path matching + // algorithm, determined by the |kBookmarkPaths| base::feature. + std::vector<bookmarks::TitledUrlMatch> GetMatchesWithBookmarkPaths( + const AutocompleteInput& input, + size_t kMaxBookmarkMatches); + // There are 2 short bookmark features that determine the matching algorithm // used, i.e. whether input words shorter than 3 chars can prefix match. // 1) |IsShortBookmarkSuggestionsEnabled()| always allows short input word
diff --git a/components/omnibox/browser/bookmark_provider_unittest.cc b/components/omnibox/browser/bookmark_provider_unittest.cc index 8110e3e..44c6bc7 100644 --- a/components/omnibox/browser/bookmark_provider_unittest.cc +++ b/components/omnibox/browser/bookmark_provider_unittest.cc
@@ -543,20 +543,20 @@ { SCOPED_TRACE("Default."); - TestNumMatchesAndTriggeredFeature("te", false); - TestNumMatchesAndTriggeredFeature("te ", false); - TestNumMatchesAndTriggeredFeature("tes", true); - TestNumMatchesAndTriggeredFeature("te sh bo", false); + TestNumMatchesAndTriggeredFeature("te", 0); + TestNumMatchesAndTriggeredFeature("te ", 0); + TestNumMatchesAndTriggeredFeature("tes", 1); + TestNumMatchesAndTriggeredFeature("te sh bo", 0); } { SCOPED_TRACE("Short bookmarks enabled."); base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(omnibox::kShortBookmarkSuggestions); - TestNumMatchesAndTriggeredFeature("te", true); - TestNumMatchesAndTriggeredFeature("te ", true); - TestNumMatchesAndTriggeredFeature("tes", true); - TestNumMatchesAndTriggeredFeature("te sh bo", true); + TestNumMatchesAndTriggeredFeature("te", 1); + TestNumMatchesAndTriggeredFeature("te ", 1); + TestNumMatchesAndTriggeredFeature("tes", 1); + TestNumMatchesAndTriggeredFeature("te sh bo", 1); } { @@ -564,10 +564,10 @@ base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature( omnibox::kShortBookmarkSuggestionsByTotalInputLength); - TestNumMatchesAndTriggeredFeature("te", false); - TestNumMatchesAndTriggeredFeature("te ", true, trigger_feature); - TestNumMatchesAndTriggeredFeature("tes", true, trigger_feature); - TestNumMatchesAndTriggeredFeature("te sh bo", true, trigger_feature); + TestNumMatchesAndTriggeredFeature("te", 0); + TestNumMatchesAndTriggeredFeature("te ", 1, trigger_feature); + TestNumMatchesAndTriggeredFeature("tes", 1, trigger_feature); + TestNumMatchesAndTriggeredFeature("te sh bo", 1, trigger_feature); } { @@ -578,11 +578,11 @@ {{OmniboxFieldTrial:: kShortBookmarkSuggestionsByTotalInputLengthThresholdParam, "5"}}); - TestNumMatchesAndTriggeredFeature("te", false); - TestNumMatchesAndTriggeredFeature("te ", false); - TestNumMatchesAndTriggeredFeature("te ", true, trigger_feature); - TestNumMatchesAndTriggeredFeature("tes", true); - TestNumMatchesAndTriggeredFeature("te sh bo", true, trigger_feature); + TestNumMatchesAndTriggeredFeature("te", 0); + TestNumMatchesAndTriggeredFeature("te ", 0); + TestNumMatchesAndTriggeredFeature("te ", 1, trigger_feature); + TestNumMatchesAndTriggeredFeature("tes", 1); + TestNumMatchesAndTriggeredFeature("te sh bo", 1, trigger_feature); } { @@ -593,10 +593,10 @@ {{OmniboxFieldTrial:: kShortBookmarkSuggestionsByTotalInputLengthCounterfactualParam, "true"}}); - TestNumMatchesAndTriggeredFeature("te", false); - TestNumMatchesAndTriggeredFeature("te ", false, trigger_feature); - TestNumMatchesAndTriggeredFeature("tes", true, trigger_feature); - TestNumMatchesAndTriggeredFeature("te sh bo", false, trigger_feature); + TestNumMatchesAndTriggeredFeature("te", 0); + TestNumMatchesAndTriggeredFeature("te ", 0, trigger_feature); + TestNumMatchesAndTriggeredFeature("tes", 1, trigger_feature); + TestNumMatchesAndTriggeredFeature("te sh bo", 0, trigger_feature); } { @@ -611,11 +611,11 @@ {OmniboxFieldTrial:: kShortBookmarkSuggestionsByTotalInputLengthCounterfactualParam, "true"}}); - TestNumMatchesAndTriggeredFeature("te", false); - TestNumMatchesAndTriggeredFeature("te ", false); - TestNumMatchesAndTriggeredFeature("te ", false, trigger_feature); - TestNumMatchesAndTriggeredFeature("tes", true); - TestNumMatchesAndTriggeredFeature("te sh bo", false, trigger_feature); + TestNumMatchesAndTriggeredFeature("te", 0); + TestNumMatchesAndTriggeredFeature("te ", 0); + TestNumMatchesAndTriggeredFeature("te ", 0, trigger_feature); + TestNumMatchesAndTriggeredFeature("tes", 1); + TestNumMatchesAndTriggeredFeature("te sh bo", 0, trigger_feature); } { @@ -631,11 +631,11 @@ {OmniboxFieldTrial:: kRichAutocompletionAutocompleteNonPrefixShortcutProviderParam, "true"}}); - TestNumMatchesAndTriggeredFeature("te", false); - TestNumMatchesAndTriggeredFeature("te ", false); - TestNumMatchesAndTriggeredFeature("te ", false); - TestNumMatchesAndTriggeredFeature("tes", true); - TestNumMatchesAndTriggeredFeature("te sh bo", false); + TestNumMatchesAndTriggeredFeature("te", 0); + TestNumMatchesAndTriggeredFeature("te ", 0); + TestNumMatchesAndTriggeredFeature("te ", 0); + TestNumMatchesAndTriggeredFeature("tes", 1); + TestNumMatchesAndTriggeredFeature("te sh bo", 0); } { @@ -650,11 +650,11 @@ "5"}, {OmniboxFieldTrial::kRichAutocompletionAutocompleteNonPrefixAllParam, "true"}}); - TestNumMatchesAndTriggeredFeature("te", false); - TestNumMatchesAndTriggeredFeature("te ", false); - TestNumMatchesAndTriggeredFeature("te ", true, trigger_feature); - TestNumMatchesAndTriggeredFeature("tes", true); - TestNumMatchesAndTriggeredFeature("te sh bo", true, trigger_feature); + TestNumMatchesAndTriggeredFeature("te", 0); + TestNumMatchesAndTriggeredFeature("te ", 0); + TestNumMatchesAndTriggeredFeature("te ", 1, trigger_feature); + TestNumMatchesAndTriggeredFeature("tes", 1); + TestNumMatchesAndTriggeredFeature("te sh bo", 1, trigger_feature); } { @@ -669,11 +669,11 @@ "5"}, {OmniboxFieldTrial::kRichAutocompletionAutocompleteTitlesParam, "true"}}); - TestNumMatchesAndTriggeredFeature("te", false); - TestNumMatchesAndTriggeredFeature("te ", false); - TestNumMatchesAndTriggeredFeature("te ", true, trigger_feature); - TestNumMatchesAndTriggeredFeature("tes", true); - TestNumMatchesAndTriggeredFeature("te sh bo", true, trigger_feature); + TestNumMatchesAndTriggeredFeature("te", 0); + TestNumMatchesAndTriggeredFeature("te ", 0); + TestNumMatchesAndTriggeredFeature("te ", 1, trigger_feature); + TestNumMatchesAndTriggeredFeature("tes", 1); + TestNumMatchesAndTriggeredFeature("te sh bo", 1, trigger_feature); } { @@ -693,10 +693,59 @@ "true"}, {OmniboxFieldTrial::kRichAutocompletionAutocompleteTitlesParam, "true"}}); - TestNumMatchesAndTriggeredFeature("te", false); - TestNumMatchesAndTriggeredFeature("te ", false); - TestNumMatchesAndTriggeredFeature("te ", true, trigger_feature); - TestNumMatchesAndTriggeredFeature("tes", true); - TestNumMatchesAndTriggeredFeature("te sh bo", true, trigger_feature); + TestNumMatchesAndTriggeredFeature("te", 0); + TestNumMatchesAndTriggeredFeature("te ", 0); + TestNumMatchesAndTriggeredFeature("te ", 1, trigger_feature); + TestNumMatchesAndTriggeredFeature("tes", 1); + TestNumMatchesAndTriggeredFeature("te sh bo", 1, trigger_feature); + } +} + +TEST_F(BookmarkProviderTest, GetMatchesWithBookmarkPaths) { + auto trigger_feature = + OmniboxTriggeredFeatureService::Feature::kBookmarkPaths; + + { + // When the feature is off, should not return path matched bookmarks nor + // trigger counterfactual logging. + SCOPED_TRACE("feature disabled"); + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature(omnibox::kBookmarkPaths); + TestNumMatchesAndTriggeredFeature("carefully other", 0); + } + + { + // When enabled without counterfactual logging, should return path matched + // bookmark but not trigger counterfactual logging even it path matched. + SCOPED_TRACE("feature enabled without counterfactual"); + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(omnibox::kBookmarkPaths); + TestNumMatchesAndTriggeredFeature("carefully other", 1); + } + + { + // When enabled with "control" counterfactual logging, should not return + // path matched bookmarks but trigger counterfactual logging if it path + // matched. + SCOPED_TRACE("feature enabled with control counterfactual"); + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeatureWithParameters( + omnibox::kBookmarkPaths, + {{OmniboxFieldTrial::kBookmarkPathsCounterfactual, "control"}}); + TestNumMatchesAndTriggeredFeature("carefully", 1); + TestNumMatchesAndTriggeredFeature("carefully other", 0, trigger_feature); + } + + { + // When enabled with "enabled" counterfactal logging, should return path + // matched bookmarks and trigger counterfactual logging if it path + // matched. + SCOPED_TRACE("feature enabled with enabled counterfactual"); + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeatureWithParameters( + omnibox::kBookmarkPaths, + {{OmniboxFieldTrial::kBookmarkPathsCounterfactual, "enabled"}}); + TestNumMatchesAndTriggeredFeature("carefully", 1); + TestNumMatchesAndTriggeredFeature("carefully other", 1, trigger_feature); } }
diff --git a/components/omnibox/browser/local_history_zero_suggest_provider.cc b/components/omnibox/browser/local_history_zero_suggest_provider.cc index d13d482b..90bcf268 100644 --- a/components/omnibox/browser/local_history_zero_suggest_provider.cc +++ b/components/omnibox/browser/local_history_zero_suggest_provider.cc
@@ -35,6 +35,7 @@ #include "components/omnibox/common/omnibox_features.h" #include "components/search_engines/omnibox_focus_type.h" #include "components/search_engines/template_url_service.h" +#include "components/signin/public/identity_manager/identity_manager.h" #include "url/gurl.h" using metrics::OmniboxEventProto; @@ -198,6 +199,13 @@ LocalHistoryZeroSuggestProvider::~LocalHistoryZeroSuggestProvider() {} +bool LocalHistoryZeroSuggestProvider::IsSignedIn() { + const auto* identity_manager = client_->GetIdentityManager(); + return identity_manager ? identity_manager->HasPrimaryAccount( + signin::ConsentLevel::kNotRequired) + : false; +} + void LocalHistoryZeroSuggestProvider::QueryURLDatabase( const AutocompleteInput& input) { done_ = true; @@ -238,9 +246,8 @@ }; std::sort(results.begin(), results.end(), CompareByFrecency); - int relevance = client_->IsAuthenticated() - ? kLocalHistoryZPSAuthenticatedRelevance - : kLocalHistoryZPSUnauthenticatedRelevance; + int relevance = IsSignedIn() ? kLocalHistoryZPSAuthenticatedRelevance + : kLocalHistoryZPSUnauthenticatedRelevance; for (const auto& result : results) { SearchSuggestionParser::SuggestResult suggestion( /*suggestion=*/result.normalized_term,
diff --git a/components/omnibox/browser/local_history_zero_suggest_provider.h b/components/omnibox/browser/local_history_zero_suggest_provider.h index f7d8829..f19f5b63 100644 --- a/components/omnibox/browser/local_history_zero_suggest_provider.h +++ b/components/omnibox/browser/local_history_zero_suggest_provider.h
@@ -44,6 +44,9 @@ LocalHistoryZeroSuggestProvider& operator=( const LocalHistoryZeroSuggestProvider&) = delete; + // Returns whether the primary account is available. No sync consent required. + bool IsSignedIn(); + // Queries the keyword search terms table of the in-memory URLDatabase for the // recent search terms submitted to the default search provider. void QueryURLDatabase(const AutocompleteInput& input);
diff --git a/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc b/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc index 6c64b8d..f591ba9 100644 --- a/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc +++ b/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc
@@ -30,6 +30,7 @@ #include "components/search_engines/search_engines_test_util.h" #include "components/search_engines/template_url.h" #include "components/search_engines/template_url_service.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" #include "testing/gtest/include/gtest/gtest.h" using base::Time; @@ -73,7 +74,12 @@ protected: // testing::Test void SetUp() override { + identity_env_ = std::make_unique<signin::IdentityTestEnvironment>( + &test_url_loader_factory_); + client_ = std::make_unique<FakeAutocompleteProviderClient>(); + client_->set_identity_manager(identity_env_->identity_manager()); + provider_ = base::WrapRefCounted( LocalHistoryZeroSuggestProvider::Create(client_.get(), this)); @@ -120,6 +126,12 @@ // Verifies that provider matches are as expected. void ExpectMatches(const std::vector<TestMatchData>& match_data_list); + // Makes an "unconsented" primary account available. + void SignIn(); + + // Clears the primary account. + void SignOut(); + const TemplateURL* default_search_provider() { return client_->GetTemplateURLService()->GetDefaultSearchProvider(); } @@ -128,6 +140,8 @@ // Used to spin the message loop until |provider_| is done with its async ops. std::unique_ptr<base::RunLoop> provider_run_loop_; std::unique_ptr<base::test::ScopedFeatureList> scoped_feature_list_; + network::TestURLLoaderFactory test_url_loader_factory_; + std::unique_ptr<signin::IdentityTestEnvironment> identity_env_; std::unique_ptr<FakeAutocompleteProviderClient> client_; scoped_refptr<LocalHistoryZeroSuggestProvider> provider_; }; @@ -201,6 +215,14 @@ } } +void LocalHistoryZeroSuggestProviderTest::SignIn() { + identity_env_->MakeUnconsentedPrimaryAccountAvailable("test@email.com"); +} + +void LocalHistoryZeroSuggestProviderTest::SignOut() { + identity_env_->ClearPrimaryAccount(); +} + // Tests that suggestions are returned only if when input is empty and focused. TEST_F(LocalHistoryZeroSuggestProviderTest, Input) { base::HistogramTester histogram_tester; @@ -284,17 +306,13 @@ scoped_feature_list_->InitAndEnableFeature( omnibox::kOmniboxLocalZeroSuggestForAuthenticatedUsers); - EXPECT_CALL(*client_.get(), IsAuthenticated()) - .WillOnce(testing::Return(true)); + StartProviderAndWaitUntilDone(); + ExpectMatches({{"hello world", kLocalHistoryZPSUnauthenticatedRelevance}}); + + SignIn(); StartProviderAndWaitUntilDone(); ExpectMatches({{"hello world", kLocalHistoryZPSAuthenticatedRelevance}}); - - EXPECT_CALL(*client_.get(), IsAuthenticated()) - .WillOnce(testing::Return(false)); - - StartProviderAndWaitUntilDone(); - ExpectMatches({{"hello world", kLocalHistoryZPSUnauthenticatedRelevance}}); } // Tests that suggestions are returned for signed-out users only when @@ -318,17 +336,17 @@ omnibox::kOmniboxLocalZeroSuggestForAuthenticatedUsers); EXPECT_CALL(*client_.get(), IsAuthenticated()) - .WillOnce(testing::Return(true)); - - StartProviderAndWaitUntilDone(); - ExpectMatches({}); - - EXPECT_CALL(*client_.get(), IsAuthenticated()) - .Times(2) - .WillRepeatedly(testing::Return(false)); + .WillOnce(testing::Return(false)); StartProviderAndWaitUntilDone(); ExpectMatches({{"hello world", kLocalHistoryZPSUnauthenticatedRelevance}}); + + EXPECT_CALL(*client_.get(), IsAuthenticated()) + .WillOnce(testing::Return(true)); + SignIn(); + + StartProviderAndWaitUntilDone(); + ExpectMatches({}); } // Tests that suggestions are returned only if FeatureFlags is configured
diff --git a/components/omnibox/browser/mock_autocomplete_provider_client.h b/components/omnibox/browser/mock_autocomplete_provider_client.h index d7b281e..ef534db 100644 --- a/components/omnibox/browser/mock_autocomplete_provider_client.h +++ b/components/omnibox/browser/mock_autocomplete_provider_client.h
@@ -93,6 +93,10 @@ return nullptr; } + signin::IdentityManager* GetIdentityManager() const override { + return identity_manager_; + } + MOCK_CONST_METHOD0(GetAcceptLanguages, std::string()); MOCK_CONST_METHOD0(GetEmbedderRepresentationOfAboutScheme, std::string()); MOCK_METHOD0(GetBuiltinURLs, std::vector<base::string16>()); @@ -124,6 +128,10 @@ template_url_service_ = std::move(service); } + void set_identity_manager(signin::IdentityManager* identity_manager) { + identity_manager_ = identity_manager; + } + network::TestURLLoaderFactory* test_url_loader_factory() { return &test_url_loader_factory_; } @@ -138,6 +146,7 @@ std::unique_ptr<OmniboxPedalProvider> pedal_provider_; std::unique_ptr<OmniboxTriggeredFeatureService> omnibox_triggered_feature_service_; + signin::IdentityManager* identity_manager_ = nullptr; // Not owned. }; #endif // COMPONENTS_OMNIBOX_BROWSER_MOCK_AUTOCOMPLETE_PROVIDER_CLIENT_H_
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc index 25a974c..6a248dc 100644 --- a/components/omnibox/browser/omnibox_field_trial.cc +++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -1016,6 +1016,8 @@ OmniboxFieldTrial::kEntitySuggestionsReduceLatencyDecoderWakeupParam[] = "EntitySuggestionsReduceLatencyDecoderWakeup"; +extern const char OmniboxFieldTrial::kBookmarkPathsCounterfactual[] = + "OmniboxBookmarkPathsCounterfactual"; extern const char OmniboxFieldTrial::kBookmarkPathsUiReplaceTitle[] = "OmniboxBookmarkPathsUiReplaceTitle"; extern const char OmniboxFieldTrial::kBookmarkPathsUiReplaceUrl[] =
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h index 506ce50..313e919 100644 --- a/components/omnibox/browser/omnibox_field_trial.h +++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -575,6 +575,7 @@ // Parameter names used for bookmark path variations that determine whether // bookmark suggestion texts will contain the title, URL, and/or path. +extern const char kBookmarkPathsCounterfactual[]; extern const char kBookmarkPathsUiReplaceTitle[]; extern const char kBookmarkPathsUiReplaceUrl[]; extern const char kBookmarkPathsUiAppendAfterTitle[];
diff --git a/components/omnibox/browser/omnibox_triggered_feature_service.h b/components/omnibox/browser/omnibox_triggered_feature_service.h index 5ad32ac4..e1778a7 100644 --- a/components/omnibox/browser/omnibox_triggered_feature_service.h +++ b/components/omnibox/browser/omnibox_triggered_feature_service.h
@@ -18,6 +18,7 @@ // corresponding entry should be added in the UMA histograms. enum class Feature { kRichAutocompletion = 0, + kBookmarkPaths = 1, kShortBookmarkSuggestionsByTotalInputLength = 2, kMaxValue = kShortBookmarkSuggestionsByTotalInputLength, };
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index 54e8a089..0a2dfcd 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -50,10 +50,6 @@ "change_password_url_service.h", "change_password_url_service_impl.cc", "change_password_url_service_impl.h", - "compromised_credentials_consumer.cc", - "compromised_credentials_consumer.h", - "compromised_credentials_observer.cc", - "compromised_credentials_observer.h", "credential_cache.cc", "credential_cache.h", "credential_manager_impl.cc", @@ -105,6 +101,10 @@ "http_password_store_migrator.h", "import/password_importer.cc", "import/password_importer.h", + "insecure_credentials_consumer.cc", + "insecure_credentials_consumer.h", + "insecure_credentials_observer.cc", + "insecure_credentials_observer.h", "insecure_credentials_table.cc", "insecure_credentials_table.h", "leak_detection_delegate.cc", @@ -597,7 +597,6 @@ "browser_save_password_progress_logger_unittest.cc", "bulk_leak_check_service_unittest.cc", "change_password_url_service_impl_unittest.cc", - "compromised_credentials_observer_unittest.cc", "credential_cache_unittest.cc", "credential_manager_impl_unittest.cc", "credential_manager_logger_unittest.cc", @@ -620,6 +619,7 @@ "http_auth_manager_unittest.cc", "http_password_store_migrator_unittest.cc", "import/password_importer_unittest.cc", + "insecure_credentials_observer_unittest.cc", "insecure_credentials_table_unittest.cc", "leak_detection_delegate_helper_unittest.cc", "leak_detection_delegate_unittest.cc",
diff --git a/components/password_manager/core/browser/compromised_credentials_consumer.cc b/components/password_manager/core/browser/compromised_credentials_consumer.cc deleted file mode 100644 index 5c8d914..0000000 --- a/components/password_manager/core/browser/compromised_credentials_consumer.cc +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2019 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 "components/password_manager/core/browser/compromised_credentials_consumer.h" - -#include "components/password_manager/core/browser/insecure_credentials_table.h" - -namespace password_manager { - -CompromisedCredentialsConsumer::CompromisedCredentialsConsumer() = default; - -CompromisedCredentialsConsumer::~CompromisedCredentialsConsumer() = default; - -void CompromisedCredentialsConsumer::OnGetCompromisedCredentialsFrom( - PasswordStore* store, - std::vector<CompromisedCredentials> compromised_credentials) { - OnGetCompromisedCredentials(std::move(compromised_credentials)); -} - -} // namespace password_manager
diff --git a/components/password_manager/core/browser/compromised_credentials_consumer.h b/components/password_manager/core/browser/compromised_credentials_consumer.h deleted file mode 100644 index dbc5c0d..0000000 --- a/components/password_manager/core/browser/compromised_credentials_consumer.h +++ /dev/null
@@ -1,60 +0,0 @@ -// Copyright 2019 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 COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_COMPROMISED_CREDENTIALS_CONSUMER_H_ -#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_COMPROMISED_CREDENTIALS_CONSUMER_H_ - -#include <vector> - -#include "base/task/cancelable_task_tracker.h" - -namespace password_manager { - -struct CompromisedCredentials; -class PasswordStore; - -// Reads information associated with compromised credentials history from the -// PasswordStore. Reads are done asynchronously on a separate thread. It -// provides the virtual callback method, which is guaranteed to be executed on -// this (the UI) thread. It also provides the base::CancelableTaskTracker -// member, which cancels any outstanding tasks upon destruction. -class CompromisedCredentialsConsumer { - public: - CompromisedCredentialsConsumer(); - - // Called when the GetAllCompromisedCredentials() request is finished, with - // the associated |compromised_credentials|. - virtual void OnGetCompromisedCredentials( - std::vector<CompromisedCredentials> compromised_credentials) = 0; - - // Like OnGetCompromisedCredentials(), but also receives the originating - // PasswordStore as a parameter. This is useful for consumers that query - // both the profile-scoped and the account-scoped store. The default - // implementation simply calls OnGetCompromisedCredentials(), so consumers - // that don't care about the store can just ignore this. - virtual void OnGetCompromisedCredentialsFrom( - PasswordStore* store, - std::vector<CompromisedCredentials> compromised_credentials); - - // The base::CancelableTaskTracker can be used for cancelling the tasks - // associated with the consumer. - base::CancelableTaskTracker* cancelable_task_tracker() { - return &cancelable_task_tracker_; - } - - base::WeakPtr<CompromisedCredentialsConsumer> GetWeakPtr() { - return weak_ptr_factory_.GetWeakPtr(); - } - - protected: - virtual ~CompromisedCredentialsConsumer(); - - private: - base::CancelableTaskTracker cancelable_task_tracker_; - base::WeakPtrFactory<CompromisedCredentialsConsumer> weak_ptr_factory_{this}; -}; - -} // namespace password_manager - -#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_COMPROMISED_CREDENTIALS_CONSUMER_H_
diff --git a/components/password_manager/core/browser/compromised_credentials_observer.h b/components/password_manager/core/browser/compromised_credentials_observer.h deleted file mode 100644 index 36a59a88..0000000 --- a/components/password_manager/core/browser/compromised_credentials_observer.h +++ /dev/null
@@ -1,31 +0,0 @@ -// Copyright 2019 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 COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_COMPROMISED_CREDENTIALS_OBSERVER_H_ -#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_COMPROMISED_CREDENTIALS_OBSERVER_H_ - -#include "base/callback.h" -#include "components/password_manager/core/browser/insecure_credentials_table.h" -#include "components/password_manager/core/browser/password_store_change.h" - -namespace password_manager { - -// The callback to use to synchronously remove a compromised -// credentials from the password store. The parameters match those in -// RemoveCompromisedCredentials. -using RemoveCompromisedCallback = - base::RepeatingCallback<void(const std::string&, - const base::string16&, - RemoveInsecureCredentialsReason)>; - -// Called when the content of the password store changes. -// Removes rows from the compromised credentials database if the login -// was removed or the password was updated. If row is not in the database, -// the call is ignored. -void ProcessLoginsChanged(const PasswordStoreChangeList& changes, - const RemoveCompromisedCallback& remove_callback); - -} // namespace password_manager - -#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_COMPROMISED_CREDENTIALS_OBSERVER_H_
diff --git a/components/password_manager/core/browser/form_fetcher_impl.cc b/components/password_manager/core/browser/form_fetcher_impl.cc index c921e4d..7c2285c 100644 --- a/components/password_manager/core/browser/form_fetcher_impl.cc +++ b/components/password_manager/core/browser/form_fetcher_impl.cc
@@ -139,7 +139,7 @@ base::span<const CompromisedCredentials> FormFetcherImpl::GetCompromisedCredentials() const { - return compromised_credentials_; + return insecure_credentials_; } std::vector<const PasswordForm*> FormFetcherImpl::GetNonFederatedMatches() @@ -195,7 +195,7 @@ &result->preferred_match_); result->interactions_stats_ = interactions_stats_; - result->compromised_credentials_ = compromised_credentials_; + result->insecure_credentials_ = insecure_credentials_; result->state_ = state_; result->need_to_refetch_ = need_to_refetch_; @@ -276,9 +276,9 @@ ProcessPasswordStoreResults(std::move(forms)); } -void FormFetcherImpl::OnGetCompromisedCredentials( - std::vector<CompromisedCredentials> compromised_credentials) { - compromised_credentials_ = std::move(compromised_credentials); +void FormFetcherImpl::OnGetInsecureCredentials( + std::vector<InsecureCredential> insecure_credentials) { + insecure_credentials_ = std::move(insecure_credentials); } } // namespace password_manager
diff --git a/components/password_manager/core/browser/form_fetcher_impl.h b/components/password_manager/core/browser/form_fetcher_impl.h index 6d631bf6..f1ee9c27 100644 --- a/components/password_manager/core/browser/form_fetcher_impl.h +++ b/components/password_manager/core/browser/form_fetcher_impl.h
@@ -11,9 +11,9 @@ #include "base/macros.h" #include "base/observer_list.h" -#include "components/password_manager/core/browser/compromised_credentials_consumer.h" #include "components/password_manager/core/browser/form_fetcher.h" #include "components/password_manager/core/browser/http_password_store_migrator.h" +#include "components/password_manager/core/browser/insecure_credentials_consumer.h" #include "components/password_manager/core/browser/insecure_credentials_table.h" #include "components/password_manager/core/browser/password_store.h" #include "components/password_manager/core/browser/password_store_consumer.h" @@ -27,7 +27,7 @@ // update the Clone() method accordingly. class FormFetcherImpl : public FormFetcher, public PasswordStoreConsumer, - public CompromisedCredentialsConsumer, + public InsecureCredentialsConsumer, public HttpPasswordStoreMigrator::Consumer { public: // |form_digest| describes what credentials need to be retrieved and @@ -94,8 +94,8 @@ // non-federated matches. std::vector<std::unique_ptr<PasswordForm>> federated_; - // List of compromised credentials for the current domain. - std::vector<CompromisedCredentials> compromised_credentials_; + // List of insecure credentials for the current domain. + std::vector<InsecureCredential> insecure_credentials_; // Indicates whether HTTP passwords should be migrated to HTTPS. This is // always false for non HTML forms. @@ -111,9 +111,9 @@ void ProcessMigratedForms( std::vector<std::unique_ptr<PasswordForm>> forms) override; - // CompromisedCredentialsConsumer: - void OnGetCompromisedCredentials( - std::vector<CompromisedCredentials> compromised_credentials) override; + // InsecureCredentialsConsumer: + void OnGetInsecureCredentials( + std::vector<InsecureCredential> insecure_credentials) override; // Does the actual migration. std::unique_ptr<HttpPasswordStoreMigrator> http_migrator_;
diff --git a/components/password_manager/core/browser/form_fetcher_impl_unittest.cc b/components/password_manager/core/browser/form_fetcher_impl_unittest.cc index f1324bf9..a7aea6f9b 100644 --- a/components/password_manager/core/browser/form_fetcher_impl_unittest.cc +++ b/components/password_manager/core/browser/form_fetcher_impl_unittest.cc
@@ -418,12 +418,11 @@ TEST_P(FormFetcherImplTest, CompromisedCredentials) { Fetch(); form_fetcher_->AddConsumer(&consumer_); - const std::vector<CompromisedCredentials> credentials = { - CompromisedCredentials( - form_digest_.signon_realm, base::ASCIIToUTF16("username_value"), - base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false))}; - static_cast<CompromisedCredentialsConsumer*>(form_fetcher_.get()) - ->OnGetCompromisedCredentials(credentials); + const std::vector<InsecureCredential> credentials = {InsecureCredential( + form_digest_.signon_realm, base::ASCIIToUTF16("username_value"), + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false))}; + static_cast<InsecureCredentialsConsumer*>(form_fetcher_.get()) + ->OnGetInsecureCredentials(credentials); EXPECT_THAT(form_fetcher_->GetCompromisedCredentials(), UnorderedElementsAreArray(credentials)); } @@ -488,11 +487,10 @@ UnorderedElementsAre(stats)); } -TEST_P(FormFetcherImplTest, FetchCompromised) { - CompromisedCredentials credentials( +TEST_P(FormFetcherImplTest, FetchInsecure) { + std::vector<InsecureCredential> list = {InsecureCredential( form_digest_.signon_realm, base::ASCIIToUTF16("username_value"), - base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); - std::vector<CompromisedCredentials> list = {credentials}; + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false))}; EXPECT_CALL(*mock_store_, GetMatchingInsecureCredentialsImpl(form_digest_.signon_realm)) .WillOnce(Return(list)); @@ -510,7 +508,7 @@ task_environment_.RunUntilIdle(); } -TEST_P(FormFetcherImplTest, DontFetchCompromised) { +TEST_P(FormFetcherImplTest, DontFetchInsecure) { EXPECT_CALL(*mock_store_, GetMatchingInsecureCredentialsImpl).Times(0); form_fetcher_->Fetch(); task_environment_.RunUntilIdle(); @@ -810,12 +808,11 @@ // Pass empty results to make the state NOT_WAITING. store_consumer()->OnGetPasswordStoreResultsFrom( mock_store_.get(), std::vector<std::unique_ptr<PasswordForm>>()); - const std::vector<CompromisedCredentials> credentials = { - CompromisedCredentials( - form_digest_.signon_realm, base::ASCIIToUTF16("username_value"), - base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false))}; - static_cast<CompromisedCredentialsConsumer*>(form_fetcher_.get()) - ->OnGetCompromisedCredentials(credentials); + const std::vector<InsecureCredential> credentials = {InsecureCredential( + form_digest_.signon_realm, base::ASCIIToUTF16("username_value"), + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false))}; + static_cast<InsecureCredentialsConsumer*>(form_fetcher_.get()) + ->OnGetInsecureCredentials(credentials); auto clone = form_fetcher_->Clone(); EXPECT_THAT(clone->GetCompromisedCredentials(),
diff --git a/components/password_manager/core/browser/insecure_credentials_consumer.cc b/components/password_manager/core/browser/insecure_credentials_consumer.cc new file mode 100644 index 0000000..5458670 --- /dev/null +++ b/components/password_manager/core/browser/insecure_credentials_consumer.cc
@@ -0,0 +1,21 @@ +// Copyright 2019 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 "components/password_manager/core/browser/insecure_credentials_consumer.h" + +#include "components/password_manager/core/browser/insecure_credentials_table.h" + +namespace password_manager { + +InsecureCredentialsConsumer::InsecureCredentialsConsumer() = default; + +InsecureCredentialsConsumer::~InsecureCredentialsConsumer() = default; + +void InsecureCredentialsConsumer::OnGetInsecureCredentialsFrom( + PasswordStore* store, + std::vector<InsecureCredential> insecure_credentials) { + OnGetInsecureCredentials(std::move(insecure_credentials)); +} + +} // namespace password_manager
diff --git a/components/password_manager/core/browser/insecure_credentials_consumer.h b/components/password_manager/core/browser/insecure_credentials_consumer.h new file mode 100644 index 0000000..1b1ea522 --- /dev/null +++ b/components/password_manager/core/browser/insecure_credentials_consumer.h
@@ -0,0 +1,60 @@ +// Copyright 2019 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 COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_INSECURE_CREDENTIALS_CONSUMER_H_ +#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_INSECURE_CREDENTIALS_CONSUMER_H_ + +#include <vector> + +#include "base/task/cancelable_task_tracker.h" +#include "components/password_manager/core/browser/insecure_credentials_table.h" + +namespace password_manager { + +class PasswordStore; + +// Reads information associated with insecure credentials history from the +// PasswordStore. Reads are done asynchronously on a separate thread. It +// provides the virtual callback method, which is guaranteed to be executed on +// this (the UI) thread. It also provides the base::CancelableTaskTracker +// member, which cancels any outstanding tasks upon destruction. +class InsecureCredentialsConsumer { + public: + InsecureCredentialsConsumer(); + + // Called when the GetAllInsecureCredentials() request is finished, with + // the associated |insecure_credentials|. + virtual void OnGetInsecureCredentials( + std::vector<InsecureCredential> insecure_credentials) = 0; + + // Like OnGetInsecureCredentials(), but also receives the originating + // PasswordStore as a parameter. This is useful for consumers that query + // both the profile-scoped and the account-scoped store. The default + // implementation simply calls OnGetInsecureCredentials(), so consumers + // that don't care about the store can just ignore this. + virtual void OnGetInsecureCredentialsFrom( + PasswordStore* store, + std::vector<InsecureCredential> insecure_credentials); + + // The base::CancelableTaskTracker can be used for cancelling the tasks + // associated with the consumer. + base::CancelableTaskTracker* cancelable_task_tracker() { + return &cancelable_task_tracker_; + } + + base::WeakPtr<InsecureCredentialsConsumer> GetWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); + } + + protected: + virtual ~InsecureCredentialsConsumer(); + + private: + base::CancelableTaskTracker cancelable_task_tracker_; + base::WeakPtrFactory<InsecureCredentialsConsumer> weak_ptr_factory_{this}; +}; + +} // namespace password_manager + +#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_INSECURE_CREDENTIALS_CONSUMER_H_
diff --git a/components/password_manager/core/browser/compromised_credentials_observer.cc b/components/password_manager/core/browser/insecure_credentials_observer.cc similarity index 90% rename from components/password_manager/core/browser/compromised_credentials_observer.cc rename to components/password_manager/core/browser/insecure_credentials_observer.cc index 1364060..e326a22f 100644 --- a/components/password_manager/core/browser/compromised_credentials_observer.cc +++ b/components/password_manager/core/browser/insecure_credentials_observer.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/password_manager/core/browser/compromised_credentials_observer.h" +#include "components/password_manager/core/browser/insecure_credentials_observer.h" #include <memory> @@ -13,7 +13,7 @@ namespace password_manager { void ProcessLoginsChanged(const PasswordStoreChangeList& changes, - const RemoveCompromisedCallback& remove_callback) { + const RemoveInsecureCallback& remove_callback) { for (const PasswordStoreChange& change : changes) { // New passwords are not interesting. if (change.type() == PasswordStoreChange::ADD)
diff --git a/components/password_manager/core/browser/insecure_credentials_observer.h b/components/password_manager/core/browser/insecure_credentials_observer.h new file mode 100644 index 0000000..2f6a9c61 --- /dev/null +++ b/components/password_manager/core/browser/insecure_credentials_observer.h
@@ -0,0 +1,30 @@ +// Copyright 2019 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 COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_INSECURE_CREDENTIALS_OBSERVER_H_ +#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_INSECURE_CREDENTIALS_OBSERVER_H_ + +#include "base/callback.h" +#include "components/password_manager/core/browser/insecure_credentials_table.h" +#include "components/password_manager/core/browser/password_store_change.h" + +namespace password_manager { + +// The callback to use to synchronously remove a insecure credentials from the +// password store. The parameters match those in RemoveInsecureCredentials. +using RemoveInsecureCallback = + base::RepeatingCallback<void(const std::string&, + const base::string16&, + RemoveInsecureCredentialsReason)>; + +// Called when the content of the password store changes. +// Removes rows from the insecure credentials database if the login was removed +// or the password was updated. If row is not in the database, the call is +// ignored. +void ProcessLoginsChanged(const PasswordStoreChangeList& changes, + const RemoveInsecureCallback& remove_callback); + +} // namespace password_manager + +#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_INSECURE_CREDENTIALS_OBSERVER_H_
diff --git a/components/password_manager/core/browser/compromised_credentials_observer_unittest.cc b/components/password_manager/core/browser/insecure_credentials_observer_unittest.cc similarity index 87% rename from components/password_manager/core/browser/compromised_credentials_observer_unittest.cc rename to components/password_manager/core/browser/insecure_credentials_observer_unittest.cc index 9dfc6ea3..bdf05f27 100644 --- a/components/password_manager/core/browser/compromised_credentials_observer_unittest.cc +++ b/components/password_manager/core/browser/insecure_credentials_observer_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/password_manager/core/browser/compromised_credentials_observer.h" +#include "components/password_manager/core/browser/insecure_credentials_observer.h" #include "base/strings/string_piece.h" #include "base/strings/utf_string_conversions.h" @@ -30,19 +30,19 @@ return form; } -class CompromisedCredentialsObserverTest : public testing::Test { +class InsecureCredentialsObserverTest : public testing::Test { public: base::HistogramTester& histogram_tester() { return histogram_tester_; } - base::MockCallback<RemoveCompromisedCallback>& remove_callback() { + base::MockCallback<RemoveInsecureCallback>& remove_callback() { return remove_callback_; } private: base::HistogramTester histogram_tester_; - base::MockCallback<RemoveCompromisedCallback> remove_callback_; + base::MockCallback<RemoveInsecureCallback> remove_callback_; }; -TEST_F(CompromisedCredentialsObserverTest, DeletePassword) { +TEST_F(InsecureCredentialsObserverTest, DeletePassword) { const PasswordForm form = TestForm(kUsername); EXPECT_CALL(remove_callback(), Run(form.signon_realm, form.username_value, RemoveInsecureCredentialsReason::kRemove)); @@ -52,7 +52,7 @@ PasswordStoreChange::REMOVE, 1); } -TEST_F(CompromisedCredentialsObserverTest, UpdateFormNoPasswordChange) { +TEST_F(InsecureCredentialsObserverTest, UpdateFormNoPasswordChange) { const PasswordForm form = TestForm(kUsername); EXPECT_CALL(remove_callback(), Run).Times(0); ProcessLoginsChanged( @@ -61,7 +61,7 @@ histogram_tester().ExpectTotalCount(kHistogramName, 0); } -TEST_F(CompromisedCredentialsObserverTest, UpdatePassword) { +TEST_F(InsecureCredentialsObserverTest, UpdatePassword) { const PasswordForm form = TestForm(kUsername); EXPECT_CALL(remove_callback(), Run(form.signon_realm, form.username_value, RemoveInsecureCredentialsReason::kUpdate)); @@ -72,7 +72,7 @@ PasswordStoreChange::UPDATE, 1); } -TEST_F(CompromisedCredentialsObserverTest, UpdateTwice) { +TEST_F(InsecureCredentialsObserverTest, UpdateTwice) { const PasswordForm form = TestForm(kUsername); EXPECT_CALL(remove_callback(), Run(form.signon_realm, form.username_value, RemoveInsecureCredentialsReason::kUpdate)); @@ -85,7 +85,7 @@ PasswordStoreChange::UPDATE, 1); } -TEST_F(CompromisedCredentialsObserverTest, AddPassword) { +TEST_F(InsecureCredentialsObserverTest, AddPassword) { const PasswordForm form = TestForm(kUsername); EXPECT_CALL(remove_callback(), Run).Times(0); ProcessLoginsChanged({PasswordStoreChange(PasswordStoreChange::ADD, form)}, @@ -93,7 +93,7 @@ histogram_tester().ExpectTotalCount(kHistogramName, 0); } -TEST_F(CompromisedCredentialsObserverTest, AddReplacePassword) { +TEST_F(InsecureCredentialsObserverTest, AddReplacePassword) { PasswordForm form = TestForm(kUsername); PasswordStoreChange remove(PasswordStoreChange::REMOVE, form); form.password_value = base::ASCIIToUTF16("new_password_12345"); @@ -105,7 +105,7 @@ PasswordStoreChange::UPDATE, 1); } -TEST_F(CompromisedCredentialsObserverTest, UpdateWithPrimaryKey) { +TEST_F(InsecureCredentialsObserverTest, UpdateWithPrimaryKey) { const PasswordForm old_form = TestForm(kUsername); PasswordStoreChange remove(PasswordStoreChange::REMOVE, old_form); PasswordStoreChange add(PasswordStoreChange::ADD, TestForm(kUsernameNew)); @@ -117,7 +117,7 @@ PasswordStoreChange::UPDATE, 1); } -TEST_F(CompromisedCredentialsObserverTest, UpdateWithPrimaryKey_RemoveTwice) { +TEST_F(InsecureCredentialsObserverTest, UpdateWithPrimaryKey_RemoveTwice) { const PasswordForm old_form = TestForm(kUsername); PasswordStoreChange remove_old(PasswordStoreChange::REMOVE, old_form); const PasswordForm conflicting_new_form = TestForm(kUsernameNew);
diff --git a/components/password_manager/core/browser/multi_store_form_fetcher.cc b/components/password_manager/core/browser/multi_store_form_fetcher.cc index 666ddbc3..abddbe1 100644 --- a/components/password_manager/core/browser/multi_store_form_fetcher.cc +++ b/components/password_manager/core/browser/multi_store_form_fetcher.cc
@@ -162,12 +162,12 @@ AggregatePasswordStoreResults(std::move(forms)); } -void MultiStoreFormFetcher::OnGetCompromisedCredentials( - std::vector<CompromisedCredentials> compromised_credentials) { +void MultiStoreFormFetcher::OnGetInsecureCredentials( + std::vector<InsecureCredential> insecure_credentials) { // Both the profile and account store has been queried. Therefore, append the // received credentials to the existing ones. - base::ranges::move(compromised_credentials, - std::back_inserter(compromised_credentials_)); + base::ranges::move(insecure_credentials, + std::back_inserter(insecure_credentials_)); } void MultiStoreFormFetcher::SplitResults(
diff --git a/components/password_manager/core/browser/multi_store_form_fetcher.h b/components/password_manager/core/browser/multi_store_form_fetcher.h index 8be87883..9a4374f 100644 --- a/components/password_manager/core/browser/multi_store_form_fetcher.h +++ b/components/password_manager/core/browser/multi_store_form_fetcher.h
@@ -39,9 +39,9 @@ void ProcessMigratedForms( std::vector<std::unique_ptr<PasswordForm>> forms) override; - // CompromisedCredentialsConsumer: - void OnGetCompromisedCredentials( - std::vector<CompromisedCredentials> compromised_credentials) override; + // InsecureCredentialsConsumer: + void OnGetInsecureCredentials( + std::vector<InsecureCredential> insecure_credentials) override; private: void AggregatePasswordStoreResults(
diff --git a/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc b/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc index e633a7d1..a442571 100644 --- a/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc +++ b/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc
@@ -439,30 +439,30 @@ EXPECT_FALSE(form_fetcher_->IsMovingBlocked(kUser, psl_form.username_value)); } -TEST_F(MultiStoreFormFetcherTest, CompromisedCredentials) { +TEST_F(MultiStoreFormFetcherTest, InsecureCredentials) { Fetch(); - CompromisedCredentials profile_store_compromised_credentials( + InsecureCredential profile_store_insecure_credentials( form_digest_.signon_realm, base::ASCIIToUTF16("profile_username"), base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); - profile_store_compromised_credentials.in_store = + profile_store_insecure_credentials.in_store = PasswordForm::Store::kProfileStore; - CompromisedCredentials account_store_compromised_credentials( + InsecureCredential account_store_insecure_credentials( form_digest_.signon_realm, base::ASCIIToUTF16("account_username"), base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); - account_store_compromised_credentials.in_store = + account_store_insecure_credentials.in_store = PasswordForm::Store::kAccountStore; - static_cast<CompromisedCredentialsConsumer*>(form_fetcher_.get()) - ->OnGetCompromisedCredentials({profile_store_compromised_credentials}); + static_cast<InsecureCredentialsConsumer*>(form_fetcher_.get()) + ->OnGetInsecureCredentials({profile_store_insecure_credentials}); - static_cast<CompromisedCredentialsConsumer*>(form_fetcher_.get()) - ->OnGetCompromisedCredentials({account_store_compromised_credentials}); + static_cast<InsecureCredentialsConsumer*>(form_fetcher_.get()) + ->OnGetInsecureCredentials({account_store_insecure_credentials}); - EXPECT_THAT(form_fetcher_->GetCompromisedCredentials(), - testing::UnorderedElementsAreArray( - {profile_store_compromised_credentials, - account_store_compromised_credentials})); + EXPECT_THAT( + form_fetcher_->GetCompromisedCredentials(), + testing::UnorderedElementsAreArray({profile_store_insecure_credentials, + account_store_insecure_credentials})); } } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_store.cc b/components/password_manager/core/browser/password_store.cc index 0ee560c..7499c41e 100644 --- a/components/password_manager/core/browser/password_store.cc +++ b/components/password_manager/core/browser/password_store.cc
@@ -29,9 +29,9 @@ #include "build/build_config.h" #include "components/autofill/core/common/form_data.h" #include "components/password_manager/core/browser/android_affiliation/affiliated_match_helper.h" -#include "components/password_manager/core/browser/compromised_credentials_consumer.h" -#include "components/password_manager/core/browser/compromised_credentials_observer.h" #include "components/password_manager/core/browser/field_info_table.h" +#include "components/password_manager/core/browser/insecure_credentials_consumer.h" +#include "components/password_manager/core/browser/insecure_credentials_observer.h" #include "components/password_manager/core/browser/insecure_credentials_table.h" #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/password_manager_metrics_util.h" @@ -426,7 +426,7 @@ } void PasswordStore::GetAllInsecureCredentials( - CompromisedCredentialsConsumer* consumer) { + InsecureCredentialsConsumer* consumer) { DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); PostInsecureCredentialsTaskAndReplyToConsumerWithResult( consumer, @@ -435,7 +435,7 @@ void PasswordStore::GetMatchingInsecureCredentials( const std::string& signon_realm, - CompromisedCredentialsConsumer* consumer) { + InsecureCredentialsConsumer* consumer) { if (affiliated_match_helper_) { FormDigest form(PasswordForm::Scheme::kHtml, signon_realm, GURL(signon_realm)); @@ -948,13 +948,12 @@ } void PasswordStore::PostInsecureCredentialsTaskAndReplyToConsumerWithResult( - CompromisedCredentialsConsumer* consumer, + InsecureCredentialsConsumer* consumer, InsecureCredentialsTask task) { consumer->cancelable_task_tracker()->PostTaskAndReplyWithResult( background_task_runner_.get(), FROM_HERE, std::move(task), - base::BindOnce( - &CompromisedCredentialsConsumer::OnGetCompromisedCredentialsFrom, - consumer->GetWeakPtr(), base::RetainedRef(this))); + base::BindOnce(&InsecureCredentialsConsumer::OnGetInsecureCredentialsFrom, + consumer->GetWeakPtr(), base::RetainedRef(this))); } void PasswordStore::AddLoginInternal(const PasswordForm& form) { @@ -1236,7 +1235,7 @@ } void PasswordStore::ScheduleGetInsecureCredentialsWithAffiliations( - base::WeakPtr<CompromisedCredentialsConsumer> consumer, + base::WeakPtr<InsecureCredentialsConsumer> consumer, const std::string& signon_realm, const std::vector<std::string>& additional_android_realms) { if (consumer) {
diff --git a/components/password_manager/core/browser/password_store.h b/components/password_manager/core/browser/password_store.h index ff6bacc..9ceb740 100644 --- a/components/password_manager/core/browser/password_store.h +++ b/components/password_manager/core/browser/password_store.h
@@ -52,7 +52,7 @@ class AffiliatedMatchHelper; class PasswordStoreConsumer; -class CompromisedCredentialsConsumer; +class InsecureCredentialsConsumer; class PasswordStoreSigninNotifier; class PasswordSyncBridge; struct FieldInfo; @@ -288,12 +288,12 @@ // Retrieves all insecure credentials and notifies |consumer| on // completion. The request will be cancelled if the consumer is destroyed. - void GetAllInsecureCredentials(CompromisedCredentialsConsumer* consumer); + void GetAllInsecureCredentials(InsecureCredentialsConsumer* consumer); // Returns all the insecure credentials for a given site. This list also // includes Android affiliated credentials. void GetMatchingInsecureCredentials(const std::string& signon_realm, - CompromisedCredentialsConsumer* consumer); + InsecureCredentialsConsumer* consumer); // Adds information about field. If the record for given form_signature and // field_signature already exists, the new one will be ignored. @@ -322,12 +322,12 @@ // Removes |observer| from the observer list. void RemoveObserver(Observer* observer); - // Adds an observer to be notified when the list of compromised passwords in + // Adds an observer to be notified when the list of insecure passwords in // the password store changes. void AddDatabaseInsecureCredentialsObserver( DatabaseInsecureCredentialsObserver* observer); - // Removes |observer| from the list of compromised credentials observer. + // Removes |observer| from the list of insecure credentials observer. void RemoveDatabaseInsecureCredentialsObserver( DatabaseInsecureCredentialsObserver* observer); @@ -693,10 +693,10 @@ StatsTask task); // Schedules the given |task| to be run on the PasswordStore's TaskRunner. - // Invokes |consumer|->OnGetCompromisedCredentials() on the caller's thread + // Invokes |consumer|->OnGetInsecureCredentials() on the caller's thread // with the result. void PostInsecureCredentialsTaskAndReplyToConsumerWithResult( - CompromisedCredentialsConsumer* consumer, + InsecureCredentialsConsumer* consumer, InsecureCredentialsTask task); // The following methods notify observers that the password store may have @@ -794,7 +794,7 @@ // Schedules GetInsecureCredentialsWithAffiliationsImpl() to be run on the // background sequence. void ScheduleGetInsecureCredentialsWithAffiliations( - base::WeakPtr<CompromisedCredentialsConsumer> consumer, + base::WeakPtr<InsecureCredentialsConsumer> consumer, const std::string& signon_realm, const std::vector<std::string>& additional_android_realms);
diff --git a/components/password_manager/core/browser/password_store_unittest.cc b/components/password_manager/core/browser/password_store_unittest.cc index c861f54..3770554 100644 --- a/components/password_manager/core/browser/password_store_unittest.cc +++ b/components/password_manager/core/browser/password_store_unittest.cc
@@ -25,8 +25,8 @@ #include "components/password_manager/core/browser/android_affiliation/affiliated_match_helper.h" #include "components/password_manager/core/browser/android_affiliation/android_affiliation_service.h" #include "components/password_manager/core/browser/android_affiliation/mock_affiliated_match_helper.h" -#include "components/password_manager/core/browser/compromised_credentials_consumer.h" #include "components/password_manager/core/browser/form_parsing/form_parser.h" +#include "components/password_manager/core/browser/insecure_credentials_consumer.h" #include "components/password_manager/core/browser/password_manager_test_utils.h" #include "components/password_manager/core/browser/password_reuse_detector.h" #include "components/password_manager/core/browser/password_store.h" @@ -85,16 +85,14 @@ constexpr const char kTestAndroidIconURL2[] = "https://example.com/icon_2.png"; constexpr const time_t kTestLastUsageTime = 1546300800; // 00:00 Jan 1 2019 UTC -class MockCompromisedCredentialsConsumer - : public CompromisedCredentialsConsumer { +class MockInsecureCredentialsConsumer : public InsecureCredentialsConsumer { public: - MockCompromisedCredentialsConsumer() = default; + MockInsecureCredentialsConsumer() = default; - MOCK_METHOD1(OnGetCompromisedCredentials, - void(std::vector<CompromisedCredentials>)); + MOCK_METHOD1(OnGetInsecureCredentials, void(std::vector<InsecureCredential>)); private: - DISALLOW_COPY_AND_ASSIGN(MockCompromisedCredentialsConsumer); + DISALLOW_COPY_AND_ASSIGN(MockInsecureCredentialsConsumer); }; class MockPasswordStoreConsumer : public PasswordStoreConsumer { @@ -465,14 +463,14 @@ store->AddInsecureCredential(insecure_credential); WaitForPasswordStore(); - MockCompromisedCredentialsConsumer consumer; + MockInsecureCredentialsConsumer consumer; base::RunLoop run_loop; store->RemoveLoginsCreatedBetween(base::Time::FromDoubleT(0), base::Time::FromDoubleT(2), run_loop.QuitClosure()); run_loop.Run(); - EXPECT_CALL(consumer, OnGetCompromisedCredentials(testing::IsEmpty())); + EXPECT_CALL(consumer, OnGetInsecureCredentials(testing::IsEmpty())); store->GetAllInsecureCredentials(&consumer); WaitForPasswordStore(); @@ -504,14 +502,14 @@ store->AddInsecureCredential(insecure_credential); WaitForPasswordStore(); - MockCompromisedCredentialsConsumer consumer; + MockInsecureCredentialsConsumer consumer; kTestCredential.password_value = L"password_value_2"; std::unique_ptr<PasswordForm> test_form_2( FillPasswordFormWithData(kTestCredential)); store->UpdateLogin(*test_form_2); WaitForPasswordStore(); - EXPECT_CALL(consumer, OnGetCompromisedCredentials(testing::IsEmpty())); + EXPECT_CALL(consumer, OnGetInsecureCredentials(testing::IsEmpty())); store->GetAllInsecureCredentials(&consumer); WaitForPasswordStore(); @@ -543,14 +541,14 @@ store->AddInsecureCredential(insecure_credential); WaitForPasswordStore(); - MockCompromisedCredentialsConsumer consumer; + MockInsecureCredentialsConsumer consumer; kTestCredential.password_value = L"password_value_2"; std::unique_ptr<PasswordForm> test_form_2( FillPasswordFormWithData(kTestCredential)); store->AddLogin(*test_form_2); WaitForPasswordStore(); - EXPECT_CALL(consumer, OnGetCompromisedCredentials(testing::IsEmpty())); + EXPECT_CALL(consumer, OnGetInsecureCredentials(testing::IsEmpty())); store->GetAllInsecureCredentials(&consumer); WaitForPasswordStore(); @@ -1563,8 +1561,8 @@ store->AddInsecureCredential(insecure_credential); store->AddInsecureCredential(insecure_credential2); - MockCompromisedCredentialsConsumer consumer; - EXPECT_CALL(consumer, OnGetCompromisedCredentials(UnorderedElementsAre( + MockInsecureCredentialsConsumer consumer; + EXPECT_CALL(consumer, OnGetInsecureCredentials(UnorderedElementsAre( insecure_credential, insecure_credential2))); store->GetAllInsecureCredentials(&consumer); WaitForPasswordStore(); @@ -1573,7 +1571,7 @@ store->RemoveInsecureCredentials(insecure_credential.signon_realm, insecure_credential.username, RemoveInsecureCredentialsReason::kRemove); - EXPECT_CALL(consumer, OnGetCompromisedCredentials( + EXPECT_CALL(consumer, OnGetInsecureCredentials( UnorderedElementsAre(insecure_credential2))); store->GetAllInsecureCredentials(&consumer); WaitForPasswordStore(); @@ -1604,9 +1602,9 @@ for (const auto& credential : {credential1, credential2}) store->AddInsecureCredential(credential); - MockCompromisedCredentialsConsumer consumer; + MockInsecureCredentialsConsumer consumer; EXPECT_CALL(consumer, - OnGetCompromisedCredentials(UnorderedElementsAre(credential1))); + OnGetInsecureCredentials(UnorderedElementsAre(credential1))); store->GetMatchingInsecureCredentials(kTestWebRealm1, &consumer); WaitForPasswordStore(); @@ -1649,8 +1647,8 @@ observed_form, affiliated_android_realms); store->SetAffiliatedMatchHelper(std::move(mock_helper)); - MockCompromisedCredentialsConsumer consumer; - EXPECT_CALL(consumer, OnGetCompromisedCredentials( + MockInsecureCredentialsConsumer consumer; + EXPECT_CALL(consumer, OnGetInsecureCredentials( UnorderedElementsAre(credential1, credential2))); store->GetMatchingInsecureCredentials(kTestWebRealm1, &consumer); WaitForPasswordStore(); @@ -1686,9 +1684,9 @@ // Update the password value and immediately get the insecure passwords. form->password_value = base::ASCIIToUTF16("new_password"); store->UpdateLogin(*form); - MockCompromisedCredentialsConsumer consumer; + MockInsecureCredentialsConsumer consumer; store->GetAllInsecureCredentials(&consumer); - EXPECT_CALL(consumer, OnGetCompromisedCredentials(IsEmpty())); + EXPECT_CALL(consumer, OnGetInsecureCredentials(IsEmpty())); WaitForPasswordStore(); store->ShutdownOnUIThread(); @@ -1721,9 +1719,9 @@ // Delete the password and immediately get the insecure passwords. store->RemoveLogin(*form); - MockCompromisedCredentialsConsumer consumer; + MockInsecureCredentialsConsumer consumer; store->GetAllInsecureCredentials(&consumer); - EXPECT_CALL(consumer, OnGetCompromisedCredentials(IsEmpty())); + EXPECT_CALL(consumer, OnGetInsecureCredentials(IsEmpty())); WaitForPasswordStore(); store->ShutdownOnUIThread(); @@ -1829,8 +1827,8 @@ WaitForPasswordStore(); EXPECT_EQ(add_login_error, AddLoginError::kNone); - MockCompromisedCredentialsConsumer consumer; - EXPECT_CALL(consumer, OnGetCompromisedCredentials(UnorderedElementsAre( + MockInsecureCredentialsConsumer consumer; + EXPECT_CALL(consumer, OnGetInsecureCredentials(UnorderedElementsAre( credentials[0], credentials[1]))); store->GetAllInsecureCredentials(&consumer); WaitForPasswordStore(); @@ -1883,9 +1881,9 @@ *test_form, new_credentials)); WaitForPasswordStore(); - MockCompromisedCredentialsConsumer consumer; + MockInsecureCredentialsConsumer consumer; // Verify the password store has been updated. - EXPECT_CALL(consumer, OnGetCompromisedCredentials(UnorderedElementsAre( + EXPECT_CALL(consumer, OnGetInsecureCredentials(UnorderedElementsAre( new_credentials[0], new_credentials[1]))); store->GetAllInsecureCredentials(&consumer); WaitForPasswordStore();
diff --git a/components/password_manager/core/browser/ui/insecure_credentials_manager.h b/components/password_manager/core/browser/ui/insecure_credentials_manager.h index ffaf1ab..c26401b 100644 --- a/components/password_manager/core/browser/ui/insecure_credentials_manager.h +++ b/components/password_manager/core/browser/ui/insecure_credentials_manager.h
@@ -18,7 +18,6 @@ #include "base/scoped_observation.h" #include "base/timer/elapsed_timer.h" #include "base/types/strong_alias.h" -#include "components/password_manager/core/browser/compromised_credentials_consumer.h" #include "components/password_manager/core/browser/insecure_credentials_table.h" #include "components/password_manager/core/browser/leak_detection/bulk_leak_check.h" #include "components/password_manager/core/browser/password_store.h"
diff --git a/components/password_manager/core/browser/ui/insecure_credentials_reader.cc b/components/password_manager/core/browser/ui/insecure_credentials_reader.cc index 7d898a6..af82733 100644 --- a/components/password_manager/core/browser/ui/insecure_credentials_reader.cc +++ b/components/password_manager/core/browser/ui/insecure_credentials_reader.cc
@@ -36,7 +36,7 @@ } void InsecureCredentialsReader::OnInsecureCredentialsChanged() { - // This class overrides OnCompromisedCredentialsChangedIn() (the version of + // This class overrides OnInsecureCredentialsChangedIn() (the version of // this method that also receives the originating store), so the store-less // version never gets called. NOTREACHED(); @@ -47,15 +47,15 @@ store->GetAllInsecureCredentials(this); } -void InsecureCredentialsReader::OnGetCompromisedCredentials( +void InsecureCredentialsReader::OnGetInsecureCredentials( std::vector<InsecureCredential> insecure_credentials) { - // This class overrides OnGetCompromisedCredentialFrom() (the version of this + // This class overrides OnGetInsecureCredentialFrom() (the version of this // method that also receives the originating store), so the store-less version // never gets called. NOTREACHED(); } -void InsecureCredentialsReader::OnGetCompromisedCredentialsFrom( +void InsecureCredentialsReader::OnGetInsecureCredentialsFrom( PasswordStore* store, std::vector<InsecureCredential> insecure_credentials) { profile_store_responded_ |= store == profile_store_; @@ -73,8 +73,8 @@ base::ranges::move(insecure_credentials, std::back_inserter(insecure_credentials_)); - // Observers are reptitively notified of compromised credentials, and hence - // vbservers can expect partial view of the compromised credentials, so inform + // Observers are reptitively notified of insecure credentials, and hence + // vbservers can expect partial view of the insecure credentials, so inform // the observers directly. for (auto& observer : observers_) observer.OnInsecureCredentialsChanged(insecure_credentials_);
diff --git a/components/password_manager/core/browser/ui/insecure_credentials_reader.h b/components/password_manager/core/browser/ui/insecure_credentials_reader.h index 0e452cfa..5b65962 100644 --- a/components/password_manager/core/browser/ui/insecure_credentials_reader.h +++ b/components/password_manager/core/browser/ui/insecure_credentials_reader.h
@@ -7,7 +7,7 @@ #include "base/observer_list.h" #include "base/scoped_multi_source_observation.h" -#include "components/password_manager/core/browser/compromised_credentials_consumer.h" +#include "components/password_manager/core/browser/insecure_credentials_consumer.h" #include "components/password_manager/core/browser/password_store.h" namespace password_manager { @@ -15,7 +15,7 @@ // insecure credentials in the underlying password stores. class InsecureCredentialsReader : public PasswordStore::DatabaseInsecureCredentialsObserver, - public CompromisedCredentialsConsumer { + public InsecureCredentialsConsumer { public: using GetInsecureCredentialsCallback = base::OnceCallback<void(std::vector<InsecureCredential>)>; @@ -51,12 +51,12 @@ void OnInsecureCredentialsChanged() override; void OnInsecureCredentialsChangedIn(PasswordStore* store) override; - // CompromisedCredentialsConsumer: - void OnGetCompromisedCredentials( - std::vector<CompromisedCredentials> compromised_credentials) override; - void OnGetCompromisedCredentialsFrom( + // InsecureCredentialsConsumer: + void OnGetInsecureCredentials( + std::vector<InsecureCredential> insecure_credentials) override; + void OnGetInsecureCredentialsFrom( PasswordStore* store, - std::vector<CompromisedCredentials> compromised_credentials) override; + std::vector<InsecureCredential> insecure_credentials) override; // The password stores containing the insecure credentials. // |profile_store_| must not be null and must outlive this class.
diff --git a/components/password_manager/core/browser/votes_uploader.cc b/components/password_manager/core/browser/votes_uploader.cc index e08c8f4..ea12af51 100644 --- a/components/password_manager/core/browser/votes_uploader.cc +++ b/components/password_manager/core/browser/votes_uploader.cc
@@ -528,8 +528,6 @@ AutofillUploadContents::Field::PasswordGenerationType type = AutofillUploadContents::Field::NO_GENERATION; if (has_generated_password_) { - UMA_HISTOGRAM_BOOLEAN("PasswordGeneration.IsTriggeredManually", - is_manual_generation_); if (is_manual_generation_) { type = is_possible_change_password_form_ ? AutofillUploadContents::Field::
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 6dbf823..c8405b69 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -448,6 +448,7 @@ Ist die Richtlinie auf "False" gesetzt, können Nutzer keine eigenen Drucker hinzufügen oder konfigurieren. Sie können auch keine zuvor konfigurierten Drucker verwenden. </translation> <translation id="1615221548356595305">Zusammenführen von HTTP/2-Verbindungen für diese Hosts zulassen, auch wenn Clientzertifikate verwendet werden</translation> +<translation id="1616280227447957376">Fortfahren von SSL-Warnseiten für bestimmte Quellen erlauben</translation> <translation id="1617235075406854669">Löschen des Browserverlaufs und des Downloadverlaufs aktivieren</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1626379196197114720">Verwendung des Back-Forward-Cache zulassen</translation> @@ -985,6 +986,7 @@ Die Rechtschreibprüfung kann immer lokal auf ein heruntergeladenes Wörterbuch zugreifen, außer die Funktion wurde über <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> deaktiviert. In diesem Fall hat diese Richtlinie keine Auswirkungen.</translation> <translation id="2433516903565257847">Prozentualer Anteil der Geräte, die nach der angegebenen Anzahl von Tagen aktualisiert werden müssen.</translation> <translation id="2435052056904485763">Zulassungsliste für Kerberos-Bevollmächtigungs-Server</translation> +<translation id="2435232509335686514">Konfigurationsrichtlinie für den Umgang mit heruntergeladenen Dateien durch den <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /></translation> <translation id="2448315169529769573">Wenn die Richtlinie aktiviert ist, meldet <ph name="PRODUCT_OS_NAME" /> Nutzungsdaten und Fehlerberichte, inklusive Absturzberichte, an Google. Ist die Richtlinie deaktiviert, werden Nutzungsdaten und Fehlerberichte nicht gemeldet. Ist sie nicht konfiguriert, werden Nutzungsdaten und Fehlerberichte nur für verwaltete Geräte gemeldet.</translation> @@ -1222,6 +1224,15 @@ <translation id="2757054304033424106">Typen von Erweiterungen bzw. Apps, die installiert werden können</translation> <translation id="2759224876420453487">Nutzerverhalten in Mehrfachprofil-Sitzung steuern</translation> <translation id="2761483219396643566">Inaktivitätsspanne bis zur Warnung im Akkubetrieb</translation> +<translation id="2764165704281937018">Liste der Einstellungen für den <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> – dieser wird ausgelöst, wenn eine Datei heruntergeladen wird. + + Mit den Feldern „<ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_MIME_TYPES_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />“ und „<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" />“ wird festgelegt, ob der Connector eine Datei beim Download von einer Webseite an den Anbieter senden soll. Die URL dieser Webseite muss mit einem Muster übereinstimmen, das einem „enable“-Muster zugeordnet ist, nicht einem „disable“-Muster. Der MIME-Typ der Datei muss ebenfalls mit einem Muster übereinstimmen, das einem „enable“-Muster zugeordnet ist, nicht einem „disable“-Muster. + + Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" />“ wird festgelegt, für welchen Analyseanbieter die Einstellungen gelten. + + Das Feld „<ph name="ENTERPRISE_CONNECTOR_ENTERPRISE_ID_FIELD" />“ identifiziert das Unternehmen beim Anbieter. Für die Anmeldung im Rahmen der Einrichtung des <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> sind nur Nutzerkonten zulässig, die mit dem Unternehmen verknüpft sind. + + Diese Richtlinie kann nur über die <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> konfiguriert werden.</translation> <translation id="2769952903507981510">Erforderlichen Domainnamen für Remotezugriff-Hosts konfigurieren</translation> <translation id="2772955711376920612">Wenn die Richtlinie aktiviert ist und „<ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" />“ sowie „<ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" />“ konfiguriert sind, ist das Umschalten bei Leistungsspitzen immer aktiviert, sofern die Funktion vom Gerät unterstützt wird. Die Energieverwaltung zum Umschalten bei Leistungsspitzen ist eine Richtlinie zum Energiesparen, mit der die Nutzung des Netzstroms bei Spitzenlasten minimiert wird. Für jeden Wochentag kann ein Beginn und ein Ende für den Modus zum Umschalten bei Leistungsspitzen festgelegt werden. Solange der Ladezustand des Akkus den angegebenen Schwellenwert nicht unterschreitet, wird das Gerät während dieser Zeiträume über den Akku mit Strom versorgt – auch dann, wenn das System an das Stromnetz angeschlossen ist. Nach dem angegebenen Ende wird das Gerät wieder über das Netz mit Strom versorgt (vorausgesetzt, es ist an das Stromnetz angeschlossen), der Akku jedoch nicht geladen. Das Gerät wird wieder auf den normalen Betrieb mit Netzstrom umgestellt und der Akku aufgeladen, nachdem die festgelegte Startzeit zum Laden erreicht wurde. @@ -1304,6 +1315,23 @@ Ist die Richtlinie deaktiviert oder nicht konfiguriert, melden registrierte Geräte keine Android-Statusinformationen.</translation> <translation id="288923520817177650">Erstellen von <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />-Sitzungen mit <ph name="WEBXR_API_NAME_SHORT" /> zulassen</translation> <translation id="2890645751406497668">Websites automatisch die Berechtigung erteilen, eine Verbindung zu USB-Geräten mit der angegebenen Anbieter-ID und Produkt-ID herzustellen.</translation> +<translation id="2892041629748346178">Liste der Einstellungen für Chrome Enterprise Connectors-Services für den Enterprise-Connector „<ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" />“ – dieser wird ausgelöst, wenn eine Datei in Chrome heruntergeladen wird. + + Mit den Feldern „<ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />“ und „<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" />“ wird festgelegt, ob der Connector eine Datei zur Analyse senden soll, wenn sie von einer bestimmten Seite heruntergeladen wird, und welche Tags für die Analyseanfrage verwendet werden sollen. Ein Tag, das einem „enable“-Muster entspricht, wird der Anfrage hinzugefügt, wenn die Seiten-URL mit einem für das jeweilige Tag passenden Muster übereinstimmt – jedoch nur, wenn kein „disable“-Muster mit demselben Tag mit der Seiten-URL übereinstimmt. Die Analyse wird durchgeführt, wenn die Anfrage mindestens ein Tag enthält. + + Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" />“ wird festgelegt, für welchen Analyseanbieter die Einstellungen gelten. + + Wenn das Feld „<ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" />“ auf 1 gesetzt ist, wartet Chrome auf eine Antwort des Analyseanbieters, bevor dem Nutzer Zugriff auf die heruntergeladene Datei gewährt wird. Wenn es auf einen anderen Ganzzahlwert gesetzt ist, gewährt Chrome dem Nutzer sofort Zugriff auf die Datei. + + Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" />“ wird festgelegt, ob Chrome den Zugriff auf Dateien blockiert, die durch ein Passwort geschützt sind. + + Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" />“ wird festgelegt, ob Chrome den Zugriff auf Dateien blockiert, die zu groß für die Analyse sind (50 MB oder größer). + + Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" />“ wird festgelegt, für welche Tags der Connector vom Nutzer eine Begründung anfordert, um einen Scan zu umgehen, für den es eine umgehbare Warnung gibt. Wenn das Feld nicht festgelegt ist, wird angenommen, dass keine Begründung erforderlich ist. + + Mit den Feldern „<ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" />“ und „<ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" />“ wird festgelegt, welche Meldung der Nutzer sieht, wenn eine Warnung angezeigt wird, nachdem beim Scan ein potenzielles Problem gefunden wurde. Das Nachrichtenfeld enthält den Text, den der Nutzer sieht (maximal 200 Zeichen). Das Feld „learn_more_url“ enthält eine vom Administrator festgelegte URL, die der Nutzer anklicken kann, um weitere benutzerdefinierte Informationen darüber zu erhalten, warum die Aktion blockiert wurde. Das Feld für die Sprache ist optional und enthält die Sprache der Meldung. Wenn das Feld leer oder auf „default“ festgelegt ist, wird die entsprechende Nachricht angezeigt, wenn es für die Sprache des Nutzers keine eigene Meldung gibt. Das Tag-Feld gibt an, für welche Arten von Scans die Meldung angezeigt wird. Die Liste „custom_messages“ kann keine oder mehrere Einträge haben – das Nachrichten- und das Tag-Feld der einzelnen Einträge dürfen dabei nicht leer sein. + + Diese Richtlinie kann nur über die <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> konfiguriert werden.</translation> <translation id="2893546967669465276">Systemprotokolle an den Verwaltungsserver senden</translation> <translation id="2899002520262095963">Android-Apps können die über diese Richtlinie festgelegten Netzwerkkonfigurationen und CA-Zertifikate verwenden, haben jedoch keinen Zugriff auf bestimmte Konfigurationsoptionen.</translation> <translation id="2899213072616346687">Schränkt den Druckmodus mit Hintergrundgrafiken ein. Wenn die Richtlinie nicht konfiguriert ist, gelten keine Einschränkungen.</translation> @@ -1709,6 +1737,21 @@ <translation id="3412937883532015092">Wenn für die Richtlinie eine Zahl festgelegt ist, zeigt <ph name="PRODUCT_NAME" /> für genau diese Anzahl von Millisekunden eine Nachricht an und öffnet dann den alternativen Browser. Ist die Richtlinie nicht konfiguriert oder auf 0 gesetzt, wird eine bestimmte aufgerufene URL sofort in einem alternativen Browser geöffnet.</translation> +<translation id="3413215487296688603">Liste der Einstellungen für Chrome Enterprise Connectors-Services für den Enterprise Connector „<ph name="ON_BULK_DATA_ENTRY_ENTERPRISE_CONNECTOR" />“. Dieser wird ausgelöst, wenn Daten aus der Zwischenablage oder durch Drag-and-drop von Webinhalten in Chrome eingegeben werden. + + Mit den Feldern „<ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />“ und „<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" />“ wird festgelegt, ob der Connector Daten zur Analyse senden soll, wenn sie auf einer bestimmten Seite eingegeben werden, und welche Tags für die Analyseanfrage verwendet werden sollen. Ein Tag, das einem „enable“-Muster entspricht, wird der Anfrage hinzugefügt, wenn die Seiten-URL mit einem für das jeweilige Tag passenden Muster übereinstimmt – jedoch nur, wenn kein „disable“-Muster mit demselben Tag mit der Seiten-URL übereinstimmt. Die Analyse wird durchgeführt, wenn die Anfrage mindestens ein Tag enthält. + + Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" />“ wird festgelegt, für welchen Analyseanbieter die Einstellungen gelten. + + Wenn das Feld „<ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" />“ auf 1 gesetzt ist, wartet Chrome auf eine Antwort des Analyseanbieters, bevor der Seite Zugriff auf die Daten gewährt wird. Wenn es auf einen anderen Ganzzahlwert gesetzt ist, gewährt Chrome der Seite sofort Zugriff auf die Daten. + + Das Feld „<ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" />“ gibt die für eine Prüfung erforderliche Mindestgröße (in Byte) für in Chrome eingegebene Daten an. Wenn der Wert nicht festgelegt ist, gilt der Standardwert von 100 Byte. + + Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" />“ wird festgelegt, für welche Tags der Connector vom Nutzer eine Begründung anfordert, um einen Scan zu umgehen, für den es eine umgehbare Warnung gibt. Wenn das Feld nicht festgelegt ist, wird angenommen, dass keine Begründung erforderlich ist. + + Mit den Feldern „<ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" />“ und „<ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" />“ wird festgelegt, welche Meldung der Nutzer sieht, wenn eine Warnung angezeigt wird, nachdem beim Scan ein potenzielles Problem gefunden wurde. Das Nachrichtenfeld enthält den Text, den der Nutzer sieht (maximal 200 Zeichen). Das Feld „learn_more_url“ enthält eine vom Administrator festgelegte URL, die der Nutzer anklicken kann, um weitere benutzerdefinierte Informationen darüber zu erhalten, warum die Aktion blockiert wurde. Das Feld für die Sprache ist optional und enthält die Sprache der Meldung. Wenn das Feld leer oder auf „default“ festgelegt ist, wird die entsprechende Nachricht angezeigt, wenn es für die Sprache des Nutzers keine eigene Meldung gibt. Das Tag-Feld gibt an, für welche Arten von Scans die Meldung angezeigt wird. Die Liste „custom_messages“ kann keine oder mehrere Einträge haben – das Nachrichten- und das Tag-Feld der einzelnen Einträge dürfen dabei nicht leer sein. + + Diese Richtlinie kann nur über die <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> konfiguriert werden.</translation> <translation id="3415954062311826850">Diese Richtlinie wird in ARC nicht unterstützt.</translation> <translation id="34160070798637152">Legt die Netzwerkkonfiguration für das gesamte Gerät fest.</translation> <translation id="3417130629744653218">Websites erlauben, verfügbare Zahlungsmethoden abzufragen.</translation> @@ -2332,6 +2375,11 @@ <translation id="4377599627073874279">Anzeige aller Bilder auf allen Websites zulassen</translation> <translation id="437791893267799639">Richtlinie nicht konfiguriert, Datenmigration und ARC nicht zulassen</translation> <translation id="4382413175336720282">Die URL-Echtzeitüberprüfung ist deaktiviert.</translation> +<translation id="4387741272680827493">Wenn die Richtlinie konfiguriert ist, wird eine Liste mit Hostnamen angegeben, die vorab geladene HSTS-Upgrades von http auf https umgehen. + + Für diese Richtlinie sind nur Single-Label-Hostnamen zulässig und sie gilt nur für „statische“ HSTS-Preloaded-Eingaben (beispielsweise <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />). Diese Richtlinie verhindert keine HSTS-Upgrades für Server, die diese „dynamisch“ mit einem <ph name="HSTS_HEADER_NAME" />-Antwortheader anfragen. + + Bereitgestellte Hostnamen müssen kanonisiert werden: Alle IDNs müssen in ihr A-Label-Format konvertiert und alle ASCII-Buchstaben kleingeschrieben werden. Diese Richtlinie gilt nur für die angegebenen Single-Label-Hostnamen, aber nicht für Subdomains der angegebenen Namen.</translation> <translation id="4387922553629365459">Wenn diese Richtlinie konfiguriert ist, können Sie eine Liste mit URL-Mustern erstellen, die angeben, welche Websites keine Pop-ups öffnen dürfen. Wenn die Richtlinie nicht konfiguriert ist, gilt <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> für alle Websites, sofern konfiguriert. Falls nicht, wird die persönliche Einstellung des Nutzers verwendet. @@ -2948,6 +2996,11 @@ * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> – die Felder „<ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" />“ und „<ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />“ werden verwendet. Hinweis: Ausführliche Beispiele finden Sie in den Chromium-Projekten unter https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett.</translation> +<translation id="5266173014392157048">Diese Richtlinie wurde eingestellt. Bitte verwenden Sie stattdessen <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />. + + Wenn diese Richtlinie konfiguriert ist, werden Server zugewiesen, an die <ph name="PRODUCT_NAME" /> Anmeldedaten von Nutzern weiterleiten kann. Trennen Sie mehrere Servernamen durch Kommas. Platzhalter wie <ph name="WILDCARD_VALUE" /> sind zulässig. + + Wenn die Richtlinie nicht konfiguriert ist, leitet <ph name="PRODUCT_NAME" /> keine Anmeldedaten von Nutzern weiter, auch nicht an Server innerhalb eines Intranets.</translation> <translation id="5273744932022326215">Hiermit wird die Bedienungshilfe "Mauszeiger hervorheben" auf dem Anmeldebildschirm aktiviert. Wird diese Richtlinie auf "true" gesetzt, ist die Bedienungshilfe "Mauszeiger hervorheben" auf dem Anmeldebildschirm immer aktiviert. @@ -3478,6 +3531,11 @@ Ist die Richtlinie deaktiviert, können solche Nutzer diese Angebote nicht einlösen.</translation> <translation id="6048199181629830227">Energieverwaltung zum Umschalten bei Leistungsspitzen aktivieren</translation> <translation id="6053681087509103368">Zulassen, dass WebRTC veraltete Versionen des TLS/DTLS-Protokolls verwendet</translation> +<translation id="605543517695935623">Liste der Einstellungen für Chrome Enterprise Connectors-Dienste für den Enterprise Connector „<ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" />“. Dieser wird ausgelöst, wenn in Chrome ein Sicherheitshinweis auftritt. Hierzu gehören negative Analyseergebnisse von Enterprise Connectors, die Wiederverwendung eines Passworts, das Aufrufen unsicherer Seiten und andere sicherheitsrelevante Nutzeraktionen. + + Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" />“ wird festgelegt, für welchen Berichterstellungsanbieter die Einstellungen gelten, und mit „<ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" />“, welche Ereignisse für diesen Anbieter aktiviert sind. + + Diese Richtlinie kann nur über die <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> konfiguriert werden.</translation> <translation id="6058879286588763839">Es sei denn, „<ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" />“ ist festgelegt, wodurch „<ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />“ überschrieben wird, dann wird durch das Konfigurieren von „<ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />“ die Energieverwaltungsrichtlinie für den Akkulademodus festgelegt, sofern die Funktion vom Gerät unterstützt wird. Mit dieser Richtlinie können Sie das Aufladen des Akkus dynamisch steuern. So lässt sich der durch unnötige Belastung entstehende Akkuverschleiß verringern und die Lebensdauer des Akkus verlängern. Wenn die Richtlinie nicht konfiguriert ist (sofern die Funktion vom Gerät unterstützt wird), wird der Standardakkulademodus verwendet und Nutzer können sie nicht ändern. @@ -4362,6 +4420,23 @@ Wenn diese Richtlinie nicht festgelegt ist oder absichtlich leer gelassen wird, kann der Nutzer in <ph name="PRODUCT_NAME" /> jedes Google-Konto als primäres Browserkonto festlegen.</translation> <translation id="723103540848640830">Minimale Länge der Sperrbildschirm-PIN festlegen</translation> <translation id="7234280155140786597">Namen der unzulässigen Hosts für natives Messaging (oder "*" für alle)</translation> +<translation id="72369543045636739">Liste der Einstellungen für Chrome Enterprise Connectors-Services für den Enterprise Connector „<ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" />“. Dieser wird ausgelöst, wenn eine Datei an Chrome angehängt wird. + + Mit den Feldern „<ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />“ und „<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" />“ wird festgelegt, ob der Connector eine Datei zur Analyse senden soll, wenn sie an eine bestimmte Seite angehängt wird, und welche Tags für die Analyseanfrage verwendet werden sollen. Ein Tag, das einem „enable“-Muster entspricht, wird der Anfrage hinzugefügt, wenn die Seiten-URL mit einem für das jeweilige Tag passenden Muster übereinstimmt – jedoch nur, wenn kein „disable“-Muster mit demselben Tag mit der Seiten-URL übereinstimmt. Die Analyse wird durchgeführt, wenn die Anfrage mindestens ein Tag enthält. + + Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" />“ wird festgelegt, für welchen Analyseanbieter die Einstellungen gelten. + + Wenn das Feld „<ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" />“ auf 1 gesetzt ist, wartet Chrome auf eine Antwort des Analyseanbieters, bevor der Seite Zugriff auf die Datei gewährt wird. Wenn es auf einen anderen Ganzzahlwert gesetzt ist, gewährt Chrome der Seite sofort Zugriff auf die Datei. + + Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" />“ wird festgelegt, ob Chrome den Zugriff auf Dateien blockiert, die durch ein Passwort geschützt sind. + + Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" />“ wird festgelegt, ob Chrome den Zugriff auf Dateien blockiert, die zu groß für die Analyse sind (50 MB oder größer). + + Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" />“ wird festgelegt, für welche Tags der Connector vom Nutzer eine Begründung anfordert, um einen Scan zu umgehen, für den es eine umgehbare Warnung gibt. Wenn das Feld nicht festgelegt ist, wird angenommen, dass keine Begründung erforderlich ist. + + Mit den Feldern „<ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" />“ und „<ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" />“ wird festgelegt, welche Meldung der Nutzer sieht, wenn eine Warnung angezeigt wird, nachdem beim Scan ein potenzielles Problem gefunden wurde. Das Nachrichtenfeld enthält den Text, den der Nutzer sieht (maximal 200 Zeichen). Das Feld „learn_more_url“ enthält eine vom Administrator festgelegte URL, die der Nutzer anklicken kann, um weitere benutzerdefinierte Informationen darüber zu erhalten, warum die Aktion blockiert wurde. Das Feld für die Sprache ist optional und enthält die Sprache der Meldung. Wenn das Feld leer oder auf „default“ festgelegt ist, wird die entsprechende Nachricht angezeigt, wenn es für die Sprache des Nutzers keine eigene Meldung gibt. Das Tag-Feld gibt an, für welche Arten von Scans die Meldung angezeigt wird. Die Liste „custom_messages“ kann keine oder mehrere Einträge haben – das Nachrichten- und das Tag-Feld der einzelnen Einträge dürfen dabei nicht leer sein. + + Diese Richtlinie kann nur über die <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> konfiguriert werden.</translation> <translation id="7246767840750730334">Aktivieren von Phone Hub-Benachrichtigungen zulassen.</translation> <translation id="7249828445670652637"><ph name="PRODUCT_OS_NAME" />-CA-Zertifikate für ARC-Apps aktivieren</translation> <translation id="7252681704926980614">Damit werden Nutzer- und Dateiname bei jedem Druckauftrag an den nativen Druckserver gesendet. Standardmäßig werden die Namen nicht gesendet. @@ -4730,6 +4805,13 @@ <translation id="780629758750905699">Hinzufügen von Family Link-Konten auf diesem Gerät erlauben</translation> <translation id="7807139251387225825">Liste von Typen, die von der Synchronisierung ausgeschlossen werden sollen</translation> <translation id="781268256210530471">Plug-in-Einstellungen</translation> +<translation id="7814528532170362496">Diese Richtlinie steuert die Überprüfung von URLs in Echtzeit, um unsichere URLs zu erkennen. + + Wenn sie deaktiviert oder nicht konfiguriert ist, wird die standardmäßige Safe Browsing-Überprüfung verwendet. Dabei werden abhängig von der Einstellung „Suchanfragen und das Surfen verbessern“ und vom Wert der Richtlinie „UrlKeyedAnonymizedDataCollectionEnabled“ unter Umständen weiterhin Echtzeitsuchen durchgeführt. + + Wenn diese Richtlinie aktiviert ist, werden URLs zur Echtzeitüberprüfung gemäß den Chrome Enterprise-Nutzungsbedingungen versandt. Chrome sendet dann URLs zur Echtzeitüberprüfung an Google Cloud oder Drittanbieter Ihrer Wahl. Die standardmäßige Version der Safe Browsing-Echtzeitüberprüfung wird deaktiviert. + +Diese Richtlinie kann nur über die <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> konfiguriert werden.</translation> <translation id="7816326058023670173">Secret, das zwischen Geräten von Kindern und Eltern geteilt wird.</translation> <translation id="7818131573217430250">Standardstatus für den Modus mit hohem Kontrast auf der Anmeldeseite festlegen</translation> <translation id="7823902813460802031">Wenn die Richtlinie aktiviert ist, lässt <ph name="PRODUCT_OS_NAME" /> nicht zu, dass das Gerät in den Entwicklermodus wechselt. @@ -5551,6 +5633,13 @@ Wenn die Richtlinie auf "False" gesetzt ist, wird die automatische Aktualisierung für Audio- und Videoinhalte deaktiviert. Außerdem werden für Bilder keine Warnhinweise angezeigt. Diese Richtlinie wirkt sich nur auf Audio-, Video- und Bildinhalte aus, nicht auf andere Arten gemischter Inhalte. Ab <ph name="PRODUCT_NAME" /> 84 wird sie nicht mehr angewendet.</translation> +<translation id="9009505213521705952">Wenn <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> deaktiviert ist, können Sie durch Konfigurieren dieser Richtlinie eine Liste mit Quellmustern festlegen, die Websites angeben, auf denen Nutzer Warnseiten schließen können. Diese Warnseiten werden in <ph name="PRODUCT_NAME" /> angezeigt, wenn Nutzer Seiten mit SSL-Fehlern besuchen. Für Quellen mit SSL-Fehlern, die nicht auf dieser Liste stehen, können Nutzer keine Warnseiten schließen. + + Wenn <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> aktiviert oder nicht konfiguriert ist, hat diese Richtlinie keine Auswirkung. + + Wenn die Richtlinie nicht konfiguriert ist, gilt <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> für alle Websites. + + Genaue Informationen zu gültigen Eingabemustern finden Sie unter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> ist kein akzeptierter Wert für diese Richtlinie. Diese Richtlinie gleicht nur anhand der Quelle ab, daher werden alle Pfade des URL-Musters ignoriert.</translation> <translation id="9010080992450148617">Teilnehmern des erweiterten Sicherheitsprogramms das Senden von Downloads für einen Tiefenscan an Google erlauben</translation> <translation id="9013875414788074110">Bei der Anmeldung kann <ph name="PRODUCT_OS_NAME" /> die Authentifizierung über einen Server (online) oder über ein Passwort im Cache (offline) ausführen.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 48061e8..0626ed759 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -454,6 +454,7 @@ Si estableces la política como falsa, los usuarios no podrán agregar ni configurar sus propias impresoras. Tampoco podrán imprimir documentos con las impresoras configuradas previamente. </translation> <translation id="1615221548356595305">Permitir la integración de conexiones HTTP/2 para estos hosts incluso cuando se usan certificados de cliente</translation> +<translation id="1616280227447957376">Permite continuar desde la página de advertencia de SSL en orígenes específicos</translation> <translation id="1617235075406854669">Habilita la eliminación del historial de descargas y del navegador.</translation> <translation id="1620510694547887537">Cámara</translation> <translation id="1626379196197114720">Permite que se utilice la memoria caché atrás/adelante</translation> @@ -823,6 +824,7 @@ <translation id="2170233653554726857">Habilitar optimización de WPAD</translation> <translation id="2171952274731262470">Retrasos y acciones que se deben tomar cuando el dispositivo esté inactivo y funcionando con batería.</translation> <translation id="2175353308236295184">Objeto de configuración JSON específico de la app con un conjunto de pares clave-valor, p. ej., '"managedConfiguration": { "key1": value1, "key2": value2 }'. Las claves se definen en el manifiesto de la app.</translation> +<translation id="2176115444876446233">Impide que los usuarios registren el rendimiento de todo el sistema</translation> <translation id="2178899310296064282">Aplicar al menos el modo restringido moderado en YouTube</translation> <translation id="2182291258410176649">El usuario decide si habilita la copia de seguridad y el restablecimiento</translation> <translation id="219297066914002620">Indica a <ph name="PRODUCT_OS_NAME" /> que habilite o inhabilite las herramientas de la consola de administración de máquinas virtuales. @@ -1003,6 +1005,7 @@ El corrector ortográfico podrá usar un diccionario descargado de manera local a menos que <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> inhabilite esa función. En ese caso, esta política no tendrá efecto.</translation> <translation id="2433516903565257847">El porcentaje del grupo de dispositivos que se debe actualizar luego de la cantidad de días determinada.</translation> <translation id="2435052056904485763">Lista de servidores de delegación de Kerberos permitidos</translation> +<translation id="2435232509335686514">Política de configuración del modo en que <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> maneja los archivos descargados</translation> <translation id="2448315169529769573">Si habilitas la política, <ph name="PRODUCT_OS_NAME" /> informará a Google sobre las métricas de uso y los datos de diagnóstico, incluidos los informes de fallas. Si inhabilitas la política, se desactivarán los informes sobre datos de diagnóstico y métricas. Si no la estableces, se desactivarán los informes sobre datos de diagnóstico y métricas en dispositivos no administrados y se activarán en dispositivos administrados.</translation> @@ -1240,9 +1243,19 @@ Si inhabilitas la política, <ph name="PRODUCT_NAME" /> solo podrá usar estos hosts cuando estén instalados a nivel del sistema.</translation> <translation id="2753637905605932878">Restringir el intervalo de puertos UDP locales que usa WebRTC</translation> +<translation id="2755847332939882873">Permite registrar el rendimiento de todo el sistema</translation> <translation id="2757054304033424106">Tipos de extensiones o aplicaciones que se pueden instalar</translation> <translation id="2759224876420453487">Controlar el comportamiento del usuario en una sesión de varios perfiles</translation> <translation id="2761483219396643566">Demora para la advertencia de inactividad cuando el dispositivo está funcionando a batería</translation> +<translation id="2764165704281937018">Lista de configuraciones que se aplicarán a <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />, el cual se activa cuando se descarga un archivo. + + Los campos <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MIME_TYPES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> y <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> se usan para determinar si el conector debe enviar un archivo al proveedor de servicios cuando se descarga desde una página web. La URL de la página web debe coincidir con un patrón asociado a un patrón "enable" y no asociado a un patrón "disable". El tipo de MIME del archivo también debe coincidir con un patrón asociado a un patrón "enable" y no asociado a un patrón "disable". + + El campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> especifica el proveedor de servicios de análisis al que corresponde la configuración. + + El campo <ph name="ENTERPRISE_CONNECTOR_ENTERPRISE_ID_FIELD" /> identifica la empresa ante el proveedor de servicios. Cuando se solicita al usuario que acceda como parte del proceso de configuración de <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />, solo se permiten cuentas de usuario asociadas a esta empresa. + + Esta política solo se puede establecer en <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="2769952903507981510">Configura el nombre de dominio requerido para los hosts de acceso remoto.</translation> <translation id="2772955711376920612">Si habilitas la política y estableces <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> y <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" />, se mantendrá activada la carga fuera del horario pico (cuando lo admita el dispositivo). La política para la administración de carga fuera del horario pico es una política destinada a ahorrar energía que minimiza el uso de corriente alterna en horas pico. Puedes establecer una hora de inicio y finalización para ejecutar el modo de carga fuera del horario pico en cada día de la semana. Mientras la batería esté por encima del umbral especificado, el dispositivo funcionará con la batería en los horarios establecidos (incluso si está conectado a la corriente alterna). Después de la hora de finalización especificada, el dispositivo funcionará con corriente alterna (en caso de estar conectado), pero no cargará la batería. El dispositivo volverá a funcionar con normalidad usando corriente alterna y cargará la batería después de la hora de inicio de carga especificada. @@ -1325,6 +1338,23 @@ Si inhabilitas la política o no la estableces, los dispositivos inscritos no informarán sobre el estado de Android.</translation> <translation id="288923520817177650">Permite crear sesiones <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> de <ph name="WEBXR_API_NAME_SHORT" /></translation> <translation id="2890645751406497668">Otorgar permiso automáticamente a estos sitios para conectarse a dispositivos USB con los ID de producto y proveedor correspondientes</translation> +<translation id="2892041629748346178">Lista de configuraciones para los servicios de Chrome Enterprise Connectors que se aplicarán al Enterprise Connector <ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" />, el cual se activa cuando se descarga un archivo en Chrome. + + Los campos <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> y <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> se usan para determinar si el conector debe enviar un archivo para que se analice cuando se descarga de una página específica, y qué etiquetas deben incluirse en la solicitud de análisis del archivo. La solicitud de análisis incluirá la etiqueta correspondiente a un patrón "enable" si la URL de la página coincide con un patrón asociado a esa etiqueta, siempre y cuando la URL no coincida con un patrón "disable" con la misma etiqueta. Si la solicitud incluye al menos 1 etiqueta, se realizará el análisis. + + El campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> especifica el proveedor de servicios de análisis al que corresponde la configuración. + + Si se establece el valor "1" en el campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" />, Chrome esperará a recibir una respuesta del servicio de análisis para permitir que el usuario acceda al archivo descargado. Si se indica cualquier otro valor entero, Chrome permitirá que el usuario acceda al archivo de inmediato. + + El campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> controla si Chrome bloquea o permite el acceso a archivos protegidos con contraseña. + + El campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> controla si Chrome bloquea o permite el acceso a archivos demasiado grandes para ser analizados (más de 50 MB). + + El campo <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> se utiliza para determinar en qué etiquetas el conector requerirá que el usuario ingrese una justificación para evitar un análisis que derive en una advertencia evitable. Si no estableces el campo, se asumirá que no se requiere una justificación. + + Los campos <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> y <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> se utilizan para configurar el mensaje que verá el usuario cuando se muestre una advertencia después de que un análisis determine una infracción de política. El campo del mensaje incluye el texto que se le mostrará al usuario. Este puede tener un máximo de 200 caracteres. El administrador puede incluir una URL en el campo learn_more_url a fin de que el usuario obtenga con un clic más información del cliente sobre los motivos para bloquear la acción. El campo del idioma es opcional. Indica el idioma del mensaje. Si el campo de idioma se deja vacío o con el valor "default", se indica que se deberá utilizar un mensaje determinado cuando no haya ningún mensaje en el idioma del usuario. El campo de la etiqueta especifica para qué tipo de análisis se mostrará el mensaje. La lista custom_messages puede tener cero o más entradas, y cada una deberá tener completos los campos del mensaje y de la etiqueta. + + Esta política solo se puede establecer en <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="2893546967669465276">Enviar registros del sistema al servidor de administración</translation> <translation id="2899002520262095963">A través de esta política, las apps de Android pueden usar la configuración de red y los Certificados de CA, pero no tienen acceso a algunas opciones de configuración.</translation> <translation id="2899213072616346687">Restringe el modo de impresión de los gráficos de fondo. Si no se configura la política, no se aplicará ninguna restricción.</translation> @@ -1350,6 +1380,12 @@ Si no configuras esta política, no se establecerán restricciones respecto de qué usuarios pueden acceder. Ten en cuenta que, para crear nuevos usuarios, sigue siendo necesario configurar la política <ph name="DEVICE_ALLOW_NEW_USERS_POLICY_NAME" /> de manera adecuada. Si habilitas <ph name="DEVICE_FAMILY_LINK_ACCOUNTS_ALLOWED_POLICY_NAME" />, los usuarios de Family Link también podrán acceder a las cuentas definidas en esta política.</translation> +<translation id="2920795918401557243">Esta configuración permite registrar el rendimiento de todo el sistema mediante el servicio de registro del sistema. + + Si inhabilitas esta política, el usuario no podrá hacer un registro de todo el sistema mediante el servicio de registro del sistema. + Si la habilitas, el usuario podrá hacer un registro de todo el sistema mediante el servicio de registro del sistema. + Si no la estableces, se inhabilitará esta política para los dispositivos administrados y se habilitará para los dispositivos que pertenezcan a los usuarios. + Ten en cuenta que, si inhabilitas esta política, solo se inhabilitará el registro del sistema, pero no afectará el registro del navegador.</translation> <translation id="2921222258441684334">Si estableces la política en 1, los sitios podrán hacer un seguimiento de la ubicación física de los usuarios de forma predeterminada. Si la estableces en 2, se rechazará el seguimiento de forma predeterminada. Puedes establecer que la política solicite permiso cada vez que un sitio quiera hacer un seguimiento de la ubicación física de los usuarios. Si no la estableces, se aplicará la política <ph name="ASK_GEOLOCATION_POLICY_NAME" />, pero los usuarios podrán cambiar esta configuración.</translation> @@ -1731,6 +1767,21 @@ <translation id="3412937883532015092">Si asignas un número a la política, <ph name="PRODUCT_NAME" /> mostrará un mensaje durante esa cantidad de milisegundos y, luego, abrirá un navegador alternativo. Si no estableces la política o la estableces con el valor "0", la navegación a una URL desginada la abrirá de inmediato en un navegador alternativo.</translation> +<translation id="3413215487296688603">Lista de configuraciones para los servicios de Chrome Enterprise Connectors que se aplicarán al Enterprise Connector <ph name="ON_BULK_DATA_ENTRY_ENTERPRISE_CONNECTOR" />, el cual se activa cuando se ingresan datos a Chrome desde el portapapeles o se arrastra y se suelta contenido web. + + Los campos <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> y <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> se usan para determinar si el conector debe enviar datos para que se analicen cuando se ingresan en una página específica y qué etiquetas deben incluirse en la solicitud de análisis de los datos. La solicitud de análisis incluirá la etiqueta correspondiente a un patrón "enable" si la URL de la página coincide con un patrón asociado a esa etiqueta, siempre y cuando la URL no coincida con un patrón "disable" con la misma etiqueta. Si la solicitud incluye al menos 1 etiqueta, se realizará el análisis. + + El campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> especifica el proveedor de servicios de análisis al que corresponde la configuración. + + Si estableces el valor "1" en el campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" />, Chrome esperará a recibir una respuesta del servicio de análisis para permitir que la página acceda a los datos. Si indicas cualquier otro valor entero, Chrome permitirá que la página acceda a los datos de inmediato. + + El campo <ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" /> indica el tamaño mínimo (expresado en bytes) que deben tener los datos que se ingresan en Chrome para que se puedan escanear. Si no estableces el campo, el valor predeterminado es de 100 bytes. + + El campo <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> se utiliza para determinar en qué etiquetas el conector requerirá que el usuario ingrese una justificación para evitar un análisis que derive en una advertencia evitable. Si no estableces el campo, se asumirá que no se requiere una justificación. + + Los campos <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> y <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> se utilizan para configurar el mensaje que verá el usuario cuando se muestre una advertencia después de que un análisis determine una infracción de política. El campo del mensaje incluye el texto que se le mostrará al usuario. Este puede tener un máximo de 200 caracteres. El administrador puede incluir una URL en el campo learn_more_url a fin de que el usuario obtenga con un clic más información del cliente sobre los motivos para bloquear la acción. El campo del idioma es opcional. Indica el idioma del mensaje. Si el campo de idioma se deja vacío o con el valor "default", se indica que se deberá utilizar un mensaje determinado cuando no haya ningún mensaje en el idioma del usuario. El campo de la etiqueta especifica para qué tipo de análisis se mostrará el mensaje. La lista custom_messages puede tener cero o más entradas, y cada una deberá tener completos los campos del mensaje y de la etiqueta. + + Esta política solo se puede establecer en <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="3415954062311826850">No se admite esta política en ARC.</translation> <translation id="34160070798637152">Controla la configuración de red en todo el dispositivo.</translation> <translation id="3417130629744653218">Permite que los sitios web consulten las formas de pago disponibles.</translation> @@ -2125,6 +2176,7 @@ Esta configuración también desactivará las combinaciones de teclas y las entradas del menú contextual o de cualquier menú que permiten abrir las herramientas para desarrolladores o la Consola de JavaScript.</translation> <translation id="3950110092991281616">Permite la autenticación ambiental solo en sesiones comunes.</translation> <translation id="3950239119790560549">Actualizar las restricciones de tiempo</translation> +<translation id="3956573780915784996">Permite que los usuarios hagan un registro del rendimiento de todo el sistema</translation> <translation id="3956686688560604829">Usar la política SiteList de Internet Explorer para la extensión Compatibilidad con navegadores heredados</translation> <translation id="3958586912393694012">Permitir el uso de Smart Lock</translation> <translation id="3962445567482559878">Usa el modo EDU de la experiencia de integración del Asistente</translation> @@ -2351,6 +2403,11 @@ <translation id="4377599627073874279">Permitir a todos los sitios que muestren todas las imágenes</translation> <translation id="437791893267799639">No se estableció la política; no permitir la migración de datos y ARC</translation> <translation id="4382413175336720282">Inhabilita la verificación de URL en tiempo real</translation> +<translation id="4387741272680827493">Si estableces la política, se especifica una lista de nombres de host que evitan las actualizaciones de HSTS precargadas de http a https. + + Esta política únicamente admite nombres de host con una sola etiqueta y se aplica a las entradas de HSTS precargadas "estáticas" (por ejemplo, <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />). Esta política no evita las actualizaciones de HSTS para los servidores que hayan solicitado actualizaciones de HSTS "de manera dinámica" con un encabezado de respuesta <ph name="HSTS_HEADER_NAME" />. + + Los nombres de host deben estar canonicalizados: debe convertirse cualquier IDN a su formato de etiqueta A y todas las letras en formato ASCII deben estar en minúscula. Esta política solo se aplica a los nombres de host especificados con una sola etiqueta. No se aplica a los subdominios de esos nombres.</translation> <translation id="4387922553629365459">Si estableces la política, podrás especificar una lista de patrones de URL que indiquen los sitios que no pueden abrir ventanas emergentes. Si no estableces la política, se aplicará <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> para todos los sitios, en caso de haberse establecido. De lo contrario se aplicará la configuración personal del usuario. @@ -2967,6 +3024,11 @@ * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />: se usarán los campos <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" /> y <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. Nota: Para obtener más ejemplos detallados, visita The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation> +<translation id="5266173014392157048">Esta política dejó de estar disponible. Usa la política "<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />" en su lugar. + + Si estableces la política, se asignarán los servidores a los que <ph name="PRODUCT_NAME" /> puede delegar las credenciales de usuario. Los nombres de los servidores se separan con comas. Se permite el uso de caracteres comodín (<ph name="WILDCARD_VALUE" />). + + Si no estableces la política, <ph name="PRODUCT_NAME" /> no delegará credenciales de usuario, incluso aunque se detecte un servidor como intranet.</translation> <translation id="5273744932022326215">Habilita la función de accesibilidad de resaltar el cursor en la pantalla de acceso. Si se establece esta política como verdadera, la función de resaltar el cursor estará siempre habilitada en la pantalla de acceso. @@ -3495,6 +3557,11 @@ Si la inhabilitas, los usuarios no podrán canjear esas ofertas.</translation> <translation id="6048199181629830227">Habilita la administración de carga fuera del horario pico</translation> <translation id="6053681087509103368">Permitir que WebRTC use versiones obsoletas del protocolo TLD/DTLS</translation> +<translation id="605543517695935623">Lista de configuraciones para los servicios de Chrome Enterprise Connectors que se aplicarán al Enterprise Connector <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" />, el cual se activa cuando se produce un evento de seguridad en Chrome. Esto incluye los veredictos negativos de los Enterprise Connectors de análisis, la reutilización de contraseñas, la navegación en páginas no seguras y otras acciones sensibles del usuario que afectan la seguridad. + + El campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica a qué proveedor de servicios de informes le corresponden las configuraciones, y el campo <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> identifica qué eventos están habilitados para este proveedor. + + Esta política solo se puede establecer en <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="6058879286588763839">A menos que especifiques <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> (que anula <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />), si estableces <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />, se especificará la política de administración de energía en el modo de carga de la batería (cuando lo admita el dispositivo). Para extender la duración de la batería, la política controlará de forma dinámica la carga de la batería y reducirá su desgaste debido al uso. Si no estableces la política (cuando lo admita el dispositivo), se aplicará el modo estándar de carga de la batería. Los usuarios no podrán cambiar esta configuración. @@ -4376,6 +4443,23 @@ Si no se establece esta política o se deja en blanco, el usuario podrá establecer cualquier Cuenta de Google como la principal del navegador en <ph name="PRODUCT_NAME" />.</translation> <translation id="723103540848640830">Establecer la longitud mínima del PIN de la pantalla bloqueada</translation> <translation id="7234280155140786597">Nombres de los hosts de mensajería nativa prohibidos (o * para todos)</translation> +<translation id="72369543045636739">Lista de configuraciones para los servicios de Chrome Enterprise Connectors que se aplicarán al Enterprise Connector <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" />, el cual se activa cuando se adjunta un archivo a Chrome. + + Los campos <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> y <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> se usan para determinar si el conector debe enviar un archivo para que se analice cuando se adjunta a una página específica, y qué etiquetas deben incluirse en la solicitud de análisis de ese archivo. La solicitud de análisis incluirá la etiqueta correspondiente a un patrón "enable" si la URL de la página coincide con un patrón asociado a esa etiqueta, siempre y cuando la URL no coincida con un patrón "disable" con la misma etiqueta. Si la solicitud incluye al menos 1 etiqueta, se realizará el análisis. + + El campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> especifica el proveedor de servicios de análisis al que corresponde la configuración. + + Si se establece el valor "1" en el campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" />, Chrome esperará a recibir una respuesta del servicio de análisis para permitir que la página acceda al archivo. Si se indica cualquier otro valor entero, Chrome permitirá que la página acceda al archivo de inmediato. + + El campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> controla si Chrome bloquea o permite el acceso a archivos protegidos con contraseña. + + El campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> controla si Chrome bloquea o permite el acceso a archivos demasiado grandes para ser analizados (más de 50 MB). + + El campo <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> se utiliza para determinar en qué etiquetas el conector requerirá que el usuario ingrese una justificación para evitar un análisis que derive en una advertencia evitable. Si no estableces el campo, se asumirá que no se requiere una justificación. + + Los campos <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> y <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> se utilizan para configurar el mensaje que verá el usuario cuando se muestre una advertencia después de que un análisis determine una infracción de política. El campo del mensaje incluye el texto que se le mostrará al usuario. Este puede tener un máximo de 200 caracteres. El administrador puede incluir una URL en el campo learn_more_url a fin de que el usuario obtenga con un clic más información del cliente sobre los motivos para bloquear la acción. El campo del idioma es opcional. Indica el idioma del mensaje. Si el campo de idioma se deja vacío o con el valor "default", se indica que se deberá utilizar un mensaje determinado cuando no haya ningún mensaje en el idioma del usuario. El campo de la etiqueta especifica para qué tipo de análisis se mostrará el mensaje. La lista custom_messages puede tener cero o más entradas, y cada una deberá tener completos los campos del mensaje y de la etiqueta. + + Esta política solo se puede establecer en <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="7246767840750730334">Permite habilitar las notificaciones de Phone Hub</translation> <translation id="7249828445670652637">Habilitar certificados de CA de <ph name="PRODUCT_OS_NAME" /> para apps de ARC</translation> <translation id="7252681704926980614">Envía los nombres de usuario y de archivo al servidor de impresoras nativas en cada trabajo de impresión. La acción predeterminada es no enviarlos. @@ -4424,6 +4508,7 @@ Si no se configura esta política, la acción predeterminada no se permite para los usuarios administrados por empresas y sí se permite para los usuarios no administrados.</translation> <translation id="7295019613773647480">Habilitar usuarios supervisados</translation> <translation id="7302043767260300182">Demora de bloqueo de pantalla con alimentación de CA</translation> +<translation id="7303902834678570827">Los usuarios de la sesión de invitado administrada no pueden almacenar la configuración de la pantalla de todo el dispositivo</translation> <translation id="731208205557053914">Envía información sobre los VPD</translation> <translation id="7313672174502374994">El hash SHA-256 de la imagen de fondo de pantalla.</translation> <translation id="7322825363493984512">La contraseña para autenticar los servicios del sistema contra el proxy web remoto.</translation> @@ -4746,6 +4831,13 @@ <translation id="780629758750905699">Permitir agregar cuentas de Family Link al dispositivo</translation> <translation id="7807139251387225825">Lista de tipos que deben excluirse de la sincronización</translation> <translation id="781268256210530471">Configuración de los complementos</translation> +<translation id="7814528532170362496">Esta política controla la verificación de URL en tiempo real para identificar URL no seguras. + + Si no estableces esta política o la inhabilitas, se aplicarán las verificaciones de la Navegación segura para los usuarios comunes. No obstante, estas verificaciones aún podrán incluir búsquedas en tiempo real conforme al valor de configuración "Mejorar las búsquedas y la navegación" y el valor de la política UrlKeyedAnonymizedDataCollectionEnabled. + + Si habilitas esta política, se enviarán las URL para su análisis en tiempo real conforme a las Condiciones del Servicio de Chrome Enterprise. Como resultado, Chrome enviará las URL a Google Cloud o a los terceros que elijas para verificarlas en tiempo real. Se desactivarán las búsquedas en tiempo real de la versión para usuarios comunes de la Navegación segura. + + Esta política solo se puede establecer en <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="7816326058023670173">El secreto compartido entre el dispositivo del niño y el del padre o la madre.</translation> <translation id="7818131573217430250">Establece el estado predeterminado del modo de contraste alto en la pantalla de acceso.</translation> <translation id="7823902813460802031">Si habilitas la política, <ph name="PRODUCT_OS_NAME" /> sacará el dispositivo del Modo de desarrollador. @@ -5113,6 +5205,7 @@ Si estableces la política, los usuarios no podrán cambiarla. Si no la estableces, la política estará activa, pero los usuarios podrán cambiar esta configuración.</translation> <translation id="8300992833374611099">Controlar dónde se pueden usar las Herramientas para desarrolladores</translation> +<translation id="8301065459352777588">Los usuarios de la sesión de invitado administrada pueden almacenar la configuración de la pantalla de todo el dispositivo</translation> <translation id="8306117673860983372">Configuración de acceso</translation> <translation id="8312129124898414409">Te permite establecer si los sitios web están autorizados a utilizar la generación de claves. La generación de claves puede permitirse o rechazarse para todos los sitios web. @@ -5590,6 +5683,13 @@ Si estableces la política como falsa, se inhabilitarán las actualizaciones automáticas para el audio y el video y no se mostrarán advertencias para las imágenes. Esta política no afecta otros tipos de contenido mixto que no sean imágenes, audio y video. A partir de <ph name="PRODUCT_NAME" /> 84, esta política dejará de tener efecto.</translation> +<translation id="9009505213521705952">Si inhabilitas <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" />, esta política te permite especificar una lista de patrones de origen que indiquen los sitios donde los usuarios pueden hacer clic para omitir las páginas de advertencia que muestra <ph name="PRODUCT_NAME" /> cuando navegan a sitios que tienen errores de SSL. Los usuarios no podrán hacer clic para omitir páginas de advertencia de SSL en orígenes que no se encuentren en esta lista. + + Si se habilita <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> o no se establece, esta política no tiene efecto. + + Si no estableces la política, se aplicará <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> para todos los sitios. + + Para obtener información detallada sobre los patrones de entrada válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> no es un valor aceptado para esta política. Esta política solo establece coincidencias basadas en el origen; por lo tanto, se ignoran todas las rutas de acceso que se incluyan en el patrón de URL.</translation> <translation id="9010080992450148617">Permite que los usuarios inscritos en el Programa de protección avanzada envíen descargas a Google para que las analice en profundidad</translation> <translation id="9013875414788074110">Durante el acceso, <ph name="PRODUCT_OS_NAME" /> podrá realizar la autenticación a través de un servidor (en línea) o de una contraseña en caché (sin conexión).
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 943f82cd..28021b62 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -454,6 +454,7 @@ Si cette règle est définie sur "False", ils ne pourront pas ajouter ni configurer leurs propres imprimantes. Ils ne pourront pas non plus se servir d'imprimantes préalablement configurées pour lancer des impressions. </translation> <translation id="1615221548356595305">Autoriser le multiplexage des connexions HTTP/2 pour les hôtes qui utilisent des certificats client</translation> +<translation id="1616280227447957376">Autoriser l'accès malgré un avertissement SSL depuis certaines origines</translation> <translation id="1617235075406854669">Activer la suppression de l'historique du navigateur et de l'historique des téléchargements</translation> <translation id="1620510694547887537">Caméra</translation> <translation id="1626379196197114720">Autoriser l'utilisation du cache amélioré</translation> @@ -1009,6 +1010,7 @@ Le correcteur orthographique peut toujours utiliser un dictionnaire téléchargé en local, sauf si la fonctionnalité est désactivée par <ph name="SPELLCHECK_ENABLED_POLICY_NAME" />, auquel cas cette règle n'a aucun effet.</translation> <translation id="2433516903565257847">Pourcentage du parc à mettre à jour au terme du nombre de jours indiqué.</translation> <translation id="2435052056904485763">Liste d'autorisation des serveurs de délégation Kerberos</translation> +<translation id="2435232509335686514">Règle de configuration de <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> pour la gestion des fichiers téléchargés</translation> <translation id="2448315169529769573">Si cette règle est activée, <ph name="PRODUCT_OS_NAME" /> envoie à Google les statistiques d'utilisation et les données de diagnostic, y compris les rapports d'erreur. Si cette règle est désactivée, ces statistiques et ces données ne sont pas envoyées. Si cette règle n'est pas configurée, les statistiques et les données de diagnostic ne sont pas envoyées concernant les appareils non gérés, mais le sont pour les appareils gérés.</translation> @@ -1246,6 +1248,15 @@ <translation id="2757054304033424106">Types d'extensions ou d'applications autorisés à être installés</translation> <translation id="2759224876420453487">Contrôler le comportement de l'utilisateur lors d'une session à plusieurs profils</translation> <translation id="2761483219396643566">Délai d'inactivité avant l'affichage d'un avertissement (en cas d'utilisation de la batterie)</translation> +<translation id="2764165704281937018">Liste des paramètres à appliquer au <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />, qui se déclenche lorsqu'un fichier est téléchargé. + + Les champs "<ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_MIME_TYPES_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />" et "<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" />" permettent de déterminer si le connecteur doit envoyer un fichier au fournisseur de services lors du téléchargement à partir d'une page Web. L'URL de la page Web doit correspondre à un format associé à un format "enable" et non "disable". Le type MIME du fichier doit également correspondre à un format associé à un format "enable" et non "disable". + + Le champ "<ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" />" indique à quel fournisseur de services d'analyse correspondent les paramètres. + + Le champ "<ph name="ENTERPRISE_CONNECTOR_ENTERPRISE_ID_FIELD" />" identifie l'entreprise auprès du fournisseur de services. Quand l'utilisateur est invité à se connecter lors de la configuration de <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />, seuls les comptes utilisateur associés à cette entreprise sont autorisés. + + Cette règle ne peut être configurée que dans la <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="2769952903507981510">Configurer le nom de domaine requis pour les hôtes d'accès à distance</translation> <translation id="2772955711376920612">Si cette règle est activée, et que les règles <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> et <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> sont configurées, le mode d'alimentation alternée en heures pleines est activé (s'il est disponible sur l'appareil). Ce mode permet d'économiser l'énergie en faisant fonctionner autant que possible l'appareil sur batterie plutôt que sur secteur pendant les heures pleines. Vous pouvez définir l'heure de début et de fin de ce mode pour chaque jour de la semaine. Tant que le niveau de charge de la batterie reste au-dessus du seuil spécifié, l'appareil fonctionne sur batterie en heures pleines (même s'il est branché sur une prise électrique). Passée l'heure de fin définie, l'appareil repasse sur l'alimentation secteur (s'il est branché sur une prise), mais il ne recharge pas la batterie. L'appareil reprendra son fonctionnement habituel en utilisant l'alimentation secteur et en rechargeant la batterie à l'heure programmée pour le début de la charge. @@ -1328,6 +1339,23 @@ Si cette règle est désactivée ou qu'elle n'est pas configurée, les appareils enregistrés ne communiquent pas ces informations.</translation> <translation id="288923520817177650">Autoriser la création des sessions <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> de <ph name="WEBXR_API_NAME_SHORT" /></translation> <translation id="2890645751406497668">Autoriser automatiquement ces sites à se connecter à des appareils USB correspondant au fournisseur et aux ID de produit indiqués.</translation> +<translation id="2892041629748346178">Liste des paramètres des services des connecteurs Chrome Enterprise à appliquer au connecteur Enterprise <ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" />, qui se déclenche lorsqu'un fichier est téléchargé dans Chrome. + + Les champs "<ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />" et "<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" />" permettent de déterminer si le connecteur doit envoyer un fichier en vue d'une analyse lorsque celui-ci est téléchargé à partir d'une page spécifique, ainsi que les tags à inclure dans la demande d'analyse de ce fichier. Un tag correspondant à un format "enable" sera inclus dans la demande d'analyse si l'URL de la page suit un format associé à ce tag, à condition qu'aucun format "disable" associé à ce même tag ne corresponde à l'URL de la page. L'analyse a lieu si au moins un tag doit être inclus dans la demande. + + Le champ "<ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" />" indique à quel fournisseur de services d'analyse correspondent les paramètres. + + Si la valeur du champ "<ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" />" est 1, Chrome attend de recevoir une réponse du service d'analyse avant de laisser l'utilisateur accéder au fichier téléchargé. Pour toute autre valeur entière, Chrome laisse l'utilisateur accéder immédiatement au fichier. + + Le champ "<ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" />" permet de définir si Chrome doit bloquer ou autoriser l'accès aux fichiers protégés par un mot de passe. + + Le champ "<ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" />" permet de spécifier si Chrome doit bloquer ou autoriser l'accès aux fichiers trop volumineux pour être analysés (plus de 50 Mo). + + Le champ "<ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" />" permet d'indiquer les tags pour lesquels le connecteur doit demander à l'utilisateur d'expliquer pourquoi une analyse entraînant l'affichage d'un avertissement est ignorée. Si ce champ n'est pas renseigné, nous partons du principe qu'aucune justification n'est requise. + + Les champs "<ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" />" et "<ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" />" permettent de configurer le message à montrer à l'utilisateur lorsqu'un avertissement s'affiche après une analyse dont le résultat révèle un problème. Le message saisi dans le champ ne doit pas comporter plus de 200 caractères. Le champ "learn_more_url" contient une URL fournie par l'administrateur sur laquelle l'utilisateur peut cliquer pour obtenir des informations indiquées par le client et savoir pourquoi l'action a été bloquée. Le champ "language" est facultatif. Il indique la langue dans laquelle est saisi le message. Si ce champ est vide ou contient la valeur "par défaut", un message est proposé par défaut. Le champ "tag" spécifie pour quel type d'analyses le message est affiché. Le champ "custom_messages" peut être vide ou contenir plusieurs entrées (les champs "message" et "tag" devant être renseignés pour chacune d'elles). + + Cette règle ne peut être configurée que dans la <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="2893546967669465276">Envoyer des journaux système au serveur de gestion</translation> <translation id="2899002520262095963">Les applications Android peuvent utiliser les configurations réseau et les certificats CA définis par cette règle, mais elles n'ont pas accès à certaines options de configuration.</translation> <translation id="2899213072616346687">Permet de limiter le mode d'impression d'images de fond. Si cette règle n'est pas configurée, aucune limite ne s'applique.</translation> @@ -1729,6 +1757,21 @@ <translation id="3412937883532015092">Si cette règle est définie sur un nombre, <ph name="PRODUCT_NAME" /> affiche un message pendant le nombre de millisecondes défini, puis ouvre un navigateur secondaire. Si cette règle n'est pas configurée ou qu'elle est définie sur 0, l'URL sélectionnée s'ouvre automatiquement dans un navigateur secondaire.</translation> +<translation id="3413215487296688603">Liste des paramètres des services des connecteurs Chrome Enterprise à appliquer au connecteur Enterprise <ph name="ON_BULK_DATA_ENTRY_ENTERPRISE_CONNECTOR" />, qui se déclenche lorsque des données sont collées dans Chrome depuis le presse-papiers ou lorsque du contenu Web est ajouté par glisser-déposer. + + Les champs "<ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />" et "<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" />" permettent de déterminer si le connecteur doit envoyer des données en vue d'une analyse lorsque celles-ci sont saisies dans une page spécifique, ainsi que les tags à inclure dans la demande d'analyse de ces données. Un tag correspondant à un format "enable" sera inclus dans la demande d'analyse si l'URL de la page suit un format associé à ce tag, à condition qu'aucun format "disable" associé à ce même tag ne corresponde à l'URL de la page. L'analyse a lieu si au moins un tag doit être inclus dans la demande. + + Le champ "<ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" />" indique à quel fournisseur de services d'analyse correspondent les paramètres. + + Si la valeur du champ "<ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" />" est 1, Chrome attend de recevoir une réponse du service d'analyse avant de laisser la page accéder aux données. Pour toute autre valeur entière, Chrome laisse la page accéder immédiatement aux données. + + Le champ "<ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" />" indique la taille minimale (en octets) que les données saisies dans Chrome doivent atteindre ou dépasser pour être analysées. Si ce champ n'est pas renseigné, la valeur par défaut est de 100 octets. + + Le champ "<ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" />" permet d'indiquer les tags pour lesquels le connecteur doit demander à l'utilisateur d'expliquer pourquoi une analyse entraînant l'affichage d'un avertissement est ignorée. Si ce champ n'est pas renseigné, nous partons du principe qu'aucune justification n'est requise. + + Les champs "<ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" />" et "<ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" />" permettent de configurer le message à montrer à l'utilisateur lorsqu'un avertissement s'affiche après une analyse dont le résultat révèle un problème. Le message saisi dans le champ ne doit pas comporter plus de 200 caractères. Le champ "learn_more_url" contient une URL fournie par l'administrateur sur laquelle l'utilisateur peut cliquer pour obtenir des informations indiquées par le client et savoir pourquoi l'action a été bloquée. Le champ "language" est facultatif. Il indique la langue dans laquelle est saisi le message. Si ce champ est vide ou contient la valeur "par défaut", un message est proposé par défaut. Le champ "tag" spécifie pour quel type d'analyses le message est affiché. Le champ "custom_messages" peut être vide ou contenir plusieurs entrées (les champs "message" et "tag" devant être renseignés pour chacune d'elles). + + Cette règle ne peut être configurée que dans la <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="3415954062311826850">Cette règle n'est pas disponible dans ARC.</translation> <translation id="34160070798637152">Contrôle la configuration réseau au niveau de l'appareil.</translation> <translation id="3417130629744653218">Autoriser les sites Web à vérifier si des modes de paiement sont disponibles.</translation> @@ -2351,6 +2394,11 @@ <translation id="4377599627073874279">Autoriser tous les sites à afficher toutes les images</translation> <translation id="437791893267799639">Règle non définie, interdire la migration de données et ARC</translation> <translation id="4382413175336720282">La vérification en temps réel des URL est désactivée.</translation> +<translation id="4387741272680827493">Cette règle permet de dresser une liste de noms d'hôte qui ignorent les mises à niveau HSTS préchargées entre http et https. + + Seuls les noms d'hôte sans extension sont autorisés dans cette règle. Elle ne s'applique qu'aux entrées préchargées HSTS "statiques" (par exemple, <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />). Elle n'empêche pas les mises à niveau HSTS pour les serveurs qui ont demandé "dynamiquement" des mises à niveau HSTS à l'aide d'un en-tête de réponse <ph name="HSTS_HEADER_NAME" />. + + Les noms d'hôte fournis doivent être indiqués sous forme canonique : tous les noms de domaine internationalisés (IDN) doivent être convertis dans leur format d'étiquette A, et toutes les lettres ASCII doivent être en minuscules. Cette règle ne s'applique qu'aux noms d'hôte sans extension spécifiques indiqués. Elle ne s'applique pas à leurs sous-domaines.</translation> <translation id="4387922553629365459">Permet de dresser la liste des formats d'URL pour lesquels les sites ne sont pas autorisés à ouvrir les fenêtres pop-up. Si cette règle n'est pas configurée, la règle <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> s'applique pour tous les sites, à condition qu'elle soit définie. Si ce n'est pas le cas, le paramètre défini par l'utilisateur s'applique. @@ -2967,6 +3015,11 @@ * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />, les champs <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" /> et <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> sont utilisés. Remarque : Pour consulter des exemples détaillés, accédez au site The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation> +<translation id="5266173014392157048">Cette règle est obsolète (veuillez utiliser la règle "<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />" à la place). + + Elle permet de spécifier les serveurs que <ph name="PRODUCT_NAME" /> est susceptible d'utiliser. Séparez les noms des serveurs par une virgule. Les caractères génériques (<ph name="WILDCARD_VALUE" />) sont autorisés. + + Si cette règle n'est pas configurée, <ph name="PRODUCT_NAME" /> ne délègue pas les identifiants de l'utilisateur, même si le serveur est identifié comme faisant partie de l'intranet.</translation> <translation id="5273744932022326215">Permet d'activer la fonctionnalité d'accessibilité de mise en surbrillance du curseur sur l'écran de connexion. Si cette règle est définie sur "True", la mise en surbrillance du curseur est toujours activée sur l'écran de connexion. @@ -3499,6 +3552,11 @@ Si elle est désactivée, ils ne peuvent pas en bénéficier.</translation> <translation id="6048199181629830227">Activer l'alimentation alternée en heures pleines</translation> <translation id="6053681087509103368">Autoriser WebRTC à utiliser des versions obsolètes du protocole TLD/DTLS</translation> +<translation id="605543517695935623">Liste des services des connecteurs Chrome Enterprise à appliquer au connecteur Enterprise <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" />, qui se déclenche lorsqu'un événement lié à la sécurité se produit dans Chrome. Cela inclut les verdicts négatifs lors de l'analyse par les connecteurs Enterprise, la réutilisation de mots de passe, la navigation sur des pages dangereuses et d'autres activités sensibles des utilisateurs. + + Le champ "<ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" />" indique le fournisseur de services de création de rapports auquel s'appliquent les paramètres, et le champ "<ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" />", les événements activés pour ce fournisseur de services. + + Cette règle ne peut être configurée que dans la <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="6058879286588763839">La règle "<ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />" permet de gérer l'alimentation suivant le mode de recharge de la batterie (si l'appareil le permet), sauf si la règle "<ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" />" est spécifiée et remplace ainsi la règle "<ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />". Pour prolonger l'autonomie de la batterie, cette règle contrôle dynamiquement la recharge de la batterie en réduisant au maximum les contraintes et l'usure. Si cette règle n'est pas configurée (et que l'appareil le permet), le mode standard de recharge de la batterie est appliqué, et les utilisateurs ne peuvent pas modifier ce paramètre. @@ -4379,6 +4437,23 @@ Si cette règle est laissée vide ou n'est pas configurée, l'utilisateur peut utiliser n'importe quel compte Google comme compte de navigation principal sur <ph name="PRODUCT_NAME" />.</translation> <translation id="723103540848640830">Définir le nombre minimal de caractères pour le code de l'écran de verrouillage</translation> <translation id="7234280155140786597">Noms des hôtes de messagerie native non autorisés (ou "*" pour tous)</translation> +<translation id="72369543045636739">Liste des paramètres des services des connecteurs Chrome Enterprise à appliquer au connecteur Enterprise <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" />, qui se déclenche lorsqu'un fichier est joint à Chrome. + + Les champs "<ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />" et "<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" />" permettent de déterminer si le connecteur doit envoyer un fichier en vue d'une analyse lorsqu'il est joint à une page spécifique, ainsi que les tags à inclure dans la demande d'analyse de ce fichier. Un tag correspondant à un format "enable" sera inclus dans la demande d'analyse si l'URL de la page suit un format associé à ce tag, à condition qu'aucun format "disable" associé à ce même tag ne corresponde à l'URL de la page. L'analyse a lieu si au moins un tag doit être inclus dans la demande. + + Le champ "<ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" />" indique à quel fournisseur de services d'analyse correspondent les paramètres. + + Si la valeur du champ "<ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" />" est 1, Chrome attend de recevoir une réponse du service d'analyse avant de laisser la page accéder au fichier. Pour toute autre valeur entière, Chrome laisse la page accéder immédiatement au fichier. + + Le champ "<ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" />" permet de définir si Chrome doit bloquer ou autoriser l'accès aux fichiers protégés par un mot de passe. + + Le champ "<ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" />" permet de spécifier si Chrome doit bloquer ou autoriser l'accès aux fichiers trop volumineux pour être analysés (plus de 50 Mo). + + Le champ "<ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" />" permet d'indiquer les tags pour lesquels le connecteur doit demander à l'utilisateur d'expliquer pourquoi une analyse entraînant l'affichage d'un avertissement est ignorée. Si ce champ n'est pas renseigné, nous partons du principe qu'aucune justification n'est requise. + + Les champs "<ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />", "<ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" />" et "<ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" />" permettent de configurer le message à montrer à l'utilisateur lorsqu'un avertissement s'affiche après une analyse dont le résultat révèle un problème. Le message saisi dans le champ ne doit pas comporter plus de 200 caractères. Le champ "learn_more_url" contient une URL fournie par l'administrateur sur laquelle l'utilisateur peut cliquer pour obtenir des informations indiquées par le client et savoir pourquoi l'action a été bloquée. Le champ "language" est facultatif. Il indique la langue dans laquelle est saisi le message. Si ce champ est vide ou contient la valeur "par défaut", un message est proposé par défaut. Le champ "tag" spécifie pour quel type d'analyses le message est affiché. Le champ "custom_messages" peut être vide ou contenir plusieurs entrées (les champs "message" et "tag" devant être renseignés pour chacune d'elles). + + Cette règle ne peut être configurée que dans la <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="7246767840750730334">Autorisez l'activation des notifications Phone Hub.</translation> <translation id="7249828445670652637">Activer les certificats CA <ph name="PRODUCT_OS_NAME" /> pour les applications ARC</translation> <translation id="7252681704926980614">Le nom d'utilisateur et le nom de fichier sont envoyés au serveur des imprimantes en mode natif à chaque tâche d'impression. Le paramètre par défaut est de ne pas les envoyer. @@ -4753,6 +4828,13 @@ <translation id="780629758750905699">Autoriser l'ajout de comptes Family Link à l'appareil</translation> <translation id="7807139251387225825">Liste des types à exclure de la synchronisation</translation> <translation id="781268256210530471">Paramètres des plug-ins</translation> +<translation id="7814528532170362496">Cette règle permet de gérer la détection en temps réel des URL dangereuses. + + Si cette règle est désactivée ou qu'elle n'est pas configurée, seules les vérifications courantes de la navigation sécurisée sont effectuées. Les vérifications courantes de la navigation sécurisée peuvent tout de même inclure des recherches en temps réel, selon la valeur du paramètre "Améliorer les recherches et la navigation" et la valeur de la règle UrlKeyedAnonymizedDataCollectionEnabled. + + Si cette règle est activée, les URL sont analysées en temps réel conformément aux conditions d'utilisation de Chrome Enterprise. Chrome envoie alors les URL à Google Cloud ou à des tiers de votre choix pour une vérification en temps réel. Les vérifications courantes en temps réel de la navigation sécurisée seront désactivées. + + Cette règle ne peut être configurée que dans la <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="7816326058023670173">Secret partagé entre les appareils utilisés par les parents et l’enfant.</translation> <translation id="7818131573217430250">Définir l'état par défaut du mode Contraste élevé sur l'écran de connexion</translation> <translation id="7823902813460802031">Si cette règle est activée, <ph name="PRODUCT_OS_NAME" /> empêche l'appareil de passer en mode développeur. @@ -5578,6 +5660,13 @@ Si cette règle est définie sur "False", le contenu audio et vidéo n'est pas mis à niveau automatiquement, et aucun avertissement ne s'affiche pour les images. Cette règle n'influe pas sur les types de contenus mixtes autres que les images et les contenus audio/vidéo. Notez également qu'elle ne sera plus applicable à compter de la version 84 de <ph name="PRODUCT_NAME" />.</translation> +<translation id="9009505213521705952">Cette règle permet, si la règle "<ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" />" est désactivée, de dresser une liste de formats d'origines afin d'autoriser les utilisateurs qui arrivent sur les sites concernés à passer les pages d'avertissement affichées par <ph name="PRODUCT_NAME" /> en cas d'erreurs SSL. Les utilisateurs ne pourront pas passer les pages d'avertissement SSL des origines qui ne figurent pas dans cette liste. + + Cette règle n'a aucun effet si la règle "<ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" />" est activée ou qu'elle n'est pas configurée. + + Si cette règle n'est pas configurée, la règle "<ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" />" s'applique à tous les sites. + + Pour en savoir plus sur les formats d'entrée valides, rendez-vous sur https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. La valeur "<ph name="WILDCARD_VALUE" />" n'est pas acceptée pour cette règle. Cette règle ne tient compte que de l'origine. Ainsi, tout chemin d'accès dans le format d'URL est ignoré.</translation> <translation id="9010080992450148617">Autoriser les utilisateurs inscrits au Programme Protection Avancée à envoyer leurs téléchargements à Google pour une analyse approfondie</translation> <translation id="9013875414788074110">Lors de la connexion, l'authentification dans <ph name="PRODUCT_OS_NAME" /> peut être effectuée sur un serveur (en ligne) ou à l'aide d'un mot de passe en cache (hors connexion).
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index a447df6..5f0e58f 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -453,6 +453,7 @@ Jika kebijakan ini disetel ke Salah (False), pengguna tidak akan dapat menambahkan dan mengonfigurasi printernya sendiri. Pengguna juga tidak akan dapat mencetak menggunakan printer yang telah dikonfigurasikan sebelumnya. </translation> <translation id="1615221548356595305">Izinkan koneksi HTTP/2 bergabung untuk host ini bahkan saat sertifikat klien digunakan</translation> +<translation id="1616280227447957376">Mengizinkan untuk melanjutkan dari halaman peringatan SSL di asal tertentu</translation> <translation id="1617235075406854669">Aktifkan penghapusan histori download atau browser</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1626379196197114720">Izinkan penggunaan back-forward cache</translation> @@ -1007,6 +1008,7 @@ Periksa ejaan dapat selalu menggunakan kamus yang didownload secara lokal, kecuali jika fitur ini dinonaktifkan oleh <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> sehingga kebijakan ini tidak akan berpengaruh.</translation> <translation id="2433516903565257847">Persentase fleet perangkat yang harus diperbarui setelah sejumlah hari tertentu.</translation> <translation id="2435052056904485763">Daftar server delegasi Kerberos yang diizinkan</translation> +<translation id="2435232509335686514">Kebijakan konfigurasi untuk <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> yang menangani file yang didownload</translation> <translation id="2448315169529769573">Jika kebijakan disetel ke Aktif, <ph name="PRODUCT_OS_NAME" /> akan melaporkan kembali metrik penggunaan dan data diagnostik, termasuk laporan kerusakan, ke Google. Jika kebijakan disetel ke Nonaktif, pelaporan metrik dan data diagnostik akan dinonaktifkan. Jika kebijakan tidak disetel, pelaporan metrik dan data diagnostik akan dinonaktifkan di perangkat yang tidak terkelola dan akan diaktifkan di perangkat terkelola.</translation> @@ -1249,6 +1251,15 @@ <translation id="2757054304033424106">Ketik ekstensi/aplikasi yang diizinkan untuk dipasang</translation> <translation id="2759224876420453487">Mengontrol perilaku pengguna pada sesi multiprofil</translation> <translation id="2761483219396643566">Menunda peringatan waktu menganggur saat menggunakan daya baterai</translation> +<translation id="2764165704281937018">Daftar setelan yang akan diterapkan ke <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />, yang aktif saat file didownload. + + Kolom <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MIME_TYPES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />, dan <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> digunakan untuk menentukan apakah konektor perlu mengirimkan file ke penyedia layanan saat mendownload dari halaman web. URL halaman web harus cocok dengan pola yang terkait ke pola 'enable' dan tidak terkait ke pola 'disable'. Jenis MIME file juga harus cocok dengan pola yang terkait ke pola 'enable' dan tidak terkait ke pola 'disable'. + + Kolom <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> akan mengidentifikasi penyedia layanan analisis yang sesuai dengan setelan. + + Kolom <ph name="ENTERPRISE_CONNECTOR_ENTERPRISE_ID_FIELD" /> akan mengidentifikasi perusahaan dengan penyedia layanan. Jika pengguna diminta login sebagai bagian dari penyiapan <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />, hanya akun pengguna yang terkait dengan perusahaan ini yang akan diizinkan. + + Kebijakan ini hanya dapat disetel dari <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="2769952903507981510">Mengonfigurasi nama domain yang dibutuhkan untuk hosting akses jarak jauh</translation> <translation id="2772955711376920612">Menyetel kebijakan ke Aktif serta menyetel <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> dan <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> akan terus memicu pengaktifan daya baterai, jika didukung di perangkat. Kebijakan manajemen pengaktifan daya baterai adalah kebijakan penghematan daya yang meminimalkan penggunaan arus listrik AC selama waktu penggunaan puncak. Untuk setiap hari kerja, Anda dapat menyetel waktu mulai dan waktu akhir untuk menjalankan sistem dalam mode pengaktifan daya baterai. Selama baterai tetap berada di atas nilai minimum yang ditentukan, perangkat akan berjalan menggunakan daya baterai (meski arus listrik AC terhubung) selama waktu tersebut. Setelah waktu akhir yang ditentukan, perangkat akan berjalan menggunakan arus listrik AC (jika terhubung), tetapi tidak akan mengisi daya baterai. Perangkat akan berfungsi normal kembali menggunakan arus listrik AC dan mengisi ulang daya baterai setelah waktu mulai pengisian daya yang ditentukan. @@ -1331,6 +1342,23 @@ Jika kebijakan disetel ke Nonaktif atau tidak disetel, perangkat yang terdaftar tidak akan melaporkan informasi status Android</translation> <translation id="288923520817177650">Izinkan pembuatan sesi <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> <ph name="WEBXR_API_NAME_SHORT" /></translation> <translation id="2890645751406497668">Otomatis berikan izin ke situs ini untuk terhubung ke perangkat USB dengan ID produk dan vendor yang ditentukan.</translation> +<translation id="2892041629748346178">Daftar setelan layanan Chrome Enterprise Connectors yang akan diterapkan ke <ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" /> Enterprise Connector, yang aktif saat file didownload di Chrome. + + Kolom <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> dan <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> digunakan untuk menentukan apakah konektor perlu mengirimkan file untuk dianalisis saat didownload dari halaman tertentu, dan jenis tag yang perlu disertakan dalam permintaan analisis untuk file tersebut. Tag yang sesuai dengan pola 'enable' akan disertakan dalam permintaan analisis jika URL halaman cocok dengan pola yang terkait dengan tag tersebut, selama tidak ada pola 'disable' ber-tag sama yang cocok dengan URL halaman. Analisis dilakukan jika terdapat minimal 1 tag yang disertakan dalam permintaan. + + Kolom <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> akan mengidentifikasi penyedia layanan analisis yang sesuai dengan setelan. + + Jika kolom <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> disetel ke 1, Chrome akan menunggu untuk mendapatkan respons dari layanan analisis sebelum memberikan akses pengguna ke file yang didownload. Jika nilai berupa bilangan bulat lainnya, Chrome akan langsung memberikan akses pengguna ke file. + + Kolom <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> mengontrol apakah Chrome akan memblokir atau mengizinkan file yang dilindungi sandi. + + Kolom <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> mengontrol apakah Chrome akan memblokir atau mengizinkan file yang berukuran terlalu besar untuk dianalisis (lebih dari 50 MB). + + Kolom <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> digunakan untuk menentukan tag mana yang diperlukan saat konektor mewajibkan pengguna memasukkan justifikasi agar dapat mengabaikan pemindaian yang menghasilkan peringatan yang dapat diabaikan. Jika kolom tidak disetel, tidak perlu justifikasi. + + Kolom <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" />, dan <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> digunakan untuk mengonfigurasi pesan yang akan ditampilkan kepada pengguna, saat muncul peringatan ketika hasil pemindaian masih menunjukkan ada masalah. Kolom pesan berisi teks yang akan ditampilkan kepada pengguna dan tidak boleh melebihi 200 karakter. Kolom learn_more_url berisi URL yang disediakan oleh admin. Pengguna dapat mengklik URL untuk mengetahui lebih lanjut penyebab diblokirnya tindakan tersebut. Kolom bahasa bersifat opsional dan berisi bahasa pesan. Kolom bahasa yang kosong atau nilai 'default' menunjukkan pesan yang akan digunakan saat bahasa pengguna tidak memiliki pesan. Kolom tag menentukan jenis pemindaian yang akan menampilkan pesan. Daftar custom_messages dapat memiliki nol atau beberapa entri, dengan tiap entri perlu memiliki pesan yang bukan kosong dan kolom tag. + + Kebijakan ini hanya dapat disetel dari <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="2893546967669465276">Mengirim log sistem ke server pengelolaan</translation> <translation id="2899002520262095963">Aplikasi Android dapat menggunakan konfigurasi jaringan dan sertifikat CA yang disetel melalui kebijakan ini, namun tidak memiliki akses ke beberapa opsi konfigurasi.</translation> <translation id="2899213072616346687">Membatasi mode pencetakan grafis latar belakang. Kebijakan yang tidak ditetapkan dianggap sebagai tidak ada batasan.</translation> @@ -1736,6 +1764,21 @@ <translation id="3412937883532015092">Jika kebijakan disetel ke angka, <ph name="PRODUCT_NAME" /> akan menampilkan pesan untuk angka milidetik tersebut, kemudian membuka browser alternatif. Jika kebijakan tidak disetel atau disetel ke 0, navigasi ke URL yang ditetapkan akan segera membuka kebijakan tersebut di browser alternatif.</translation> +<translation id="3413215487296688603">Daftar setelan layanan Chrome Enterprise Connectors yang akan diterapkan ke <ph name="ON_BULK_DATA_ENTRY_ENTERPRISE_CONNECTOR" /> Enterprise Connector, yang aktif saat data dimasukkan ke Chrome dari papan klip atau dengan menarik lalu melepas konten web. + + Kolom <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />, dan <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> digunakan untuk menentukan apakah konektor perlu mengirimkan data untuk dianalisis saat dimasukkan ke halaman tertentu, dan jenis tag yang perlu disertakan dalam permintaan analisis untuk data tersebut. Tag yang sesuai dengan pola 'enable' akan disertakan dalam permintaan analisis jika URL halaman cocok dengan pola yang terkait dengan tag tersebut, selama tidak ada pola 'disable' ber-tag sama yang cocok dengan URL halaman. Analisis dilakukan jika terdapat minimal 1 tag yang disertakan dalam permintaan. + + Kolom <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> akan mengidentifikasi penyedia layanan analisis yang sesuai dengan setelan. + + Jika kolom <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> disetel ke 1, Chrome akan menunggu untuk mendapatkan respons dari layanan analisis sebelum memberikan akses halaman ke data tersebut. Jika nilai berupa bilangan bulat lainnya, Chrome akan langsung memberikan akses halaman ke data. + + Kolom <ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" /> menunjukkan bahwa ukuran minimum data (dalam byte) yang dimasukkan di Chrome harus sama atau lebih besar agar dapat dipindai. Nilai defaultnya adalah 100 byte jika kolom tidak disetel. + + Kolom <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> digunakan untuk menentukan tag mana yang diperlukan saat konektor mewajibkan pengguna memasukkan justifikasi agar dapat mengabaikan pemindaian yang menghasilkan peringatan yang dapat diabaikan. Jika kolom tidak disetel, tidak perlu justifikasi. + + Kolom <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" />, dan <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> digunakan untuk mengonfigurasi pesan yang akan ditampilkan kepada pengguna, saat muncul peringatan ketika hasil pemindaian masih menunjukkan ada masalah. Kolom pesan berisi teks yang akan ditampilkan kepada pengguna dan tidak boleh melebihi 200 karakter. Kolom learn_more_url berisi URL yang disediakan oleh admin. Pengguna dapat mengklik URL untuk mengetahui lebih lanjut penyebab diblokirnya tindakan tersebut. Kolom bahasa bersifat opsional dan berisi bahasa pesan. Kolom bahasa yang kosong atau nilai 'default' menunjukkan pesan yang akan digunakan saat bahasa pengguna tidak memiliki pesan. Kolom tag menentukan jenis pemindaian yang akan menampilkan pesan. Daftar custom_messages dapat memiliki nol atau beberapa entri, dengan tiap entri perlu memiliki pesan yang bukan kosong dan kolom tag. + + Kebijakan ini hanya dapat disetel dari <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="3415954062311826850">Kebijakan ini tidak didukung dalam ARC.</translation> <translation id="34160070798637152">Mengontrol konfigurasi jaringan tingkat perangkat.</translation> <translation id="3417130629744653218">Izinkan situs membuat kueri untuk metode pembayaran yang tersedia.</translation> @@ -2360,6 +2403,11 @@ <translation id="4377599627073874279">Izinkan semua situs menampilkan semua gambar</translation> <translation id="437791893267799639">Kebijakan tidak disetel, jangan izinkan migrasi data dan ARC</translation> <translation id="4382413175336720282">Pemeriksaan URL secara real time dinonaktifkan.</translation> +<translation id="4387741272680827493">Menyetel kebijakan akan menentukan daftar nama host yang mengabaikan upgrade HSTS yang dipramuat dari HTTP menjadi HTTPS. + + Hanya nama host berlabel tunggal yang diizinkan di kebijakan ini, dan kebijakan ini hanya berlaku pada entri HSTS yang dipramuat "statis" (contohnya, <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />). Kebijakan ini tidak mencegah upgrade HSTS untuk server yang memiliki upgrade HSTS yang diminta "secara dinamis" menggunakan header respons <ph name="HSTS_HEADER_NAME" />. + + Nama host yang diberikan harus dikanonikalisasi: Semua IDN harus dikonversi ke format berlabel A, dan semua huruf ASCII harus berupa huruf kecil. Kebijakan ini hanya berlaku untuk nama host berlabel tunggal spesifik yang telah ditentukan, bukan subdomain dari nama host tersebut.</translation> <translation id="4387922553629365459">Menyetel kebijakan memungkinkan Anda menetapkan daftar pola URL yang menentukan situs yang tidak dapat membuka pop-up. Tidak menyetel kebijakan berarti <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> akan berlaku untuk semua situs, jika disetel. Jika tidak, setelan pribadi pengguna akan digunakan. @@ -2976,6 +3024,11 @@ * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />, kolom <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" /> dan <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> akan digunakan. Catatan: Untuk contoh yang lebih mendetail, buka Project Chromium ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation> +<translation id="5266173014392157048">Kebijakan ini tidak digunakan lagi. Sebagai gantinya, gunakan kebijakan '<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />'. + + Menyetel kebijakan akan menetapkan server mana yang menjadi tujuan delegasi <ph name="PRODUCT_NAME" />. Pisahkan beberapa nama server dengan koma. Karakter pengganti, <ph name="WILDCARD_VALUE" />, diizinkan. + + Jika kebijakan tidak disetel, <ph name="PRODUCT_NAME" /> tidak akan mendelegasikan kredensial pengguna, meskipun server terdeteksi sebagai intranet.</translation> <translation id="5273744932022326215">Mengaktifkan fitur aksesibilitas sorotan kursor di layar login. Jika kebijakan ini ditetapkan ke true, sorotan kursor akan selalu diaktifkan di layar login. @@ -3507,6 +3560,11 @@ Jika kebijakan disetel ke Nonaktif, pengguna tidak dapat menukarkan penawaran ini.</translation> <translation id="6048199181629830227">Mengaktifkan fitur manajemen pengaktifan daya baterai</translation> <translation id="6053681087509103368">Izinkan WebRTC menggunakan versi protokol TLS/DTLS yang usang</translation> +<translation id="605543517695935623">Daftar setelan layanan Chrome Enterprise Connectors yang akan diterapkan ke <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> Enterprise Connector, yang aktif saat terjadi peristiwa keamanan di Chrome. Ini termasuk keputusan negatif dari analisis Enterprise Connector, penggunaan ulang sandi, navigasi ke halaman yang tidak aman, dan tindakan pengguna lainnya yang sensitif terhadap keamanan. + + Kolom <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> akan mengidentifikasi penyedia layanan laporan yang sesuai dengan setelan dan kolom <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> akan mengidentifikasi peristiwa yang diaktifkan untuk penyedia ini. + + Kebijakan ini hanya dapat disetel dari <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="6058879286588763839">Menyetel <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> akan menentukan kebijakan pengelolaan daya mode pengisian daya baterai (jika didukung di perangkat), kecuali <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> yang menggantikan <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> ditentukan. Untuk memperpanjang masa pakai baterai, kebijakan secara dinamis mengontrol pengisian daya baterai dengan meminimalkan ketegangan dan keausan. Tidak menyetel kebijakan (jika didukung di perangkat) akan menerapkan mode pengisian daya baterai standar, dan pengguna tidak dapat mengubahnya. @@ -4390,6 +4448,23 @@ Jika kebijakan ini tidak disetel atau kosong, pengguna dapat menyetel akun Google apa pun sebagai akun utama browser di <ph name="PRODUCT_NAME" />.</translation> <translation id="723103540848640830">Setel panjang minimum PIN layar kunci.</translation> <translation id="7234280155140786597">Nama hosting perpesanan asli yang dilarang (atau * untuk semua)</translation> +<translation id="72369543045636739">Daftar setelan layanan Chrome Enterprise Connectors yang akan diterapkan ke <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" /> Enterprise Connector, yang aktif saat file dilampirkan ke Chrome. + + Kolom <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> dan <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> digunakan untuk menentukan apakah konektor perlu mengirimkan file untuk dianalisis saat dilampirkan ke halaman tertentu, dan jenis tag yang perlu disertakan dalam permintaan analisis untuk file tersebut. Tag yang sesuai dengan pola 'enable' akan disertakan dalam permintaan analisis jika URL halaman cocok dengan pola yang terkait dengan tag tersebut, selama tidak ada pola 'disable' ber-tag sama yang cocok dengan URL halaman. Analisis dilakukan jika terdapat minimal 1 tag yang disertakan dalam permintaan. + + Kolom <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> akan mengidentifikasi penyedia layanan analisis yang sesuai dengan setelan. + + Jika kolom <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> disetel ke 1, Chrome akan menunggu untuk mendapatkan respons dari layanan analisis sebelum memberikan akses halaman ke file tersebut. Jika nilai berupa bilangan bulat lainnya, Chrome akan langsung memberikan akses halaman ke file. + + Kolom <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> mengontrol apakah Chrome akan memblokir atau mengizinkan file yang dilindungi sandi. + + Kolom <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> mengontrol apakah Chrome akan memblokir atau mengizinkan file yang berukuran terlalu besar untuk dianalisis (lebih dari 50 MB). + + Kolom <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> digunakan untuk menentukan tag mana yang diperlukan saat konektor mewajibkan pengguna memasukkan justifikasi agar dapat mengabaikan pemindaian yang menghasilkan peringatan yang dapat diabaikan. Jika kolom tidak disetel, tidak perlu justifikasi. + + Kolom <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" />, dan <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> digunakan untuk mengonfigurasi pesan yang akan ditampilkan kepada pengguna, saat muncul peringatan ketika hasil pemindaian masih menunjukkan ada masalah. Kolom pesan berisi teks yang akan ditampilkan kepada pengguna dan tidak boleh melebihi 200 karakter. Kolom learn_more_url berisi URL yang disediakan oleh admin. Pengguna dapat mengklik URL untuk mengetahui lebih lanjut penyebab diblokirnya tindakan tersebut. Kolom bahasa bersifat opsional dan berisi bahasa pesan. Kolom bahasa yang kosong atau nilai 'default' menunjukkan pesan yang akan digunakan saat bahasa pengguna tidak memiliki pesan. Kolom tag menentukan jenis pemindaian yang akan menampilkan pesan. Daftar custom_messages dapat memiliki nol atau beberapa entri, dengan tiap entri perlu memiliki pesan yang bukan kosong dan kolom tag. + + Kebijakan ini hanya dapat disetel dari <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="7246767840750730334">Izinkan pengaktifan notifikasi Phone Hub.</translation> <translation id="7249828445670652637">Mengaktifkan sertifikat CA <ph name="PRODUCT_OS_NAME" /> untuk aplikasi ARC</translation> <translation id="7252681704926980614">Kirimkan nama pengguna dan nama file ke server printer native beserta setiap pekerjaan cetak. Setelan defaultnya bukan untuk mengirim. @@ -4760,6 +4835,13 @@ <translation id="780629758750905699">Mengizinkan penambahan akun Family Link ke perangkat</translation> <translation id="7807139251387225825">Daftar jenis yang harus dikecualikan dari sinkronisasi</translation> <translation id="781268256210530471">Setelan plugin</translation> +<translation id="7814528532170362496">Kebijakan ini mengontrol pemeriksaan URL secara real time untuk mengidentifikasi URL yang tidak aman. + + Jika kebijakan ini tidak disetel atau disetel ke ‘Nonaktif’, pemeriksaan Safe Browsing default akan diterapkan. Pemeriksaan Safe Browsing default tetap dapat disertai pencarian real-time, bergantung pada nilai setelan "Jadikan penelusuran dan penjelajahan lebih baik" dan nilai kebijakan UrlKeyedAnonymizedDataCollectionEnabled. + + Jika kebijakan ini disetel ke ‘Aktif’, URL akan dikirimkan untuk dipindai secara real-time sesuai Persyaratan Layanan perusahaan. Ini akan membuat Chrome mengirimkan URL ke Google Cloud atau pihak ketiga pilihan Anda untuk memeriksa URL secara real-time. Pencarian real-time Safe Browsing versi default akan dinonaktifkan. + + Kebijakan ini hanya dapat disetel dari <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="7816326058023670173">Rahasia dibagikan antara perangkat anak dan orang tua.</translation> <translation id="7818131573217430250">Menyetel status default mode kontras tinggi di layar masuk</translation> <translation id="7823902813460802031">Jika kebijakan ini disetel ke Aktif, <ph name="PRODUCT_OS_NAME" /> akan menghentikan perangkat beralih ke mode Developer. @@ -5567,6 +5649,13 @@ Jika kebijakan disetel ke salah (false), upgrade otomatis akan dinonaktifkan untuk audio dan video, dan tidak ada peringatan yang akan ditampilkan untuk gambar. Kebijakan ini tidak memengaruhi jenis konten campuran selain audio, video, dan gambar. Kebijakan ini tidak akan berpengaruh lagi mulai <ph name="PRODUCT_NAME" /> 84.</translation> +<translation id="9009505213521705952">Jika <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> disetel ke Nonaktif, menyetel kebijakan akan memungkinkan Anda menetapkan daftar pola asal yang menentukan situs tempat pengguna dapat mengklik semua halaman peringatan yang ditampilkan <ph name="PRODUCT_NAME" /> saat pengguna membuka situs yang menampilkan error SSL. Pengguna tidak akan dapat mengklik halaman peringatan SSL di asal yang tidak ada di daftar ini. + + Jika <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> disetel ke Aktif atau tidak disetel, kebijakan ini tidak akan berpengaruh. + + Jika kebijakan tidak disetel, <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> akan berlaku untuk semua situs. + + Untuk informasi selengkapnya tentang pola input yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> bukanlah nilai yang diterima untuk kebijakan ini. Kebijakan ini hanya mencocokkan berdasarkan asal, sehingga jalur apa pun di pola URL akan diabaikan.</translation> <translation id="9010080992450148617">Mengaktifkan pengiriman download ke Google untuk pemindaian mendalam bagi pengguna yang terdaftar di Program Perlindungan Lanjutan</translation> <translation id="9013875414788074110">Selama proses login, <ph name="PRODUCT_OS_NAME" /> dapat melakukan autentikasi terhadap server (online) atau menggunakan sandi yang tersimpan di cache (offline).
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 39264db..e36f0771 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -454,6 +454,7 @@ Se il criterio viene impostato su Falso, gli utenti non possono aggiungere né configurare le proprie stampanti. Inoltre, non possono utilizzare nessuna delle stampanti precedentemente configurate. </translation> <translation id="1615221548356595305">Consenti la coalescenza di connessioni HTTP/2 per questi host anche quando sono in uso i certificati client</translation> +<translation id="1616280227447957376">Consenti di proseguire dalla pagina di avviso SSL su origini specifiche</translation> <translation id="1617235075406854669">Attiva eliminazione cronologia del browser e dei download</translation> <translation id="1620510694547887537">Fotocamera</translation> <translation id="1626379196197114720">Consenti uso della cache back-forward</translation> @@ -999,6 +1000,7 @@ Per il controllo ortografico può essere sempre usato un dizionario scaricato in locale, a meno che la funzionalità non sia disattivata nel criterio <ph name="SPELLCHECK_ENABLED_POLICY_NAME" />; in tal caso questo criterio non avrà effetto.</translation> <translation id="2433516903565257847">La percentuale del parco di dispositivi che dovrebbe essere aggiornata dopo i giorni indicati.</translation> <translation id="2435052056904485763">Lista consentita server di delega Kerberos</translation> +<translation id="2435232509335686514">Criterio di configurazione per la gestione dei file scaricati da parte del <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /></translation> <translation id="2448315169529769573">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_OS_NAME" /> segnala a Google metriche relative all'utilizzo e dati diagnostici, ad esempio rapporti sugli arresti anomali. Se il criterio viene impostato su Disattivato, la segnalazione di metriche e dati diagnostici viene disattivata. Se il criterio non viene configurato, la segnalazione di metriche e dati diagnostici rimane disattivata sui dispositivi non gestiti e attiva sui dispositivi gestiti.</translation> @@ -1241,6 +1243,15 @@ <translation id="2757054304033424106">Tipi di estensioni/app che possono essere installati</translation> <translation id="2759224876420453487">Controlla il comportamento dell'utente in una sessione profilo multiplo</translation> <translation id="2761483219396643566">Ritardo avviso inattività in caso di utilizzo della batteria</translation> +<translation id="2764165704281937018">Elenco di impostazioni da applicare al <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />, che si attiva quando viene scaricato un file. + + I campi <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MIME_TYPES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> vengono utilizzati per stabilire se il connettore deve inviare un file al fornitore di servizi quando il download viene effettuato da una pagina web. L'URL della pagina web deve corrispondere a un pattern associato a un pattern "enable" e non a un pattern "disable". Anche il tipo MIME del file deve corrispondere a un pattern associato a un pattern "enable" e non a un pattern "disable". + + Il campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica il fornitore di servizi di analisi a cui corrispondono le impostazioni. + + Il campo <ph name="ENTERPRISE_CONNECTOR_ENTERPRISE_ID_FIELD" /> identifica l'azienda con il fornitore di servizi. Quando all'utente viene chiesto di accedere durante la configurazione del <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />, sono consentiti soltanto gli account utente associati all'azienda in questione. + + Questo criterio può essere impostato soltanto dalla <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="2769952903507981510">Configura il nome di dominio richiesto per gli host di accesso remoto</translation> <translation id="2772955711376920612">Se il criterio viene impostato su Attivato e vengono impostati i criteri <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> e <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" />, la variazione dei picchi energetici rimane attiva, se supportata sul dispositivo. Il criterio di gestione della variazione dei picchi energetici è un criterio per il risparmio energetico che riduce al minimo l'utilizzo della corrente alternata durante i momenti di picco. Puoi impostare un orario di inizio e di fine della modalità di variazione dei picchi energetici per ogni giorno feriale. Se durante questi orari il livello della batteria rimane al di sopra della soglia specificata, il dispositivo usa la batteria (anche se è collegato alla corrente alternata). Dopo l'orario di fine specificato, il dispositivo usa la corrente alternata, se è collegato, ma non ricarica la batteria. Il dispositivo funzionerà di nuovo normalmente con la corrente alternata e ricaricherà la batteria dopo l'orario di inizio della ricarica specificato. @@ -1323,6 +1334,23 @@ Se il criterio viene impostato su Disattivato o se non viene configurato, i dispositivi registrati non segnalano informazioni sullo stato di Android.</translation> <translation id="288923520817177650">È consentita la creazione di sessioni <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> di <ph name="WEBXR_API_NAME_SHORT" /></translation> <translation id="2890645751406497668">Concede automaticamente a questi siti l'autorizzazione a connettersi a dispositivi USB usando gli ID fornitore e prodotto forniti.</translation> +<translation id="2892041629748346178">Elenco di impostazioni per i servizi di Chrome Enterprise Connectors da applicare al connettore di Enterprise <ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" />, che si attiva quando un file viene scaricato in Chrome. + + I campi <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> vengono utilizzati per stabilire se il connettore deve inviare un file per l'analisi quando viene scaricato da una pagina specifica e quali tag includere nella richiesta di analisi di tale file. Un tag che corrisponde a un pattern "enable" verrà incluso nella richiesta di analisi se l'URL della pagina corrisponde a un pattern associato a tale tag, purché nessun pattern "disable" con lo stesso tag corrisponda all'URL della pagina. L'analisi viene eseguita se almeno un tag deve essere incluso nella richiesta. + + Il campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica il fornitore di servizi di analisi a cui corrispondono le impostazioni. + + Se il campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> viene impostato su 1, Chrome attende di ricevere una risposta dal servizio di analisi prima di concedere l'accesso all'utente al file scaricato. Con qualsiasi altro valore intero, Chrome concede all'utente l'accesso al file immediatamente. + + Il campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> consente di stabilire se Chrome blocca o autorizza i file protetti tramite password. + + Il campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> consente di stabilire se Chrome blocca o autorizza i file troppo grandi per essere analizzati (oltre i 50 MB). + + Il campo <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> viene utilizzato per determinare per quali tag il connettore deve richiedere all'utente di inserire una giustificazione per ignorare una scansione che risulti in un avviso ignorabile. Se il campo non viene configurato, si presume che non sia richiesta alcuna giustificazione. + + I campi <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> vengono utilizzati per configurare un messaggio da mostrare all'utente quando viene visualizzato un avviso dopo una scansione che ha rilevato dei problemi. Il campo del messaggio contiene il testo da mostrare all'utente e può includere al massimo 200 caratteri. Il campo learn_more_url contiene un URL fornito dall'amministratore su cui l'utente potrà fare clic per ricevere maggiori informazioni fornite dal cliente sul motivo per cui l'azione è stata bloccata. Il campo della lingua è facoltativo e contiene la lingua in cui è scritto il messaggio. Il campo della lingua vuoto o con il valore "default" indica il messaggio da utilizzare se la lingua dell'utente non ne ha uno. Il campo dei tag consente di specificare per quale tipo di scansioni viene visualizzato il messaggio. L'elenco custom_messages può avere alcune voci o nessuna, dove per ognuna di queste i campi del messaggio e dei tag non devono essere vuoti. + + Questo criterio può essere impostato soltanto dalla <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="2893546967669465276">Consente di inviare log di sistema al server di gestione</translation> <translation id="2899002520262095963">Le app Android possono utilizzare le configurazioni di rete e i certificati CA impostati tramite questa norma ma non hanno accesso ad alcune opzioni di configurazione.</translation> <translation id="2899213072616346687">Consente di limitare la modalità di stampa delle immagini di sfondo. Se il criterio non viene impostato non vengono applicate limitazioni.</translation> @@ -1725,6 +1753,21 @@ <translation id="3412937883532015092">Se per il criterio viene impostato un numero, <ph name="PRODUCT_NAME" /> mostra un messaggio relativo al numero di millisecondi impostato, quindi apre un browser alternativo. Se il criterio non viene impostato o viene impostato su 0 e si passa a un URL definito, l'URL viene aperto subito in un browser alternativo.</translation> +<translation id="3413215487296688603">Elenco di impostazioni per i servizi di Chrome Enterprise Connectors da applicare al connettore di Enterprise <ph name="ON_BULK_DATA_ENTRY_ENTERPRISE_CONNECTOR" />, che si attiva quando vengono inseriti dati in Chrome dagli appunti o tramite trascinamento di contenuti web. + + I campi <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> vengono utilizzati per stabilire se il connettore deve inviare dati per l'analisi quando vengono inseriti in una pagina specifica e quali tag includere nella richiesta di analisi di tali dati. Un tag che corrisponde a un pattern "enable" verrà incluso nella richiesta di analisi se l'URL della pagina corrisponde a un pattern associato a tale tag, purché nessun pattern "disable" con lo stesso tag corrisponda all'URL della pagina. L'analisi viene eseguita se almeno un tag deve essere incluso nella richiesta. + + Il campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica il fornitore di servizi di analisi a cui corrispondono le impostazioni. + + Se il campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> viene impostato su 1, Chrome attende di ricevere una risposta dal servizio di analisi prima di concedere alla pagina l'accesso ai dati. Con qualsiasi altro valore intero, Chrome concede immediatamente alla pagina l'accesso ai dati. + + Il campo <ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" /> indica le dimensioni minime (in byte) che devono avere i dati inseriti in Chrome per poter essere analizzati. Se il campo non viene impostato, il valore predefinito è 100 byte. + + Il campo <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> viene utilizzato per determinare per quali tag il connettore deve richiedere all'utente di inserire una giustificazione per ignorare una scansione che risulti in un avviso ignorabile. Se il campo non viene configurato, si presume che non sia richiesta alcuna giustificazione. + + I campi <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> vengono utilizzati per configurare un messaggio da mostrare all'utente quando viene visualizzato un avviso dopo una scansione che ha rilevato dei problemi. Il campo del messaggio contiene il testo da mostrare all'utente e può includere al massimo 200 caratteri. Il campo learn_more_url contiene un URL fornito dall'amministratore su cui l'utente potrà fare clic per ricevere maggiori informazioni fornite dal cliente sul motivo per cui l'azione è stata bloccata. Il campo della lingua è facoltativo e contiene la lingua in cui è scritto il messaggio. Il campo della lingua vuoto o con il valore "default" indica il messaggio da utilizzare se la lingua dell'utente non ne ha uno. Il campo dei tag consente di specificare per quale tipo di scansioni viene visualizzato il messaggio. L'elenco custom_messages può avere alcune voci o nessuna, dove per ognuna di queste i campi del messaggio e dei tag non devono essere vuoti. + + Questo criterio può essere impostato soltanto dalla <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="3415954062311826850">Il criterio non è supportato in Arc.</translation> <translation id="34160070798637152">Consente di controllare la configurazione di rete a livello di dispositivo.</translation> <translation id="3417130629744653218">Consenti ai siti web di chiedere se esistono metodi di pagamento disponibili</translation> @@ -2349,6 +2392,11 @@ <translation id="4377599627073874279">Consenti la visualizzazione di tutte le immagini in tutti i siti</translation> <translation id="437791893267799639">Norma non impostata. Non consentire migrazione dei dati e ARC</translation> <translation id="4382413175336720282">Controllo degli URL in tempo reale disattivato.</translation> +<translation id="4387741272680827493">La configurazione del criterio consente di specificare un elenco di nomi host che ignorano gli upgrade HSTS precaricati da http a https. + + In questo criterio sono consentiti soltanto i nomi host con etichetta singola e questo criterio si applica soltanto alle voci HSTS precaricate "statiche" (ad esempio <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />). Questo criterio non impedisce gli upgrade HSTS per i server che hanno richiesto "in modo dinamico" tali upgrade usando un'intestazione della risposta <ph name="HSTS_HEADER_NAME" />. + + I nomi host indicati devono essere canonicalizzati: ogni IDN deve essere convertito nel relativo formato A-label e tutte le lettere ASCII devono essere minuscole. Questo criterio viene applicato soltanto ai nomi host con etichetta singola specificati e non ai relativi sottodomini.</translation> <translation id="4387922553629365459">Se il criterio viene configurato, puoi impostare un elenco di pattern URL che specificano i siti che non possono aprire popup. Se il criterio non viene configurato, <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente. @@ -2965,6 +3013,11 @@ * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />, vengono utilizzati i campi <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" /> e <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. Nota: per esempi più approfonditi, consulta la pagina The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation> +<translation id="5266173014392157048">Questo criterio è deprecato. Utilizza il criterio "<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />". + + La configurazione del criterio consente di assegnare i server a cui <ph name="PRODUCT_NAME" /> può delegare le credenziali utente. Separa i nomi dei server con le virgole. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. + + Se il criterio non viene configurato, <ph name="PRODUCT_NAME" /> non delega le credenziali utente, anche se un server viene rilevato come Intranet.</translation> <translation id="5273744932022326215">Consente di attivare la funzione di accessibilità di evidenziazione del cursore nella schermata di accesso. Se questo criterio è impostato su true, l'evidenziazione del cursore sarà sempre attivata sulla schermata di accesso. @@ -3496,6 +3549,11 @@ Se viene impostato su Disattivato, gli utenti non possono riscattare tali offerte.</translation> <translation id="6048199181629830227">Attiva la gestione della variazione dei picchi energetici</translation> <translation id="6053681087509103368">Consenti a WebRTC di usare versioni obsolete del protocollo TLS/DTLS</translation> +<translation id="605543517695935623">Elenco di impostazioni per i servizi di Chrome Enterprise Connectors da applicare al connettore di Enterprise <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" />, che si attiva quando si verifica un evento di sicurezza in Chrome. Sono inclusi risultati negativi dei connettori di Enterprise di analisi, riutilizzo delle password, visite di pagine non sicure e altre azioni dell'utente critiche dal punto di vista della sicurezza. + + Il campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica il fornitore di servizi di rapporto a cui corrispondono le impostazioni, mentre il campo <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> identifica quali eventi sono attivati per questo fornitore. + + Questo criterio può essere impostato soltanto dalla <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="6058879286588763839">A meno che <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> non venga specificato, sovrascrivendo <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />, la configurazione di <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> consente di specificare il criterio di gestione della modalità di ricarica della batteria (se supportato dal dispositivo). Per estendere la durata della batteria, il criterio controlla dinamicamente la ricarica della batteria riducendo al minimo l'usura e preservandone l'efficienza. Se il criterio non viene configurato (se l'impostazione è supportata dal dispositivo), viene applicata la modalità di ricarica standard della batteria e gli utenti non possono modificarlo. @@ -4380,6 +4438,23 @@ Se questa norma non viene impostata o viene lasciata vuota, l'utente potrà impostare qualsiasi Account Google come account principale del browser in <ph name="PRODUCT_NAME" />.</translation> <translation id="723103540848640830">Imposta la lunghezza minima del PIN per la schermata di blocco</translation> <translation id="7234280155140786597">Nomi degli host di messaggi nativi vietati (o * per indicarli tutti)</translation> +<translation id="72369543045636739">Elenco di impostazioni per i servizi di Chrome Enterprise Connectors da applicare al connettore di Enterprise <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" />, che si attiva quando un file viene allegato a Chrome. + + I campi <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> vengono utilizzati per stabilire se il connettore deve inviare un file per l'analisi quando viene allegato a una pagina specifica e quali tag includere nella richiesta di analisi di tale file. Un tag che corrisponde a un pattern "enable" verrà incluso nella richiesta di analisi se l'URL della pagina corrisponde a un pattern associato a tale tag, purché nessun pattern "disable" con lo stesso tag corrisponda all'URL della pagina. L'analisi viene eseguita se almeno un tag deve essere incluso nella richiesta. + + Il campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica il fornitore di servizi di analisi a cui corrispondono le impostazioni. + + Se il campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> viene impostato su 1, Chrome attende di ricevere una risposta dal servizio di analisi prima di concedere alla pagina l'accesso al file. Con qualsiasi altro valore intero, Chrome concede immediatamente alla pagina l'accesso ai dati. + + Il campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> consente di stabilire se Chrome blocca o autorizza i file protetti tramite password. + + Il campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> consente di stabilire se Chrome blocca o autorizza i file troppo grandi per essere analizzati (oltre i 50 MB). + + Il campo <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> viene utilizzato per determinare per quali tag il connettore deve richiedere all'utente di inserire una giustificazione per ignorare una scansione che risulti in un avviso ignorabile. Se il campo non viene configurato, si presume che non sia richiesta alcuna giustificazione. + + I campi <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> vengono utilizzati per configurare un messaggio da mostrare all'utente quando viene visualizzato un avviso dopo una scansione che ha rilevato dei problemi. Il campo del messaggio contiene il testo da mostrare all'utente e può includere al massimo 200 caratteri. Il campo learn_more_url contiene un URL fornito dall'amministratore su cui l'utente potrà fare clic per ricevere maggiori informazioni fornite dal cliente sul motivo per cui l'azione è stata bloccata. Il campo della lingua è facoltativo e contiene la lingua in cui è scritto il messaggio. Il campo della lingua vuoto o con il valore "default" indica il messaggio da utilizzare se la lingua dell'utente non ne ha uno. Il campo dei tag consente di specificare per quale tipo di scansioni viene visualizzato il messaggio. L'elenco custom_messages può avere alcune voci o nessuna, dove per ognuna di queste i campi del messaggio e dei tag non devono essere vuoti. + + Questo criterio può essere impostato soltanto dalla <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="7246767840750730334">Consenti l'attivazione delle notifiche Phone Hub</translation> <translation id="7249828445670652637">Attiva i certificati CA <ph name="PRODUCT_OS_NAME" /> per le app ARC</translation> <translation id="7252681704926980614">Invia nome utente e nome file al server delle stampanti native per ogni processo di stampa. L'impostazione predefinita non prevede l'invio. @@ -4752,6 +4827,13 @@ <translation id="780629758750905699">Consenti l'aggiunta di account Family Link al dispositivo</translation> <translation id="7807139251387225825">Elenco di tipi di dati che dovrebbero essere esclusi dalla sincronizzazione</translation> <translation id="781268256210530471">Impostazioni plug-in</translation> +<translation id="7814528532170362496">Questo criterio consente di stabilire il controllo degli URL in tempo reale per identificare gli URL non sicuri. + + Se questo criterio non viene configurato o se viene impostato su "Disattivato", verranno applicati i controlli consumer di Navigazione sicura. I controlli consumer di Navigazione sicura possono comunque includere ricerche in tempo reale, a seconda del valore dell'impostazione "Migliora le ricerche e le attività di navigazione" e del valore del criterio UrlKeyedAnonymizedDataCollectionEnabled. + + Se questo criterio viene impostato su "Attivato", gli URL verranno inviati per l'analisi in tempo reale in base ai TdS di Chrome Enterprise. Chrome invierà gli URL a Google Cloud o alle terze parti scelte da te per controllarli in tempo reale. La versione consumer della ricerca in tempo reale di Navigazione sicura verrà disattivata. + + Questo criterio può essere impostato soltanto dalla <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="7816326058023670173">Stesso secret per dispositivi di figli e genitori.</translation> <translation id="7818131573217430250">Impostazione stato predefinito modalità ad alto contrasto nella schermata di accesso</translation> <translation id="7823902813460802031">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_OS_NAME" /> impedisce al dispositivo di avviare la modalità sviluppatore. @@ -5558,6 +5640,13 @@ Se il criterio viene impostato su false, vengono disattivati gli upgrade automatici di audio e video e non viene mostrato un avviso per le immagini. Questo criterio non influisce su tipi di contenuti misti diversi da audio, video e immagini. Questo criterio non avrà più effetto dalla versione 84 di <ph name="PRODUCT_NAME" />.</translation> +<translation id="9009505213521705952">Se il criterio <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> è impostato su Disattivato, la configurazione di questo criterio ti consente di impostare un elenco di pattern di origini che specificano i siti in cui gli utenti possono fare clic nelle pagine di avviso mostrate in <ph name="PRODUCT_NAME" /> quando visitano siti che presentano errori SSL. Gli utenti non potranno fare clic nelle pagine di avviso SSL su origini non presenti in questo elenco. + + Se il criterio <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> è impostato su Attivato o se non è configurato, questo criterio non ha effetto. + + Se il criterio non viene configurato, <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> si applica per tutti i siti. + + Per informazioni dettagliate sui pattern di input validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio. Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato.</translation> <translation id="9010080992450148617">Attiva invio download a Google per scansione approfondita per utenti iscritti al programma di protezione avanzata</translation> <translation id="9013875414788074110">Durante l'accesso, <ph name="PRODUCT_OS_NAME" /> può eseguire l'autenticazione con un server (online) o utilizzando una password memorizzata nella cache (offline).
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index f05a75eb..84f90db 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -454,6 +454,7 @@ 이 정책이 False로 설정되어 있으면 사용자가 자체 프린터를 추가하고 구성할 수 없으며 이전에 구성된 기본 프린터로 인쇄할 수도 없게 됩니다. </translation> <translation id="1615221548356595305">클라이언트 인증서가 사용되는 경우에도 이러한 호스트에 HTTP/2 연결 병합 허용</translation> +<translation id="1616280227447957376">특정 출처의 SSL 경고 페이지 클릭 연결 허용</translation> <translation id="1617235075406854669">브라우저 및 다운로드 기록을 삭제하도록 설정합니다.</translation> <translation id="1620510694547887537">카메라</translation> <translation id="1626379196197114720">뒤로-앞으로 캐시 사용 허용</translation> @@ -1004,6 +1005,7 @@ 맞춤법 검사 기능이 <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> 정책에 의해 사용 중지되어 정책 적용이 중단되지 않는 한 맞춤법 검사에서는 다운로드된 사전을 로컬에서 사용할 수 있습니다.</translation> <translation id="2433516903565257847">지정된 기간 후 업데이트되어야 하는 기기 비율입니다.</translation> <translation id="2435052056904485763">Kerberos 위임 서버 허용 목록</translation> +<translation id="2435232509335686514"><ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />의 다운로드한 파일 처리를 위한 구성 정책</translation> <translation id="2448315169529769573">정책을 사용 설정하면 <ph name="PRODUCT_OS_NAME" />에서 비정상 종료 보고서 등 사용 측정항목과 진단 데이터를 Google에 보고합니다. 정책을 사용 중지하면 측정항목 및 진단 데이터 보고가 사용 중지됩니다. 정책을 설정하지 않으면 관리되지 않는 기기에서는 측정항목 및 진단 데이터 보고가 사용 중지되고 관리되는 기기에서는 사용 설정됩니다.</translation> @@ -1246,6 +1248,15 @@ <translation id="2757054304033424106">설치가 허용된 확장 프로그램/앱 유형</translation> <translation id="2759224876420453487">멀티 프로필 세션에서 사용자 활동 제어</translation> <translation id="2761483219396643566">배터리 전원으로 실행할 때 유휴 경고 지연</translation> +<translation id="2764165704281937018"><ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />에 적용할 설정의 목록으로, 파일이 다운로드될 때 실행됩니다. + + <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MIME_TYPES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> 필드는 커넥터가 파일을 웹페이지에서 다운로드할 때 서비스 제공업체로 전송할지 결정하는 데 사용됩니다. 웹페이지 URL은 'disable' 패턴에 연결되지 않고 'enable' 패턴에 연결된 패턴과 일치해야 합니다. 파일의 MIME 유형도 'disable' 패턴에 연결되지 않고 'enable' 패턴에 연결된 패턴과 일치해야 합니다. + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 필드는 설정이 해당하는 분석 서비스 제공업체를 나타냅니다. + + <ph name="ENTERPRISE_CONNECTOR_ENTERPRISE_ID_FIELD" /> 필드는 이 서비스 제공업체를 이용하는 기업을 나타냅니다. 사용자가 <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> 설정 중 로그인하라는 요청을 받을 경우 이 기업과 연결된 사용자 계정만 사용할 수 있습니다. + + 이 정책은 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />에서만 설정할 수 있습니다.</translation> <translation id="2769952903507981510">원격 액세스 호스트에 대한 필수 도메인 이름 구성</translation> <translation id="2772955711376920612">정책을 사용 설정하고 <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> 및 <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" />를 설정하면 기기에서 지원하는 경우 전원 피크 시프트가 사용 설정된 상태로 유지됩니다. 피크 시프트 전원 관리 정책은 사용량이 가장 많은 시간에 교류 전원 사용을 최소화하는 절전 정책입니다. 매주 평일 전원 피크 시프트 모드를 실행할 시작 시간과 종료 시간을 설정할 수 있습니다. 배터리가 지정된 기준점 이상인 한, 사용량이 가장 많은 시간에는 교류 전원이 연결되어 있더라도 기기가 배터리로 실행됩니다. 지정된 종료 시간이 지나면 교류 전원이 연결되어 있는 경우 기기가 교류 전원으로 실행되지만 배터리가 충전되지는 않습니다. 지정된 충전 시작 시간이 되면 기기가 다시 교류 전원을 사용하여 평소대로 작동하며 배터리가 충전됩니다. @@ -1328,6 +1339,23 @@ 정책을 사용 중지하거나 설정하지 않으면 등록된 기기에서 Android 상태 정보를 보고하지 않습니다.</translation> <translation id="288923520817177650"><ph name="WEBXR_API_NAME_SHORT" />의 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> 세션 생성 허용</translation> <translation id="2890645751406497668">다음 사이트가 주어진 공급업체 및 제품 ID를 사용해 USB 기기에 연결할 수 있는 권한을 자동으로 부여합니다.</translation> +<translation id="2892041629748346178"><ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" /> Enterprise 커넥터에 적용할 Chrome Enterprise 커넥터 서비스 설정의 목록으로, 파일이 Chrome에서 다운로드될 때 실행됩니다. + + <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> 필드는 파일이 특정 페이지에서 다운로드되었을 때 커넥터가 분석을 위해 파일을 전송할지와 파일 분석 요청에 어떤 태그를 포함할지 결정하는 데 사용됩니다. 페이지 URL이 특정 태그와 연결된 패턴과 일치하면 'enable' 패턴에 해당하는 태그가 분석 요청에 포함되지만, 이 태그의 'disable' 패턴 중에서 페이지 URL과 일치하는 것이 없어야 합니다. 하나 이상의 태그가 요청에 포함되면 분석이 실시됩니다. + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 필드는 설정이 해당하는 분석 서비스 제공업체를 나타냅니다. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> 필드가 1로 설정되면 Chrome에서 사용자에게 다운로드된 파일 액세스 권한을 부여하기 전에 분석 서비스의 응답을 받을 때까지 대기합니다. 다른 정숫값으로 설정되면 Chrome에서 사용자에게 파일 액세스 권한을 즉시 부여합니다. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> 필드는 Chrome에서 비밀번호로 보호된 파일을 차단 또는 허용할지 결정합니다. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> 필드는 Chrome에서 크기가 커서 분석하기 어려운 파일(50MB 이상)을 차단 또는 허용할지 결정합니다. + + <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> 필드는 사용자가 우회 가능 경고가 표시되는 스캔을 우회하려면 커넥터에서 근거를 입력해야 하는 태그를 결정하는 데 사용됩니다. 필드를 설정하지 않으면 근거가 필요하지 않은 것으로 간주합니다. + + <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> 및 <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> 필드는 스캔 시 부정적인 평가가 있어 경고가 표시될 경우 사용자에게 표시할 메시지를 구성하는 데 사용됩니다. message 필드에는 사용자에게 표시하는 텍스트가 포함되며 최대 200자까지 포함할 수 있습니다. learn_more_url 필드에는 관리자가 제공한 URL이 포함됩니다. 사용자는 이 URL을 클릭하여 작업이 차단된 이유에 관해 고객이 제공한 정보를 자세히 확인할 수 있습니다. language 필드는 선택사항이며 여기에는 메시지의 언어가 포함됩니다. language 필드가 비어 있거나 값이 'default'이면 사용자의 언어로는 메시지가 없는 경우에 사용될 메시지를 나타냅니다. tag 필드는 메시지가 표시될 스캔 유형을 지정합니다. custom_messages 목록에는 0개 이상의 항목이 포함될 수 있으며, 각 항목에는 비어 있지 않은 message 필드와 tag 필드가 있어야 합니다. + + 이 정책은 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />에서만 설정할 수 있습니다.</translation> <translation id="2893546967669465276">시스템 로그를 관리 서버로 전송합니다.</translation> <translation id="2899002520262095963">Android 앱은 이 정책을 통해 설정된 네트워크 구성 및 CA 인증서를 사용할 수 있지만 일부 구성 옵션에는 액세스할 권한이 없습니다.</translation> <translation id="2899213072616346687">배경 그래픽 인쇄 모드를 제한합니다. 정책이 설정되지 않으면 제한이 없는 것으로 간주됩니다.</translation> @@ -1729,6 +1757,21 @@ <translation id="3412937883532015092">이 정책을 숫자로 설정하면 <ph name="PRODUCT_NAME" />에 숫자만큼의 밀리초 동안 메시지가 표시된 후 대체 브라우저가 실행됩니다. 정책을 설정하지 않거나 0으로 설정하면 지정된 URL로 이동하는 즉시 대체 브라우저가 실행됩니다.</translation> +<translation id="3413215487296688603"><ph name="ON_BULK_DATA_ENTRY_ENTERPRISE_CONNECTOR" /> Enterprise 커넥터에 적용할 Chrome Enterprise 커넥터 서비스 설정의 목록으로, 클립보드에서 붙여넣거나 웹 콘텐츠를 드래그 앤 드롭하는 방법으로 Chrome에 데이터가 입력될 때 실행됩니다. + + <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> 필드는 데이터가 특정 페이지에서 입력되었을 때 커넥터가 분석을 위해 데이터를 전송할지와 데이터 분석 요청에 어떤 태그를 포함할지 결정하는 데 사용됩니다. 페이지 URL이 특정 태그와 연결된 패턴과 일치하면 'enable' 패턴에 해당하는 태그가 분석 요청에 포함되지만, 이 태그의 'disable' 패턴 중에서 페이지 URL과 일치하는 것이 없어야 합니다. 하나 이상의 태그가 요청에 포함되면 분석이 실시됩니다. + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 필드는 설정이 해당하는 분석 서비스 제공업체를 나타냅니다. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> 필드가 1로 설정되면 Chrome에서 페이지에 데이터 액세스 권한을 부여하기 전에 분석 서비스의 응답을 받을 때까지 대기합니다. 다른 정숫값으로 설정되면 Chrome에서 페이지에 데이터 액세스 권한을 즉시 부여합니다. + + <ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" /> 필드는 Chrome에 입력되는 데이터의 최소 크기(바이트)로, 스캔하기 위해서는 데이터 크기가 이보다 크거나 같아야 합니다. 필드가 설정되지 않을 경우 기본값은 100바이트입니다. + + <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> 필드는 사용자가 우회 가능 경고가 표시되는 스캔을 우회하려면 커넥터에서 근거를 입력해야 하는 태그를 결정하는 데 사용됩니다. 필드를 설정하지 않으면 근거가 필요하지 않은 것으로 간주합니다. + + <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> 및 <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> 필드는 스캔 시 부정적인 평가가 있어 경고가 표시될 경우 사용자에게 표시할 메시지를 구성하는 데 사용됩니다. message 필드에는 사용자에게 표시하는 텍스트가 포함되며 최대 200자까지 포함할 수 있습니다. learn_more_url 필드에는 관리자가 제공한 URL이 포함됩니다. 사용자는 이 URL을 클릭하여 작업이 차단된 이유에 관해 고객이 제공한 정보를 자세히 확인할 수 있습니다. language 필드는 선택사항이며 여기에는 메시지의 언어가 포함됩니다. language 필드가 비어 있거나 값이 'default'이면 사용자의 언어로는 메시지가 없는 경우에 사용될 메시지를 나타냅니다. tag 필드는 메시지가 표시될 스캔 유형을 지정합니다. custom_messages 목록에는 0개 이상의 항목이 포함될 수 있으며, 각 항목에는 비어 있지 않은 message 필드와 tag 필드가 있어야 합니다. + + 이 정책은 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />에서만 설정할 수 있습니다.</translation> <translation id="3415954062311826850">ARC 내에서 지원되지 않는 정책입니다.</translation> <translation id="34160070798637152">기기 전체 네트워크 구성을 제어합니다.</translation> <translation id="3417130629744653218">웹사이트가 사용 가능한 결제 수단을 쿼리하도록 허용</translation> @@ -2354,6 +2397,11 @@ <translation id="4377599627073874279">모든 사이트에서 모든 이미지를 표시하도록 허용</translation> <translation id="437791893267799639">정책이 설정되지 않음, 데이터 이전 및 ARC 허용 안함</translation> <translation id="4382413175336720282">실시간 URL 확인이 사용 중지되었습니다.</translation> +<translation id="4387741272680827493">정책을 설정하면 미리 로드된 HSTS를 http에서 https로 업그레이드하지 않도록 우회할 호스트 이름의 목록이 지정됩니다. + + 단일 라벨 호스트 이름만 허용되는 이 정책은 HST가 미리 로드된 '정적' 항목(예: <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />)에만 적용됩니다. 정책은 <ph name="HSTS_HEADER_NAME" /> 응답 헤더를 사용하여 HSTS 업그레이드를 '동적으로' 요청한 서버의 HSTS 업그레이드를 막지 않습니다. + + 제공된 호스트 이름은 표준화되어야 합니다. 모든 IDN은 A 라벨 형식으로 변환되어야 하며 모든 ASCII 문자는 소문자여야 합니다. 정책은 지정된 특정 단일 라벨 호스트 이름에만 적용되며 지정된 이름의 하위 도메인에는 적용되지 않습니다.</translation> <translation id="4387922553629365459">정책을 설정하면 팝업 열기가 불가능한 사이트를 지정하는 URL 패턴 목록을 설정할 수 있습니다. 정책을 설정하지 않았을 때 <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" />이 설정되어 있으면 모든 사이트에 적용되며 설정되어 있지 않다면 사용자의 개인 설정이 적용됩니다. @@ -2972,6 +3020,11 @@ * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> 값을 선택하면 <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" /> 및 <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> 필드가 사용됩니다. 참고: 자세한 예시를 보려면 Chromium 프로젝트(https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett)를 참고하세요.</translation> +<translation id="5266173014392157048">이 정책은 지원 중단되었으므로 ‘<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />’ 정책을 대신 사용하세요. + + 정책을 설정하면 <ph name="PRODUCT_NAME" />이 사용자 인증 정보를 위임할 수 있는 서버가 할당됩니다. 서로 다른 서버 이름은 쉼표로 구분합니다. 와일드 카드(<ph name="WILDCARD_VALUE" />)를 사용할 수 있습니다. + + 정책을 설정하지 않으면 서버가 인트라넷으로 감지되더라도 <ph name="PRODUCT_NAME" />에서 사용자 인증 정보를 위임하지 않습니다.</translation> <translation id="5273744932022326215">로그인 화면에서 커서 강조표시 접근성 기능을 사용합니다. 이 정책이 True로 설정되면 로그인 화면에서 커서 강조표시가 항상 사용됩니다. @@ -3503,6 +3556,11 @@ 정책을 사용 중지하면 사용자가 쿠폰을 사용할 수 없습니다.</translation> <translation id="6048199181629830227">피크 시프트 전력 관리 사용</translation> <translation id="6053681087509103368">WebRTC에서 지원 중단된 버전의 TLD/DTLS 프로토콜을 사용하도록 허용</translation> +<translation id="605543517695935623"><ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> Enterprise 커넥터에 적용할 Chrome Enterprise 커넥터 서비스 설정의 목록으로, Chrome에서 보안 관련 활동이 발생할 때 실행됩니다. 보안 관련 활동에는 분석 유형의 Enterprise 커넥터에 의한 부정적인 평가, 비밀번호 재사용, 안전하지 않은 페이지 탐색 및 보안에 민감한 다른 사용자 작업이 포함됩니다. + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 필드는 설정이 해당하는 보고 서비스 제공업체를 나타내며 <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> 필드는 이 제공업체를 대상으로 사용 설정되는 이벤트를 지정합니다. + + 이 정책은 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />에서만 설정할 수 있습니다.</translation> <translation id="6058879286588763839"><ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />보다 우선 적용되는 <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" />를 지정하지 않는 한 <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />에서 배터리 충전 모드 전원 관리 정책을 지정합니다(기기에서 지원되는 경우). 배터리 수명을 연장하기 위해 정책에서 스트레스와 소모를 최소화하여 동적으로 배터리 충전을 제어합니다. 정책을 설정하지 않으면(기기에서 지원되는 경우) 표준 배터리 충전 모드가 적용되며 사용자가 이를 변경할 수 없습니다. @@ -4387,6 +4445,23 @@ 이 정책이 설정되지 않거나 공백으로 남아 있으면 사용자가 <ph name="PRODUCT_NAME" />에서 어떤 Google 계정이든 브라우저 기본 계정으로 설정할 수 있습니다.</translation> <translation id="723103540848640830">잠금 화면 PIN 최소 길이 설정</translation> <translation id="7234280155140786597">차단된 기본 메시지 호스트의 이름(모두 차단하려면 * 값 적용)</translation> +<translation id="72369543045636739"><ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" /> Enterprise 커넥터에 적용할 Chrome Enterprise 커넥터 서비스 설정의 목록으로, 파일이 Chrome에 첨부될 때 실행됩니다. + + <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> 필드는 파일이 특정 페이지에 첨부되었을 때 커넥터가 분석을 위해 파일을 전송할지와 파일 분석 요청에 어떤 태그를 포함할지 결정하는 데 사용됩니다. 페이지 URL이 특정 태그와 연결된 패턴과 일치하면 'enable' 패턴에 해당하는 태그가 분석 요청에 포함되지만, 이 태그의 'disable' 패턴 중에서 페이지 URL과 일치하는 것이 없어야 합니다. 하나 이상의 태그가 요청에 포함되면 분석이 실시됩니다. + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 필드는 설정이 해당하는 분석 서비스 제공업체를 나타냅니다. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> 필드가 1로 설정되면 Chrome에서 페이지에 파일 액세스 권한을 부여하기 전에 분석 서비스의 응답을 받을 때까지 대기합니다. 다른 정숫값으로 설정되면 Chrome에서 페이지에 파일 액세스 권한을 즉시 부여합니다. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> 필드는 Chrome에서 비밀번호로 보호된 파일을 차단 또는 허용할지 결정합니다. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> 필드는 Chrome에서 크기가 커서 분석하기 어려운 파일(50MB 이상)을 차단 또는 허용할지 결정합니다. + + <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> 필드는 사용자가 우회 가능 경고가 표시되는 스캔을 우회하려면 커넥터에서 근거를 입력해야 하는 태그를 결정하는 데 사용됩니다. 필드를 설정하지 않으면 근거가 필요하지 않은 것으로 간주합니다. + + <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> 및 <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> 필드는 스캔 시 부정적인 평가가 있어 경고가 표시될 경우 사용자에게 표시할 메시지를 구성하는 데 사용됩니다. message 필드에는 사용자에게 표시하는 텍스트가 포함되며 최대 200자까지 포함할 수 있습니다. learn_more_url 필드에는 관리자가 제공한 URL이 포함됩니다. 사용자는 이 URL을 클릭하여 작업이 차단된 이유에 관해 고객이 제공한 정보를 자세히 확인할 수 있습니다. language 필드는 선택사항이며 여기에는 메시지의 언어가 포함됩니다. language 필드가 비어 있거나 값이 'default'이면 사용자의 언어로는 메시지가 없는 경우에 사용될 메시지를 나타냅니다. tag 필드는 메시지가 표시될 스캔 유형을 지정합니다. custom_messages 목록에는 0개 이상의 항목이 포함될 수 있으며, 각 항목에는 비어 있지 않은 message 필드와 tag 필드가 있어야 합니다. + + 이 정책은 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />에서만 설정할 수 있습니다.</translation> <translation id="7246767840750730334">휴대전화 허브 알림을 켤 수 있게 합니다.</translation> <translation id="7249828445670652637">ARC 앱에서 <ph name="PRODUCT_OS_NAME" /> CA 인증서를 사용하도록 설정</translation> <translation id="7252681704926980614">모든 인쇄 작업에서 사용자 이름과 파일 이름을 기본 프린터 서버로 보냅니다. 보내지 않도록 기본 설정되어 있습니다. @@ -4760,6 +4835,13 @@ <translation id="780629758750905699">기기에 Family Link 계정 추가 허용</translation> <translation id="7807139251387225825">동기화에서 제외되어야 하는 유형 목록</translation> <translation id="781268256210530471">플러그인 설정</translation> +<translation id="7814528532170362496">이 정책은 안전하지 않은 URL을 파악할 수 있는 실시간 URL 확인을 제어합니다. + + 정책을 설정하지 않거나 '사용 중지됨'으로 설정하면 일반 세이프 브라우징 확인이 적용됩니다. '검색 및 탐색 기능 개선' 설정값과 UrlKeyedAnonymizedDataCollectionEnabled 정책값에 따라 일반 세이프 브라우징 확인에는 실시간 검색이 계속해서 포함될 수 있습니다. + + 정책을 '사용 설정됨'으로 설정하면 URL이 전송되어 기업 서비스 약관에 따라 실시간으로 검사됩니다. 결국 실시간 확인을 위해 Chrome에서 URL을 Google Cloud 또는 선택한 타사로 전송하게 됩니다. 일반 버전의 세이프 브라우징 실시간 검색이 꺼집니다. + + 이 정책은 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />에서만 설정할 수 있습니다.</translation> <translation id="7816326058023670173">자녀와 부모 기기 간에 공유된 보안 비밀입니다.</translation> <translation id="7818131573217430250">로그인 화면에서 고대비 모드의 기본 상태를 설정</translation> <translation id="7823902813460802031">이 정책을 사용으로 설정하면 <ph name="PRODUCT_OS_NAME" />에서 기기가 개발자 모드로 전환되지 못하게 합니다. @@ -5595,6 +5677,13 @@ false로 설정되면 오디오 및 동영상의 자동 업그레이드가 사용 중지되며 이미지에도 경고가 표시되지 않습니다. 이 정책은 오디오, 동영상, 이미지가 아닌 다른 유형의 혼합 콘텐츠에 영향을 주지 않습니다. 또한 <ph name="PRODUCT_NAME" /> 84부터 더 이상 효력이 없습니다.</translation> +<translation id="9009505213521705952"><ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" />가 사용 중지된 경우 정책을 설정하면, 사용자가 SSL 오류가 있는 사이트로 이동할 때 <ph name="PRODUCT_NAME" />에 표시되는 경고 페이지를 클릭하여 연결 가능한 사이트를 지정하는 출처 패턴의 목록을 설정할 수 있습니다. 이 목록에 없는 출처의 SSL 경고 페이지는 사용자가 클릭하여 연결할 수 없습니다. + + <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" />를 사용 설정하거나 설정하지 않으면 이 정책은 무시됩니다. + + 정책을 설정하지 않으면 <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" />가 모든 사이트에 적용됩니다. + + 유효한 입력 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요. <ph name="WILDCARD_VALUE" />는 이 정책에 허용되는 값이 아닙니다. 이 정책은 출처만 기준으로 매치하므로 URL 패턴의 경로는 무시됩니다.</translation> <translation id="9010080992450148617">고급 보호 프로그램에 등록된 사용자가 다운로드한 항목을 심층 검사를 위해 Google에 전송하도록 허용</translation> <translation id="9013875414788074110">로그인하는 동안 <ph name="PRODUCT_OS_NAME" />은(는) 서버(온라인) 또는 캐시된 비밀번호(오프라인)를 사용하여 인증할 수 있습니다.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 1069710..6b5d848 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -450,6 +450,7 @@ Se ela for definida como falsa, os usuários não poderão adicionar e configurar as próprias impressoras. Eles também não poderão imprimir com impressoras configurada anteriormente. </translation> <translation id="1615221548356595305">Permitir a união de conexões HTTP/2 para esses hosts mesmo quando certificados do cliente são utilizados</translation> +<translation id="1616280227447957376">Permitir que páginas de aviso SSL em origens específicas sejam ignoradas</translation> <translation id="1617235075406854669">Ativar exclusão do histórico do navegador e de downloads</translation> <translation id="1620510694547887537">Câmera</translation> <translation id="1626379196197114720">Permitir o uso do cache de avanço e retorno</translation> @@ -1000,6 +1001,7 @@ A verificação ortográfica sempre pode usar um dicionário transferido por download localmente, a menos que esse recurso tenha sido desativado pela <ph name="SPELLCHECK_ENABLED_POLICY_NAME" />. Nesse caso, a política não terá efeito.</translation> <translation id="2433516903565257847">Porcentagem do conjunto de dispositivos que precisa ser atualizada após os dias especificados.</translation> <translation id="2435052056904485763">Lista de permissões do servidor de delegação Kerberos</translation> +<translation id="2435232509335686514">Política de configuração do gerenciamento de arquivos transferidos por download pelo <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /></translation> <translation id="2448315169529769573">Se a política for definida como "Ativada", o <ph name="PRODUCT_OS_NAME" /> informará métricas de uso e dados de diagnóstico, incluindo relatórios de erros, para o Google. Se a política for definida como "Desativada", as informações de métrica e dados de diagnóstico serão desativados. Se a política não for definida, as informações de métrica e dados de diagnóstico ficarão desativados nos dispositivos não gerenciados e ativados nos dispositivos gerenciados.</translation> @@ -1242,6 +1244,15 @@ <translation id="2757054304033424106">Tipos de extensões/aplicativos que podem ser instalados</translation> <translation id="2759224876420453487">Controla o comportamento do usuário em uma sessão de diversos perfis</translation> <translation id="2761483219396643566">Intervalo da advertência de inatividade no funcionamento com energia da bateria</translation> +<translation id="2764165704281937018">Lista de configurações que serão aplicadas ao <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />, que é acionado quando um arquivo é transferido por download. + + Os campos <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MIME_TYPES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> são usados para determinar se o conector precisa enviar um arquivo ao provedor de serviços ao fazer o download em uma página da Web. O URL da página da Web precisa corresponder ao padrão associado a um padrão "ativar", e não a um "desativar". O tipo MIME do arquivo também precisa corresponder ao padrão associado a um padrão "ativar", e não a um "desativar". + + O campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica o provedor de serviços de análise correspondente às configurações. + + O campo <ph name="ENTERPRISE_CONNECTOR_ENTERPRISE_ID_FIELD" /> identifica a empresa com o provedor de serviços. Quando o usuário é solicitado a fazer login como parte da configuração de <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />, apenas contas de usuário associadas a essa empresa são permitidas. + + Esta política só pode ser definida pelo <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="2769952903507981510">Configurar o nome de domínio obrigatório para hosts de acesso remoto</translation> <translation id="2772955711376920612">Se a política for definida como "Ativada" e <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> e <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> forem definidas, a economia de energia no período de pico permanecerá ativa, caso ela seja compatível com o dispositivo. A política de gerenciamento de energia no período de pico gera economia pela redução do uso de corrente alternada quando há alto consumo. É possível definir um horário de início e término do modo de economia de energia no período de pico para cada dia da semana. Durante esses períodos, o dispositivo funcionará usando a bateria mesmo se estiver conectado à corrente alternada, desde que a bateria se mantenha acima do limite especificado. Depois do horário de término especificado, o dispositivo funcionará usando energia de corrente alternada (se conectado), mas a bateria não será carregada. O dispositivo voltará a funcionar normalmente, usando corrente alternada e recarregando a bateria depois do horário de início de carregamento especificado. @@ -1323,6 +1334,23 @@ Se a política for definida como "Desativada" ou não for definida, as informações de status do Android não serão informadas pelos dispositivos registrados.</translation> <translation id="2890645751406497668">Conceder automaticamente permissão a esses sites para se conectarem a dispositivos USB com determinados IDs de fornecedores e produtos.</translation> +<translation id="2892041629748346178">Lista de configurações para os serviços do Chrome Enterprise Connectors que serão aplicadas ao conector <ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" />, que é acionado quando o download de um arquivo é feito no Chrome. + + Os campos <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> determinam se o conector enviará um arquivo para análise quando o download for feito de uma página específica. Eles também definem as tags que serão incluídas no pedido de análise do arquivo. Uma tag correspondente ao padrão "ativar" será incluída na solicitação de análise se o URL da página corresponder a um padrão associado a essa tag. Isso acontecerá apenas se nenhum padrão "desativar" com a mesma tag corresponder ao URL da página. A análise será feita se pelo menos uma tag for incluída na solicitação. + + O campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica o provedor de serviços de análise correspondente às configurações. + + Se o campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> for definido como 1, o Chrome esperará uma resposta do serviço de análise antes de dar ao usuário acesso ao arquivo. Qualquer outro valor inteiro dará ao usuário acesso imediato ao arquivo. + + O campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> controla se o Chrome bloqueia ou permite arquivos protegidos por senha. + + O campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> controla se o Chrome bloqueia ou permite arquivos grandes demais para serem analisados (50 MB ou mais). + + O campo <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> é usado para determinar para quais tags o conector precisa de uma justificativa do usuário para ignorar uma verificação com aviso. Quando o campo não é definido, presume-se que uma justificativa não é necessária. + + Os campos <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> são usados para configurar uma mensagem que informa o usuário quando um aviso é exibido após uma verificação ter um resultado não limpo. O campo message contém o texto que será exibido ao usuário e pode ter no máximo 200 caracteres. O campo learn_more_url contém um URL fornecido pelo administrador em que o usuário pode clicar para receber mais informações fornecidas pelo cliente sobre o motivo de a ação ter sido bloqueada. O campo language é opcional e contém o idioma da mensagem. Deixar esse campo vazio ou com um valor "padrão" indica uma mensagem a ser usada quando o idioma do usuário não contiver uma mensagem. O campo tag especifica para quais tipos de verificação a mensagem será exibida. A lista custom_messages pode ter zero ou mais entradas. Cada entrada precisa ter campos message e tag não vazios. + + Esta política só pode ser definida pelo <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="2893546967669465276">Enviar registros do sistema ao servidor de gerenciamento</translation> <translation id="2899002520262095963">Os apps Android podem usar as configurações de rede e os certificados de CA definidos por esta política, mas não têm acesso a algumas opções de configuração.</translation> <translation id="2899213072616346687">Restringe modo de impressão de gráficos em segundo plano. Se esta política não for definida, não haverá restrição.</translation> @@ -1724,6 +1752,21 @@ <translation id="3412937883532015092">Se a política for definida como um número, o <ph name="PRODUCT_NAME" /> exibirá uma mensagem de milésimos de segundo para o número e abrirá um navegador alternativo. Se ela não for definida ou for definida como 0, a navegação para um URL designado o abrirá imediatamente em um navegador alternativo.</translation> +<translation id="3413215487296688603">Lista de configurações para os serviços do Chrome Enterprise Connectors que serão aplicadas ao conector <ph name="ON_BULK_DATA_ENTRY_ENTERPRISE_CONNECTOR" />, que é acionado quando há a inserção de dados da área de transferência ou de conteúdos da Web (usando o recurso de arrastar e soltar) no Chrome. + + Os campos <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> são usados para determinar se o conector enviará dados para análise quando eles forem inseridos em uma página específica e quais tags serão incluídas na solicitação de análise desses dados. Uma tag correspondente ao padrão "ativar" será incluída na solicitação de análise se o URL da página corresponder a um padrão associado a essa tag. Isso acontecerá apenas se nenhum padrão "desativar" com a mesma tag corresponder ao URL da página. A análise será feita se pelo menos uma tag for incluída na solicitação. + + O campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica o provedor de serviços de análise correspondente às configurações. + + Se o campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> for definido como 1, o Chrome esperará uma resposta do serviço de análise antes de dar à página acesso aos dados. Qualquer outro valor inteiro dará à página acesso imediato aos dados. + + O campo "<ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" />" indica que o tamanho mínimo (em bytes) dos dados inseridos no Chrome precisa ser igual ou maior para ser verificado. Se o campo não for definido, o valor padrão será de 100 bytes. + + O campo <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> é usado para determinar para quais tags o conector precisa de uma justificativa do usuário para ignorar uma verificação com aviso. Quando o campo não é definido, presume-se que uma justificativa não é necessária. + + Os campos <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> são usados para configurar uma mensagem que informa o usuário quando um aviso é exibido após uma verificação ter um resultado não limpo. O campo message contém o texto que será exibido ao usuário e pode ter no máximo 200 caracteres. O campo learn_more_url contém um URL fornecido pelo administrador em que o usuário pode clicar para receber mais informações fornecidas pelo cliente sobre o motivo de a ação ter sido bloqueada. O campo language é opcional e contém o idioma da mensagem. Deixar esse campo vazio ou com um valor "padrão" indica uma mensagem a ser usada quando o idioma do usuário não contiver uma mensagem. O campo tag especifica para quais tipos de verificação a mensagem será exibida. A lista custom_messages pode ter zero ou mais entradas. Cada entrada precisa ter campos message e tag não vazios. + + Esta política só pode ser definida pelo <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="3415954062311826850">Esta política não é compatível com o ARC.</translation> <translation id="34160070798637152">Controla a configuração de rede em todo o dispositivo.</translation> <translation id="3417130629744653218">Permitir que sites consultem formas de pagamento disponíveis.</translation> @@ -2337,6 +2380,11 @@ <translation id="4377599627073874279">Permitir que todos os sites exibam todas as imagens</translation> <translation id="437791893267799639">Política não definida. Bloquear migração de dados e ARC</translation> <translation id="4382413175336720282">A verificação de URLs em tempo real está desativada.</translation> +<translation id="4387741272680827493">A definição da política especifica uma lista de nomes de host que ignoram upgrades HSTS pré-carregados de HTTP para HTTPS. + + Apenas nomes de host de etiqueta única são permitidos nesta política, e ela se aplica somente a entradas HSTS pré-carregadas "estáticas" (por exemplo, <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />). A política não impede upgrades HSTS para servidores que fazem solicitações de upgrade HSTS "dinamicamente" usando um cabeçalho de resposta <ph name="HSTS_HEADER_NAME" />. + + Os nomes de host fornecidos precisam ser canonizados. Todos os IDNs precisam ser convertidos para o formato de etiqueta A, e todas as letras ASCII precisam ser minúsculas. Essa política se aplica exclusivamente aos nomes do host de etiqueta única específicos, e não aos subdomínios desses nomes.</translation> <translation id="4387922553629365459">Se a política for definida, será possível configurar uma lista de padrões de URL que especifica os sites que não podem abrir pop-ups. Se a política não tiver definição, <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> será aplicada a todos os sites, se estiver definida. Caso contrário, a configuração pessoal do usuário será aplicada. @@ -2948,6 +2996,11 @@ * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />, os campos <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" /> e <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> serão usados. Observação: para ver mais exemplos detalhados, acesse The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett, link em inglês).</translation> +<translation id="5266173014392157048">Esta política está obsoleta. Use a <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />. + + A definição da política atribui servidores que podem ser delegados pelo <ph name="PRODUCT_NAME" />. Separe vários nomes de servidor usando vírgulas. Caracteres curinga (<ph name="WILDCARD_VALUE" />) são permitidos. + + Se a política não for definida, o <ph name="PRODUCT_NAME" /> não delegará credenciais de usuário, mesmo que um servidor seja detectado como intranet.</translation> <translation id="5273744932022326215">Ativar o recurso de acessibilidade de destaque de cursor na tela de login. Se esta política for definida como verdadeira, o destaque de cursor sempre ficará ativado na tela de login. @@ -3477,6 +3530,11 @@ Se a política for definida como "Desativada", os usuários não poderão resgatar essas ofertas.</translation> <translation id="6048199181629830227">Ativar o gerenciamento de energia no período de pico</translation> <translation id="6053681087509103368">Permitir que WebRTC use versões obsoletas do protocolo TLD/DTLS</translation> +<translation id="605543517695935623">Lista de configurações para os serviços do Chrome Enterprise Connectors que serão aplicadas ao conector <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" />, que é acionado quando há uma ocorrência de segurança no Chrome. Isso inclui vereditos negativos do Enterprise Connectors, reutilização de senha, navegação para páginas não seguras e outras ações do usuário relacionadas à segurança. + + O campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica o provedor de serviços de relatório ao qual as configurações correspondem. O campo <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> identifica os eventos ativados por esse provedor. + + Esta política só pode ser definida pelo <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="6058879286588763839">A menos que <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> seja especificada, o que substitui <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />, a definição de <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> especifica a política de gerenciamento de energia para o modo de carregamento da bateria, se compatível com o dispositivo. Para prolongar a duração da bateria, a política controla de maneira dinâmica o carregamento da bateria minimizando o estresse e o desgaste. Se a política não for definida, e se compatível com o dispositivo, o modo padrão de carregamento da bateria será aplicado e os usuários não poderão mudá-lo. @@ -4354,6 +4412,23 @@ Se esta política for deixada sem definição ou em branco, o usuário poderá configurar qualquer Conta do Google como uma conta principal do navegador no <ph name="PRODUCT_NAME" />.</translation> <translation id="723103540848640830">Definir o tamanho mínimo do PIN da tela de bloqueio</translation> <translation id="7234280155140786597">Nomes dos hosts de mensagens nativas proibidos (ou "*" para todos)</translation> +<translation id="72369543045636739">Lista de configurações dos serviços do Chrome Enterprise Connectors que serão aplicadas ao conector <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" />, que é acionado quando um arquivo é anexado ao Chrome. + + Os campos <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> são usados para determinar se o conector enviará um arquivo para análise quando for anexado a uma página específica e quais tags serão incluídas na solicitação de análise desse arquivo. Uma tag correspondente ao padrão "ativar" será incluída na solicitação de análise se o URL da página corresponder a um padrão associado a essa tag. Isso acontecerá apenas se nenhum padrão "desativar" com a mesma tag corresponder ao URL da página. A análise será feita se pelo menos uma tag for incluída na solicitação. + + O campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica o provedor de serviços de análise correspondente às configurações. + + Se o campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> for definido como 1, o Chrome esperará uma resposta do serviço de análise antes de dar à página acesso ao arquivo. Qualquer outro valor inteiro dará à página acesso imediato ao arquivo. + + O campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> controla se o Chrome bloqueia ou permite arquivos protegidos por senha. + + O campo <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> controla se o Chrome bloqueia ou permite arquivos grandes demais para serem analisados (50 MB ou mais). + + O campo <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> é usado para determinar para quais tags o conector precisa de uma justificativa do usuário para ignorar uma verificação com aviso. Quando o campo não é definido, presume-se que uma justificativa não é necessária. + + Os campos <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> e <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> são usados para configurar uma mensagem que informa o usuário quando um aviso é exibido após uma verificação ter um resultado não limpo. O campo message contém o texto que será exibido ao usuário e pode ter no máximo 200 caracteres. O campo learn_more_url contém um URL fornecido pelo administrador em que o usuário pode clicar para receber mais informações fornecidas pelo cliente sobre o motivo de a ação ter sido bloqueada. O campo language é opcional e contém o idioma da mensagem. Deixar esse campo vazio ou com um valor "padrão" indica uma mensagem a ser usada quando o idioma do usuário não contiver uma mensagem. O campo tag especifica para quais tipos de verificação a mensagem será exibida. A lista custom_messages pode ter zero ou mais entradas. Cada entrada precisa ter campos message e tag não vazios. + + Esta política só pode ser definida pelo <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="7246767840750730334">Permitir a ativação das notificações do "Seu smartphone".</translation> <translation id="7249828445670652637">Ativar certificados de CA (Autoridade de certificação) do <ph name="PRODUCT_OS_NAME" /> para apps ARC</translation> <translation id="7252681704926980614">Envia o nome de usuário e de arquivo para o servidor de impressoras nativas com cada trabalho de impressão. O padrão é não enviar. @@ -4725,6 +4800,13 @@ <translation id="780629758750905699">Permitir adicionar contas do Family Link no dispositivo</translation> <translation id="7807139251387225825">Lista de tipos a serem excluídos da sincronização</translation> <translation id="781268256210530471">Configurações de plug-ins</translation> +<translation id="7814528532170362496">Esta política controla a verificação de URLs em tempo real para identificar URLs perigosos. + + Se ela estiver desativada ou não for definida, as verificações do Navegação segura do consumidor serão aplicadas. As verificações do Navegação segura do consumidor ainda podem incluir pesquisas em tempo real, dependendo do valor da configuração "Melhorar as pesquisas e a navegação" e da política UrlKeyedAnonymizedDataCollectionEnabled. + + Se esta política for definida como "Ativada", os URLs serão enviados para verificação em tempo real de acordo com os Termos de Serviço da empresa. Com isso, o Chrome passará a enviar URLs para o Google Cloud ou terceiros da sua preferência, onde eles serão verificados em tempo real. A versão de consumidor da verificação em tempo real do Navegação segura será desativada. + + Esta política só pode ser definida pelo <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="7816326058023670173">Segredo compartilhado entre os dispositivos do pai/mãe e da criança.</translation> <translation id="7818131573217430250">Definir o estado padrão do modo de alto contraste na tela de login</translation> <translation id="7823902813460802031">Se a política for definida como "Ativada", o <ph name="PRODUCT_OS_NAME" /> impedirá que o dispositivo entre no modo de desenvolvedor. @@ -5547,6 +5629,13 @@ Se a política for definida como falsa, os upgrades automáticos serão desativados para áudio e vídeo, e nenhum aviso será exibido para imagens. Esta política só afeta conteúdo misto de áudio, vídeo e imagens. Ela não estará mais em vigor a partir da versão 84 do <ph name="PRODUCT_NAME" />.</translation> +<translation id="9009505213521705952">Quando <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> está "Desativada" e depois é definida, é possível configurar uma lista de padrões de origem. Essa lista especifica os sites em que os usuários podem clicar para ignorar as páginas de aviso exibidas pelo <ph name="PRODUCT_NAME" /> quando navegarem para sites com erros de SSL. Os usuários não poderão clicar para ignorar páginas com avisos SSL em origens que não estejam na lista. + + Se <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> estiver "Ativada" ou sem definição, a política não terá efeito. + + Se a política for deixada sem definição, <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> será aplicada em todos os sites. + + Para informações detalhadas sobre padrões de entrada válidos, consulte https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> não é um valor aceitável para esta política. A política só faz a correspondência de origens, então os caminhos no padrão do URL serão ignorados.</translation> <translation id="9010080992450148617">Ativar o envio de downloads ao Google para verificação detalhada por usuários inscritos no Programa Proteção Avançada</translation> <translation id="9013875414788074110">Durante o login, o <ph name="PRODUCT_OS_NAME" /> pode fazer autenticação em um servidor (on-line) ou usando uma senha armazenada em cache (off-line).
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 96fc145..a7d214e 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -451,6 +451,7 @@ Если задано значение False, пользователи не могут добавлять и настраивать собственные принтеры, а также печатать на принтерах, которые были настроены ранее. </translation> <translation id="1615221548356595305">Разрешить повторное использование соединений HTTP/2 для этих хостов, даже если применяются сертификаты клиентов</translation> +<translation id="1616280227447957376">Разрешить пропуск предупреждений об ошибках SSL на определенных страницах</translation> <translation id="1617235075406854669">Удаление истории просмотров и загрузок браузера</translation> <translation id="1620510694547887537">Камера</translation> <translation id="1626379196197114720">Разрешить использование возвратного кеша</translation> @@ -995,6 +996,7 @@ Если это правило отключено правилом "<ph name="SPELLCHECK_ENABLED_POLICY_NAME" />", то можно использовать для проверки правописания скачанные в локальное хранилище словари.</translation> <translation id="2433516903565257847">Процент устройств, которые необходимо обновить по истечении указанного количества дней.</translation> <translation id="2435052056904485763">Список разрешенных серверов для делегирования прав по протоколу Kerberos</translation> +<translation id="2435232509335686514">Правило настройки для обработки скачанных файлов коннектором <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /></translation> <translation id="2448315169529769573">Если правило включено, из <ph name="PRODUCT_OS_NAME" /> в Google отправляется статистика использования и диагностическая информация, в том числе отчеты о сбоях. Если правило отключено, эти данные не отправляются. Если правило не настроено, данные отправляются только с устройств, которыми управляют администраторы.</translation> @@ -1232,6 +1234,15 @@ <translation id="2757054304033424106">Типы расширений и приложений, которые разрешено устанавливать</translation> <translation id="2759224876420453487">Контролировать действия пользователей в многопрофильном режиме</translation> <translation id="2761483219396643566">Задержка предупреждения о переходе в режим ожидания при работе от батареи</translation> +<translation id="2764165704281937018">Список настроек, применяемых к коннектору <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />, который будет запускаться при скачивании файла. + + Значения полей <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MIME_TYPES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> и <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> определяют условия, при которых коннектор должен отправить файл поставщику услуг при скачивании с веб-страницы. URL веб-страницы должен соответствовать шаблону в поле enable и не должен соответствовать какому-либо шаблону в поле disable. MIME-тип файла также должен совпадать только с шаблоном из поля enable. + + Значение поля <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> определяет, какому поставщику услуг анализа соответствуют эти настройки. + + В поле <ph name="ENTERPRISE_CONNECTOR_ENTERPRISE_ID_FIELD" /> указывается идентификатор организации, который назначается поставщиком услуг. Если в процессе настройки коннектора <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> нужно выполнить вход, это можно сделать только из аккаунта пользователя, связанного с организацией. + + Это правило можно настроить только через <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="2769952903507981510">Настройка имени домена для хостов удаленного доступа</translation> <translation id="2772955711376920612">Если настроены <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" />, <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> и это правило, режим пиковой нагрузки будет всегда включен на устройствах, где он поддерживается. Режим пиковой нагрузки позволяет экономить энергию, минимизируя использование переменного тока в период высокой нагрузки на электрическую сеть. Для каждого буднего дня можно указать время, в которое режим пиковой нагрузки будет включаться и отключаться. Пока заряд батареи выше заданного порогового значения, устройство будет использовать энергию аккумулятора, даже если работает от сети переменного тока. Когда наступит указанное время отключения режима, устройство начнет использовать энергию переменного тока, если оно подключено к электрической сети, но батарея заряжаться не будет. В указанное время начала зарядки устройство вернется к штатному режиму работы (использование сети переменного тока одновременно с зарядом батареи). @@ -1314,6 +1325,23 @@ Если правило выключено или не настроено, эти данные не отправляются.</translation> <translation id="288923520817177650">Разрешать создание сеансов в режиме <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> с помощью <ph name="WEBXR_API_NAME_SHORT" /></translation> <translation id="2890645751406497668">Автоматически разрешать этим сайтам подключение к USB-устройствам с предоставленными идентификаторами поставщика и продукта.</translation> +<translation id="2892041629748346178">Список настроек, применяемых к коннектору <ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" /> для Chrome Enterprise. Коннектор запускается при скачивании любого файла в браузере Chrome. + + Значения полей <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> и <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> определяют, должен ли коннектор отправить на анализ файл, который скачивается с определенной страницы, и какие теги необходимо добавить в запрос на анализ этого файла. Тег, соответствующий шаблону в поле enable, будет включен в запрос на анализ, если URL страницы совпадет с шаблоном, связанным с этим тегом. При этом URL не должен соответствовать ни одному шаблону с таким же тегом в поле disable. Данные отправляются на анализ, если в запрос включен хотя бы один тег. + + Значение поля <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> определяет, какому поставщику услуг анализа соответствуют эти настройки. + + Значение "1" в поле <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> указывает, что Chrome будет ждать ответа от сервиса анализа, прежде чем предоставлять пользователю доступ к скачанному файлу. Любое другое целое число в этом поле означает, что пользователь получит доступ к файлу сразу. + + Значение в поле <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> определяет, будет ли Chrome блокировать или разрешать файлы, защищенные паролем. + + Значение в поле <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> определяет, будет ли Chrome блокировать или разрешать слишком большие для анализа файлы (более 50 МБ). + + Значение в поле <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> определяет, для каких тегов коннектор потребует от пользователя ввести обоснование для обхода проверки. При обходе будет показано предупреждение. Если значение не указано, обоснование не требуется. + + Поля <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> и <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> позволяют настроить сообщение, которое будет видеть пользователь при получении уведомления о неудовлетворительном результате проверки. В поле message указывается текст этого сообщения (максимум 200 символов). В поле learn_more_url содержится URL, предоставленный администратором, нажав на который пользователь может получить подробную информацию о причине блокировки действия. Эта информация предоставляется клиентом. Поле language заполнять необязательно. В нем указывается язык сообщения. Если задано значение default или поле не заполнено, это сообщение используется, когда нет сообщения на языке пользователя. Значение поля tag определяет тип проверок, для которых появляется сообщение. Список custom_messages может быть пустым. Если он содержит элементы, для каждого из них необходимо заполнить поля message и tag. + + Это правило можно настроить только через <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="2893546967669465276">Позволяет отправлять системные журналы на сервер для проверки администраторами</translation> <translation id="2899002520262095963">Приложения Android могут использовать сетевые настройки и сертификаты ЦС, указанные с помощью этого правила, но лишены доступа к некоторым параметрам конфигурации.</translation> <translation id="2899213072616346687">Ограничивает режим печати фоновых цветов и изображений. Если значение не задано, ограничение не действует.</translation> @@ -1717,6 +1745,21 @@ <translation id="3412937883532015092">Заданное в этом правиле число соответствует интервалу в миллисекундах, в течение которого <ph name="PRODUCT_NAME" /> показывает специальное сообщение перед запуском альтернативного браузера. Если правило не настроено или задано значение "0", страница из назначенного списка открывается в альтернативном браузере немедленно.</translation> +<translation id="3413215487296688603">Список настроек, применяемых к коннектору <ph name="ON_BULK_DATA_ENTRY_ENTERPRISE_CONNECTOR" /> для Chrome Enterprise. Коннектор запускается при вставке в Chrome данных из буфера обмена или перетаскивании веб-контента. + + Значения полей <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> и <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> определяют, должен ли коннектор отправить на анализ данные, которые вставляются на определенной странице, и какие теги необходимо добавить в запрос на анализ этих данных. Тег, соответствующий шаблону в поле enable, будет включен в запрос на анализ, если URL страницы совпадет с шаблоном, связанным с этим тегом. При этом URL не должен соответствовать ни одному шаблону с таким же тегом в поле disable. Данные отправляются на анализ, если в запрос включен хотя бы один тег. + + Значение поля <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> определяет, какому поставщику услуг анализа соответствуют эти настройки. + + Значение "1" в поле <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> указывает, что Chrome будет ждать ответа от сервиса анализа, прежде чем предоставлять странице доступ к данным. Любое другое целое число в этом поле означает, что страница получит доступ к данным сразу. + + В поле <ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" /> указывается минимальное количество байтов, которое должны включать введенные в Chrome данные, чтобы был выполнен их анализ. Если не указать собственное значение, минимальное количество по умолчанию будет равно 100 байтам. + + Значение в поле <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> определяет, для каких тегов коннектор потребует от пользователя ввести обоснование для обхода проверки. При обходе будет показано предупреждение. Если значение не указано, обоснование не требуется. + + Поля <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> и <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> позволяют настроить сообщение, которое будет видеть пользователь при получении уведомления о неудовлетворительном результате проверки. В поле message указывается текст этого сообщения (максимум 200 символов). В поле learn_more_url содержится URL, предоставленный администратором, нажав на который пользователь может получить подробную информацию о причине блокировки действия. Эта информация предоставляется клиентом. Поле language заполнять необязательно. В нем указывается язык сообщения. Если задано значение default или поле не заполнено, это сообщение используется, когда нет сообщения на языке пользователя. Значение поля tag определяет тип проверок, для которых появляется сообщение. Список custom_messages может быть пустым. Если он содержит элементы, для каждого из них необходимо заполнить поля message и tag. + + Это правило можно настроить только через <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="3415954062311826850">Это правило не поддерживается при использовании технологии ARC.</translation> <translation id="34160070798637152">Определяет конфигурацию сети для устройства.</translation> <translation id="3417130629744653218">Разрешить сайтам запрашивать доступные способы оплаты</translation> @@ -2342,6 +2385,11 @@ <translation id="4377599627073874279">Разрешить показ изображений на всех сайтах</translation> <translation id="437791893267799639">Правило не настроено, запретить перенос данных и ARC</translation> <translation id="4382413175336720282">Не проверять URL в режиме реального времени</translation> +<translation id="4387741272680827493">Правило позволяет указать список имен хостов, которые будут обходить изменения протокола http на https для сайтов из предварительно загружаемого списка HSTS. + + В списке правила могут быть только одноуровневые имена. Само правило применяется к "статичным" предзагрузкам HSTS (например, <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />). Правило не может предотвратить преобразования с помощью HSTS для серверов, запросивших их с помощью заголовка ответа <ph name="HSTS_HEADER_NAME" />. + + Имена хостов необходимо нормализовать: доменные имена, содержащие символы национальных алфавитов, нужно преобразовать в формат А-метки, а буквы из таблицы ASCII сделать строчными. Это правило действует только для одноуровневых имен хостов, указанных в списке. На субдомены оно не распространяется.</translation> <translation id="4387922553629365459">Позволяет задать список шаблонов URL для указания сайтов, которым запрещено открывать всплывающие окна. Если правило не настроено, для всех сайтов действует правило <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> при условии, что оно задано. В противном случае применяются персональные настройки пользователя. @@ -2953,6 +3001,11 @@ * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> – будут использоваться поля <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" /> и <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" />. Примечание. Подробную информацию можно найти здесь: https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett.</translation> +<translation id="5266173014392157048">Это правило больше не поддерживается. Используйте вместо него правило <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />. + + Правило позволяет указать список серверов, которым <ph name="PRODUCT_NAME" /> может предоставлять учетные данные пользователей. Названия серверов нужно разделять запятыми. Допустимы подстановочные знаки (<ph name="WILDCARD_VALUE" />). + + Если правило не настроено, <ph name="PRODUCT_NAME" /> не будет передавать учетные данные пользователей серверам, в том числе находящимся в интранете.</translation> <translation id="5273744932022326215">Это правило включает специальную возможность – подсветку указателя мыши на экране входа. Если для правила задано значение True, подсветка указателя мыши будет всегда использоваться на экране входа. @@ -3483,6 +3536,11 @@ Если правило отключено, использовать предложения нельзя.</translation> <translation id="6048199181629830227">Включить управление режимом пиковой нагрузки</translation> <translation id="6053681087509103368">Разрешить WebRTC использовать устаревшие версии протоколов TLS и DTLS</translation> +<translation id="605543517695935623">Список настроек, применяемых к коннектору <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> для Chrome Enterprise. Коннектор запускается, когда в Chrome регистрируются события безопасности, например повторное использование паролей, переход на небезопасные страницы, получение отрицательных результатов анализа, запущенного коннекторами Chrome Enterprise, и другие действия пользователей, потенциально нарушающие правила безопасности. + + Значение поля <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> определяет, какому поставщику услуг отчетов соответствуют эти настройки. Значение поля <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> определяет, какие события допустимы для этого поставщика. + + Это правило можно настроить только через <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="6058879286588763839">Если правило <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" />, которое может переопределить <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />, не указано, то <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> задает режимы зарядки батареи при условии, что они поддерживаются на устройстве. С помощью этого правила можно контролировать процесс зарядки, чтобы увеличить время работы от батареи и свести к минимуму ее износ. Если правило не настроено, будет применяться стандартный режим зарядки батареи при условии, что он поддерживается устройством, и пользователи не смогут его изменить. @@ -4364,6 +4422,23 @@ Если это правило не настроено или значения для него отсутствуют, пользователь может выбрать любой аккаунт Google и назначить его основным в <ph name="PRODUCT_NAME" />.</translation> <translation id="723103540848640830">Указать минимальную длину PIN-кода для разблокировки экрана</translation> <translation id="7234280155140786597">Имена запрещенных хостов обмена сообщениями с оригинальными приложениями (используйте звездочку (*), чтобы включить все хосты)</translation> +<translation id="72369543045636739">Список настроек, применяемых к коннектору <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" /> для Chrome Enterprise. Коннектор запускается, когда к Chrome прикрепляется файл. + + Значения полей <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> и <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> определяют, должен ли коннектор отправить на анализ файл, который прикрепляется к определенной странице, и какие теги необходимо добавить в запрос на анализ этого файла. Тег, соответствующий шаблону в поле enable, будет включен в запрос на анализ, если URL страницы совпадет с шаблоном, связанным с этим тегом. При этом URL не должен соответствовать ни одному шаблону с таким же тегом в поле disable. Данные отправляются на анализ, если в запрос включен хотя бы один тег. + + Значение поля <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> определяет, какому поставщику услуг анализа соответствуют эти настройки. + + Значение "1" в поле <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> указывает, что Chrome будет ждать ответа от сервиса анализа, прежде чем предоставлять странице доступ к файлу. Любое другое целое число в этом поле означает, что страница получит доступ к файлу сразу. + + Значение в поле <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> определяет, будет ли Chrome блокировать или разрешать файлы, защищенные паролем. + + Значение в поле <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> определяет, будет ли Chrome блокировать или разрешать слишком большие для анализа файлы (более 50 МБ). + + Значение в поле <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> определяет, для каких тегов коннектор потребует от пользователя ввести обоснование для обхода проверки. При обходе будет показано предупреждение. Если значение не указано, обоснование не требуется. + + Поля <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> и <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> позволяют настроить сообщение, которое будет видеть пользователь при получении уведомления о неудовлетворительном результате проверки. В поле message указывается текст этого сообщения (максимум 200 символов). В поле learn_more_url содержится URL, предоставленный администратором, нажав на который пользователь может получить подробную информацию о причине блокировки действия. Эта информация предоставляется клиентом. Поле language заполнять необязательно. В нем указывается язык сообщения. Если задано значение default или поле не заполнено, это сообщение используется, когда нет сообщения на языке пользователя. Значение поля tag определяет тип проверок, для которых появляется сообщение. Список custom_messages может быть пустым. Если он содержит элементы, для каждого из них необходимо заполнить поля message и tag. + + Это правило можно настроить только через <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="7246767840750730334">Разрешить управлять уведомлениями с телефона на устройстве Chrome OS</translation> <translation id="7249828445670652637">Разрешить приложениям ARC использовать сертификаты <ph name="PRODUCT_OS_NAME" /></translation> <translation id="7252681704926980614">Отправляет имя пользователя и название файла на сервер локальных принтеров вместе с каждым заданием печати. По умолчанию отправка отключена. @@ -4734,6 +4809,13 @@ <translation id="780629758750905699">Разрешить добавление аккаунтов Family Link на устройство</translation> <translation id="7807139251387225825">Типы данных, для которых нужно запретить синхронизацию</translation> <translation id="781268256210530471">Настройки плагинов</translation> +<translation id="7814528532170362496">Это правило определяет, выявляются ли в режиме реального времени опасные URL. + + Если правило не задано или отключено, применяются пользовательские параметры проверки на соответствие критериям Безопасного просмотра. В таком случае проверка тоже может выполняться в режиме реального времени. Это зависит от установленной пользователем настройки "Помогать улучшить просмотр страниц и поиск" и значения в правиле UrlKeyedAnonymizedDataCollectionEnabled. + + Если правило включено, URL передаются на проверку в реальном времени согласно Условиям использования Chrome Enterprise. Для этого Chrome отправляет URL в Google Cloud или указанным вами третьим сторонам. В таком случае пользовательские параметры проверки отключаются. + + Это правило можно настроить только через <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />.</translation> <translation id="7816326058023670173">Секретная информация, находящаяся на устройствах ребенка и родителя.</translation> <translation id="7818131573217430250">Режим высокой контрастности, устанавливаемый по умолчанию на экране входа</translation> <translation id="7823902813460802031">Если это правило включено, устройство <ph name="PRODUCT_OS_NAME" /> не сможет перейти в режим разработчика. @@ -5363,7 +5445,7 @@ Вы также можете ознакомиться со списком переменных ( https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables ).</translation> <translation id="877557628527387598">Пароли для входа</translation> -<translation id="8777369558049831576">Показывать флажок "Запускать всегда" в диалоговом окне внешнего протокола</translation> +<translation id="8777369558049831576">Показывать флажок "Запомнить мой выбор для этого типа ссылок" в диалоговом окне внешнего протокола</translation> <translation id="8786409859071107656">Если правило настроено, включен режим подачи энергии через USB-порт, предназначенный для зарядки других устройств. На некоторых устройствах есть специальный USB-порт со значком молнии или батареи, позволяющий заряжать другие устройства от системного аккумулятора. С помощью данного правила можно указать, как этот порт должен работать, когда система выключена или находится в спящем режиме. Правило не влияет на остальные USB-порты, а также на возможность зарядки устройств при включенной и активной системе, когда энергия и так подается через USB-порт. @@ -5559,6 +5641,13 @@ Если для правила установлено значение False, автоматическое изменение ссылок для аудио и видео отключается, а предупреждение для изображений не отображается. Правило влияет только на такие типы смешанного контента, как аудио, видео и изображения. Это правило перестанет действовать в <ph name="PRODUCT_NAME" /> начиная с версии 84.</translation> +<translation id="9009505213521705952">Если правило <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> отключено, то с помощью этого правила можно задать список шаблонов источников для сайтов, где пользователь сможет пропускать страницы предупреждений, которые <ph name="PRODUCT_NAME" /> показывает, когда появляются ошибки SSL. Пользователи не смогут пропускать страницы предупреждений об ошибках SSL на сайтах, которых нет в этом списке. + + Если правило <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> включено или не настроено, это правило игнорируется. + + Если правило не настроено, для всех сайтов действует правило <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" />. + + Подробнее о допустимых шаблонах: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Значение <ph name="WILDCARD_VALUE" /> не поддерживается для этого правила. Это правило работает только с адресами сайтов-источников, поэтому пути в шаблонах URL не учитываются.</translation> <translation id="9010080992450148617">Разрешить пользователям, зарегистрированным в программе Дополнительной защиты, отправку скачиваемых файлов в Google для глубокого сканирования</translation> <translation id="9013875414788074110">В <ph name="PRODUCT_OS_NAME" /> аутентификация пользователей выполняется на сервере (онлайн) или с помощью кешированных паролей (офлайн).
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 272d425..b4078fb 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -454,6 +454,7 @@ หากตั้งค่านโยบายนี้เป็น "เท็จ" ผู้ใช้จะเพิ่มและกำหนดค่าเครื่องพิมพ์ของตนเองไม่ได้ และจะสั่งพิมพ์โดยใช้เครื่องพิมพ์ที่กำหนดค่าไว้ก่อนหน้านี้ไม่ได้ด้วย </translation> <translation id="1615221548356595305">อนุญาตการรวมการเชื่อมต่อ HTTP/2 สำหรับโฮสต์เหล่านี้แม้จะมีการใช้ใบรับรองไคลเอ็นต์</translation> +<translation id="1616280227447957376">อนุญาตให้ดำเนินการจากหน้าคำเตือน SSL ในต้นทางเฉพาะบางแห่ง</translation> <translation id="1617235075406854669">เปิดใช้งานการนำออกเบราว์เซอร์และประวัติการดาวน์โหลด</translation> <translation id="1620510694547887537">กล้อง</translation> <translation id="1626379196197114720">อนุญาตให้ใช้แคชย้อนหลัง</translation> @@ -993,6 +994,7 @@ การตรวจตัวสะกดสามารถใช้พจนานุกรมที่ดาวน์โหลดไว้ในเครื่องได้ทุกเมื่อ เว้นแต่จะมีการปิดใช้ฟีเจอร์โดย <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> ซึ่งในกรณีนี้นโยบายจะไม่ส่งผลกระทบ</translation> <translation id="2433516903565257847">เปอร์เซ็นต์ของกลุ่มอุปกรณ์ที่ควรได้รับการอัปเดตหลังจากวันที่ระบุ</translation> <translation id="2435052056904485763">รายการที่อนุญาตสำหรับเซิร์ฟเวอร์การมอบสิทธิ์ของ Kerberos</translation> +<translation id="2435232509335686514">นโยบายการกำหนดค่าสำหรับ <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> ในการจัดการไฟล์ที่ดาวน์โหลด</translation> <translation id="2448315169529769573">การตั้งค่านโยบายเป็น "เปิดใช้" จะทำให้ <ph name="PRODUCT_OS_NAME" /> รายงานเมตริกการใช้งานและข้อมูลการวินิจฉัย รวมถึงรายงานข้อขัดข้อง กลับมาที่ Google การตั้งค่านโยบายเป็น "ปิดใช้" จะปิดการรายงานเมตริกและข้อมูลการวินิจฉัย การไม่ตั้งค่านโยบายจะปิดการรายงานเมตริกและข้อมูลการวินิจฉัยเสมอในอุปกรณ์ที่ไม่มีการจัดการและเปิดในอุปกรณ์ที่มีการจัดการ</translation> @@ -1229,6 +1231,15 @@ <translation id="2757054304033424106">ประเภทของส่วนขยาย/แอปพลิเคชันที่ได้รับอนุญาตให้ติดตั้ง</translation> <translation id="2759224876420453487">ควบคุมพฤติกรรมผู้ใช้ในเซสชันหลายโปรไฟล์</translation> <translation id="2761483219396643566">คำเตือนการไม่ใช้งานล่าช้าเมื่อทำงานโดยใช้กำลังแบตเตอรี่</translation> +<translation id="2764165704281937018">รายการตั้งค่าที่จะใช้กับ <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> ซึ่งจะเรียกใช้งานเมื่อมีการดาวน์โหลดไฟล์ + + ช่อง <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MIME_TYPES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อควรส่งไฟล์ไปยังผู้ให้บริการหรือไม่เมื่อดาวน์โหลดไฟล์นั้นจากหน้าเว็บ URL ของหน้าเว็บต้องตรงกับรูปแบบที่เกี่ยวข้องกับรูปแบบ "เปิดใช้" และไม่เกี่ยวข้องกับรูปแบบ "ปิดใช้" นอกจากนี้ประเภท MIME ของไฟล์จะต้องตรงกับรูปแบบที่เกี่ยวข้องกับรูปแบบ "เปิดใช้" และไม่เกี่ยวข้องกับรูปแบบ "ปิดใช้" ด้วย + + ช่อง <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> จะระบุว่าผู้ให้บริการการวิเคราะห์ใดที่สอดคล้องกับการตั้งค่า + + ช่อง <ph name="ENTERPRISE_CONNECTOR_ENTERPRISE_ID_FIELD" /> จะระบุองค์กรโดยใช้ผู้ให้บริการดังกล่าว เมื่อระบบขอให้ผู้ใช้ลงชื่อเข้าใช้โดยเป็นขั้นตอนหนึ่งในการตั้งค่า <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> เฉพาะบัญชีผู้ใช้ที่เชื่อมโยงกับองค์กรนี้เท่านั้นที่จะได้รับอนุญาต + + นโยบายนี้ตั้งค่าได้จาก<ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> เท่านั้น</translation> <translation id="2769952903507981510">กำหนดค่าชื่อโดเมนที่จำเป็นสำหรับโฮสต์การเข้าถึงระยะไกล</translation> <translation id="2772955711376920612">การตั้งค่านโยบายเป็น "เปิดใช้" และการตั้งค่า <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> กับ <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> จะเปิดการใช้ไฟจากแบตเตอรี่ต่อไป (หากอุปกรณ์รองรับ) นโยบายการจัดการการใช้ไฟจากแบตเตอรี่เป็นนโยบายการประหยัดพลังงานที่ลดการใช้ไฟฟ้ากระแสสลับในช่วงที่มีการใช้งานสูงสุด คุณกำหนดเวลาเริ่มเปิดและปิดใช้โหมดการใช้ไฟจากแบตเตอรี่ในแต่ละวันได้ ในช่วงเวลาดังกล่าว อุปกรณ์จะทำงานโดยใช้พลังงานจากแบตเตอรี่ (แม้ว่าจะยังมีไฟฟ้ากระแสสลับอยู่) ตราบใดที่ระดับแบตเตอรี่อยู่เหนือเกณฑ์ที่ระบุ หลังเวลาสิ้นสุดที่ระบุ อุปกรณ์จะทำงานโดยใช้พลังงานจากไฟฟ้ากระแสสลับ (หากมีอยู่) แต่จะไม่ชาร์จแบตเตอรี่ แล้วจะกลับมาทำงานตามปกติอีกครั้งโดยใช้ไฟฟ้ากระแสสลับและชาร์จแบตเตอรี่ใหม่หลังจากเวลาเริ่มต้นการชาร์จที่ระบุ @@ -1311,6 +1322,23 @@ การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้อุปกรณ์ที่ลงทะเบียนไว้ไม่รายงานข้อมูลสถานะ Android</translation> <translation id="288923520817177650">อนุญาตการสร้างเซสชัน <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> ของ <ph name="WEBXR_API_NAME_SHORT" /></translation> <translation id="2890645751406497668">ให้สิทธิ์เว็บไซต์เหล่านี้โดยอัตโนมัติในการเชื่อมต่อกับอุปกรณ์ USB ที่มีรหัสผู้ให้บริการและรหัสผลิตภัณฑ์ที่ระบุ</translation> +<translation id="2892041629748346178">รายการของการตั้งค่าบริการเครื่องมือเชื่อมต่อ Chrome Enterprise ที่จะใช้กับเครื่องมือเชื่อมต่อ <ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" /> Enterprise ซึ่งจะเรียกใช้งานเมื่อมีการดาวน์โหลดไฟล์ใน Chrome + + ช่อง <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อควรส่งไฟล์สำหรับการวิเคราะห์หรือไม่เมื่อมีการดาวน์โหลดไฟล์จากหน้าหนึ่งๆ และแท็กใดที่จะรวมอยู่ในคำขอการวิเคราะห์สำหรับไฟล์นั้น แท็กที่สอดคล้องกับรูปแบบ "เปิดใช้" จะรวมอยู่ในคำขอการวิเคราะห์หาก URL ของหน้าตรงกับรูปแบบที่เกี่ยวข้องกับแท็กดังกล่าวตราบใดที่ไม่มีรูปแบบ "ปิดใช้" ที่มีแท็กเดียวกันนั้นตรงกับ URL ของหน้า การวิเคราะห์จะเกิดขึ้นหากมีอย่างน้อย 1 แท็กในคำขอ + + ช่อง <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> จะระบุว่าผู้ให้บริการการวิเคราะห์ใดที่สอดคล้องกับการตั้งค่า + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> ที่ตั้งไว้เป็น 1 หมายความว่า Chrome จะรอให้มีการตอบสนองจากบริการการวิเคราะห์ก่อนให้สิทธิ์ผู้ใช้เข้าถึงไฟล์ที่ดาวน์โหลด ค่าที่เป็นจำนวนเต็มอื่นๆ หมายความว่า Chrome จะให้สิทธิ์ผู้ใช้เข้าถึงไฟล์นั้นทันที + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> จะควบคุมให้ Chrome บล็อกหรืออนุญาตไฟล์ที่มีการป้องกันด้วยรหัสผ่าน + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> จะควบคุมให้ Chrome บล็อกหรืออนุญาตให้วิเคราะห์ไฟล์ที่มีขนาดใหญ่เกินไป (50 MB ขึ้นไป) + + ช่อง <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อต้องกำหนดให้ผู้ใช้ป้อนเหตุผลสำหรับแท็กใดเพื่อข้ามการสแกนที่ทำให้เกิดคำเตือนแบบข้ามได้ หากไม่ได้ตั้งค่าช่องนี้ ระบบจะถือว่าไม่จำเป็นต้องป้อนเหตุผล + + ช่อง <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> ใช้เพื่อกำหนดค่าข้อความที่จะแสดงแก่ผู้ใช้เมื่อมีคำเตือนปรากฏขึ้นหลังจากที่การสแกนตรวจพบการละเมิด ช่องข้อความมีข้อความที่จะแสดงต่อผู้ใช้และต้องมีความยาวไม่เกิน 200 อักขระ ช่อง learn_more_url มี URL จากผู้ดูแลระบบ ซึ่งผู้ใช้สามารถคลิกเพื่อดูข้อมูลเพิ่มเติมจากลูกค้าเกี่ยวกับเหตุผลที่การดำเนินการถูกบล็อก ช่องภาษาจะมีหรือไม่มีก็ได้และจะมีภาษาของข้อความ ช่องภาษาที่เว้นว่างไว้หรือมีค่าเป็น "ค่าเริ่มต้น" จะระบุข้อความที่จะใช้เมื่อภาษาของผู้ใช้ไม่มีข้อความ ช่องแท็กจะระบุประเภทการสแกนที่จะมีการแสดงข้อความ รายการ custom_messages อาจไม่มีรายการย่อยเลยหรือมีรายการย่อยเพิ่มเติม โดยที่รายการย่อยแต่ละรายการจำเป็นต้องมีช่องข้อความและช่องแท็กที่ไม่เว้นว่างไว้ + + นโยบายนี้ตั้งค่าได้จาก<ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> เท่านั้น</translation> <translation id="2893546967669465276">ส่งบันทึกของระบบไปยังเซิร์ฟเวอร์การจัดการ</translation> <translation id="2899002520262095963">แอป Android สามารถใช้การกำหนดค่าเครือข่ายและใบรับรอง CA ที่ตั้งค่าผ่านนโยบายนี้ได้ แต่จะไม่มีสิทธิ์เข้าถึงตัวเลือกการตั้งค่าบางอย่าง</translation> <translation id="2899213072616346687">จำกัดโหมดการพิมพ์กราฟิกพื้นหลัง ระบบจะถือว่าไม่มีข้อจำกัดหากไม่ได้ตั้งค่านโยบาย</translation> @@ -1709,6 +1737,21 @@ <translation id="3412937883532015092">การตั้งค่านโยบายนี้เป็นตัวเลขจะทำให้ <ph name="PRODUCT_NAME" /> แสดงข้อความเป็นมิลลิวินาทีตามจำนวนดังกล่าว จากนั้นจึงเปิดเบราว์เซอร์สำรอง การไม่ตั้งค่านโยบายนี้หรือตั้งค่าเป็น 0 หมายความว่าการไปยัง URL ที่กำหนดจะเป็นการเปิด URL ในเบราว์เซอร์สำรองทันที</translation> +<translation id="3413215487296688603">รายการของการตั้งค่าบริการเครื่องมือเชื่อมต่อ Chrome Enterprise ที่จะใช้กับเครื่องมือเชื่อมต่อ <ph name="ON_BULK_DATA_ENTRY_ENTERPRISE_CONNECTOR" /> Enterprise ซึ่งจะเรียกใช้งานเมื่อมีการป้อนข้อมูลใน Chrome จากคลิปบอร์ดหรือผ่านการลากและวางเนื้อหาเว็บ + + ช่อง <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อควรส่งข้อมูลสำหรับการวิเคราะห์หรือไม่เมื่อมีการป้อนข้อมูลจากหน้าหนึ่งๆ และแท็กใดที่จะรวมอยู่ในคำขอการวิเคราะห์สำหรับข้อมูลนั้น แท็กที่สอดคล้องกับรูปแบบ "เปิดใช้" จะรวมอยู่ในคำขอการวิเคราะห์หาก URL ของหน้าตรงกับรูปแบบที่เกี่ยวข้องกับแท็กดังกล่าวตราบใดที่ไม่มีรูปแบบ "ปิดใช้" ที่มีแท็กเดียวกันนั้นตรงกับ URL ของหน้า การวิเคราะห์จะเกิดขึ้นหากมีอย่างน้อย 1 แท็กในคำขอ + + ช่อง <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> จะระบุว่าผู้ให้บริการการวิเคราะห์ใดที่สอดคล้องกับการตั้งค่า + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> ที่ตั้งไว้เป็น 1 หมายความว่า Chrome จะรอให้มีการตอบสนองจากบริการการวิเคราะห์ก่อนให้สิทธิ์หน้าในการเข้าถึงข้อมูล ค่าที่เป็นจำนวนเต็มอื่นๆ หมายความว่า Chrome จะให้สิทธิ์หน้าในการเข้าถึงข้อมูลโดยทันที + + ช่อง <ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" /> ระบุขนาดขั้นต่ำ (หน่วยเป็นไบต์) ซึ่งข้อมูลที่ป้อนใน Chrome ต้องเท่ากับหรือเกินค่านี้จึงจะได้รับการสแกน ค่าเริ่มต้นคือ 100 ไบต์หากไม่ได้ตั้งค่าช่องนี้ + + ช่อง <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อต้องกำหนดให้ผู้ใช้ป้อนเหตุผลสำหรับแท็กใดเพื่อข้ามการสแกนที่ทำให้เกิดคำเตือนแบบข้ามได้ หากไม่ได้ตั้งค่าช่องนี้ ระบบจะถือว่าไม่จำเป็นต้องป้อนเหตุผล + + ช่อง <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> ใช้เพื่อกำหนดค่าข้อความที่จะแสดงแก่ผู้ใช้เมื่อมีคำเตือนปรากฏขึ้นหลังจากที่การสแกนตรวจพบการละเมิด ช่องข้อความมีข้อความที่จะแสดงต่อผู้ใช้และต้องมีความยาวไม่เกิน 200 อักขระ ช่อง learn_more_url มี URL จากผู้ดูแลระบบ ซึ่งผู้ใช้สามารถคลิกเพื่อดูข้อมูลเพิ่มเติมจากลูกค้าเกี่ยวกับเหตุผลที่การดำเนินการถูกบล็อก ช่องภาษาจะมีหรือไม่มีก็ได้และจะมีภาษาของข้อความ ช่องภาษาที่เว้นว่างไว้หรือมีค่าเป็น "ค่าเริ่มต้น" จะระบุข้อความที่จะใช้เมื่อภาษาของผู้ใช้ไม่มีข้อความ ช่องแท็กจะระบุประเภทการสแกนที่จะมีการแสดงข้อความ รายการ custom_messages อาจไม่มีรายการย่อยเลยหรือมีรายการย่อยเพิ่มเติม โดยที่รายการย่อยแต่ละรายการจำเป็นต้องมีช่องข้อความและช่องแท็กที่ไม่เว้นว่างไว้ + + นโยบายนี้ตั้งค่าได้จาก<ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> เท่านั้น</translation> <translation id="3415954062311826850">นโยบายนี้ไม่รองรับใน ARC</translation> <translation id="34160070798637152">ควบคุมการกำหนดค่าเครือข่ายของทั้งอุปกรณ์</translation> <translation id="3417130629744653218">อนุญาตให้เว็บไซต์ถามหาวิธีการชำระเงินที่พร้อมใช้งาน</translation> @@ -2332,6 +2375,11 @@ <translation id="4377599627073874279">อนุญาตให้ไซต์ทั้งหมดแสดงภาพทั้งหมด</translation> <translation id="437791893267799639">ไม่ได้ตั้งนโยบาย ไม่อนุญาตให้ย้ายข้อมูลและใช้ ARC</translation> <translation id="4382413175336720282">ปิดใช้การตรวจสอบ URL แบบเรียลไทม์อยู่</translation> +<translation id="4387741272680827493">การตั้งค่านโยบายจะเป็นการระบุรายชื่อโฮสต์ที่ไม่ต้องมีการอัปเกรด HSTS แบบโหลดล่วงหน้าจาก http เป็น https + + นโยบายนี้อนุญาตเฉพาะชื่อโฮสต์แบบป้ายกำกับเดี่ยวเท่านั้น และมีผลเฉพาะกับรายการที่โหลด HSTS ไว้ล่วงหน้าแบบ "คงที่" (เช่น <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />) นโยบายนี้ไม่ได้ป้องกันการอัปเกรด HSTS สำหรับเซิร์ฟเวอร์ที่ขอการอัปเกรด HSTS แบบ "ไดนามิก" โดยใช้ส่วนหัวการตอบกลับ <ph name="HSTS_HEADER_NAME" /> + + ชื่อโฮสต์ที่ระบุไว้ต้องกำหนดเป็น Canonical ซึ่งหมายความว่าต้องแปลง IDN ทั้งหมดเป็นรูปแบบ A-label และตัวอักษร ASCII ทั้งหมดต้องเป็นตัวพิมพ์เล็ก นโยบายนี้มีผลเฉพาะกับชื่อโฮสต์แบบป้ายกำกับเดี่ยวบางชื่อเท่านั้น ไม่ใช่กับโดเมนย่อยของชื่อเหล่านั้น</translation> <translation id="4387922553629365459">การตั้งค่านโยบายจะให้คุณสร้างรายการรูปแบบ URL ซึ่งระบุเว็บไซต์ที่เปิดป๊อปอัปไม่ได้ การไม่ตั้งค่านโยบายหมายความว่า <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> จะมีผลกับทุกเว็บไซต์ (หากตั้งค่าไว้) แต่หากไม่ได้ตั้งค่าไว้ การตั้งค่าส่วนตัวของผู้ใช้จะมีผล @@ -2945,6 +2993,11 @@ * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> ระบบจะใช้ช่อง <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" /> และ <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> หมายเหตุ: ดูตัวอย่างโดยละเอียดเพิ่มเติมได้ที่ The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett )</translation> +<translation id="5266173014392157048">นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้นโยบาย "<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />" แทน + + การตั้งค่านโยบายจะกำหนดเซิร์ฟเวอร์ที่ <ph name="PRODUCT_NAME" /> อาจมอบสิทธิ์ให้ คั่นชื่อเซิร์ฟเวอร์หลายรายการด้วยเครื่องหมายจุลภาค ใช้ไวลด์การ์ด (<ph name="WILDCARD_VALUE" />) ได้ + + การไม่ตั้งค่านโยบายหมายความว่า <ph name="PRODUCT_NAME" /> จะไม่มอบสิทธิ์ใช้ข้อมูลเข้าสู่ระบบของผู้ใช้ แม้จะตรวจพบว่าเซิร์ฟเวอร์เป็นอินทราเน็ตก็ตาม</translation> <translation id="5273744932022326215">เปิดใช้ฟีเจอร์การช่วยเหลือพิเศษสำหรับการไฮไลต์เคอร์เซอร์ในหน้าจอการเข้าสู่ระบบ หากตั้งค่านโยบายนี้เป็น "จริง" ฟีเจอร์การไฮไลต์เคอร์เซอร์จะเปิดใช้เสมอในหน้าจอการเข้าสู่ระบบ @@ -3472,6 +3525,11 @@ การตั้งค่านโยบายเป็น "ปิดใช้" หมายความว่าผู้ใช้จะแลกข้อรับเสนอเหล่านี้ไม่ได้</translation> <translation id="6048199181629830227">เปิดใช้การจัดการการใช้ไฟจากแบตเตอรี่</translation> <translation id="6053681087509103368">อนุญาตให้ WebRTC ใช้โปรโตคอล TLS/DTLS เวอร์ชันที่ล้าสมัย</translation> +<translation id="605543517695935623">รายการของการตั้งค่าบริการเครื่องมือเชื่อมต่อ Chrome Enterprise ที่จะใช้กับเครื่องมือเชื่อมต่อ <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> Enterprise ซึ่งจะเรียกใช้งานเมื่อเกิดการดำเนินการด้านความปลอดภัยใน Chrome โดยจะรวมถึงคำตัดสินในแง่ลบจากเครื่องมือเชื่อมต่อ Enterprise ของการวิเคราะห์ การใช้รหัสผ่านซ้ำ การนำทางไปยังหน้าที่ไม่ปลอดภัย และการดำเนินการอื่นๆ ของผู้ใช้ที่ละเอียดอ่อนต่อความปลอดภัย + + ช่อง <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> ระบุว่าผู้ให้บริการการรายงานใดที่สอดคล้องกับการตั้งค่า ส่วนช่อง <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> ระบุเหตุการณ์ที่เปิดใช้สำหรับผู้ให้บริการรายนี้ + + นโยบายนี้ตั้งค่าได้จาก<ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> เท่านั้น</translation> <translation id="6058879286588763839">หากไม่ได้ระบุ <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> ไว้ (ถ้าระบุ จะเป็นการลบล้าง <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />) การตั้งค่า <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> จะระบุนโยบายการจัดการพลังงานของโหมดการชาร์จแบตเตอรี่ (หากอุปกรณ์รองรับ) นโยบายจะควบคุมการชาร์จแบตเตอรี่แบบไดนามิกโดยลดความเค้นและการสึกหรอให้เหลือน้อยที่สุด ทั้งนี้เพื่อยืดอายุการใช้งานแบตเตอรี่ การไม่ตั้งค่านโยบาย (หากอุปกรณ์รองรับ) จะทำให้มีการใช้โหมดการชาร์จแบตเตอรี่แบบมาตรฐาน และผู้ใช้จะเปลี่ยนไม่ได้ @@ -4353,6 +4411,23 @@ หากไม่ได้ตั้งค่านโยบายนี้หรือเว้นว่างไว้ ผู้ใช้จะตั้งค่าบัญชี Google ใดก็ได้ให้เป็นบัญชีหลักของเบราว์เซอร์ใน <ph name="PRODUCT_NAME" /></translation> <translation id="723103540848640830">ตั้งค่าความยาวขั้นต่ำของ PIN หน้าจอล็อก</translation> <translation id="7234280155140786597">ชื่อของโฮสต์การรับส่งข้อความดั้งเดิมต้องห้าม (หรือ * สำหรับทั้งหมด)</translation> +<translation id="72369543045636739">รายการของการตั้งค่าบริการเครื่องมือเชื่อมต่อ Chrome Enterprise ที่จะใช้กับเครื่องมือเชื่อมต่อ <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" /> Enterprise ซึ่งจะเรียกใช้งานเมื่อมีไฟล์แนบไปกับ Chrome + + ช่อง <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อควรส่งไฟล์สำหรับการวิเคราะห์หรือไม่เมื่อมีการแนบไฟล์มากับหน้าหนึ่งๆ และแท็กใดที่จะรวมอยู่ในคำขอการวิเคราะห์สำหรับไฟล์นั้น แท็กที่สอดคล้องกับรูปแบบ "เปิดใช้" จะรวมอยู่ในคำขอการวิเคราะห์หาก URL ของหน้าตรงกับรูปแบบที่เกี่ยวข้องกับแท็กดังกล่าวตราบใดที่ไม่มีรูปแบบ "ปิดใช้" ที่มีแท็กเดียวกันนั้นตรงกับ URL ของหน้า การวิเคราะห์จะเกิดขึ้นหากมีอย่างน้อย 1 แท็กในคำขอ + + ช่อง <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> จะระบุว่าผู้ให้บริการการวิเคราะห์ใดที่สอดคล้องกับการตั้งค่า + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> ที่ตั้งไว้เป็น 1 หมายความว่า Chrome จะรอให้มีการตอบสนองจากบริการการวิเคราะห์ก่อนให้สิทธิ์หน้าในการเข้าถึงไฟล์ ค่าที่เป็นจำนวนเต็มอื่นๆ หมายความว่า Chrome จะให้สิทธิ์เข้าถึงหน้าแก่ไฟล์โดยทันที + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> จะควบคุมให้ Chrome บล็อกหรืออนุญาตไฟล์ที่มีการป้องกันด้วยรหัสผ่าน + + ช่อง <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> จะควบคุมให้ Chrome บล็อกหรืออนุญาตให้วิเคราะห์ไฟล์ที่มีขนาดใหญ่เกินไป (50 MB ขึ้นไป) + + ช่อง <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> ใช้เพื่อกำหนดว่าเครื่องมือเชื่อมต่อต้องกำหนดให้ผู้ใช้ป้อนเหตุผลสำหรับแท็กใดเพื่อข้ามการสแกนที่ทำให้เกิดคำเตือนแบบข้ามได้ หากไม่ได้ตั้งค่าช่องนี้ ระบบจะถือว่าไม่จำเป็นต้องป้อนเหตุผล + + ช่อง <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> และ <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> ใช้เพื่อกำหนดค่าข้อความที่จะแสดงแก่ผู้ใช้เมื่อมีคำเตือนปรากฏขึ้นหลังจากที่การสแกนตรวจพบการละเมิด ช่องข้อความมีข้อความที่จะแสดงต่อผู้ใช้และต้องมีความยาวไม่เกิน 200 อักขระ ช่อง learn_more_url มี URL จากผู้ดูแลระบบ ซึ่งผู้ใช้สามารถคลิกเพื่อดูข้อมูลเพิ่มเติมจากลูกค้าเกี่ยวกับเหตุผลที่การดำเนินการถูกบล็อก ช่องภาษาจะมีหรือไม่มีก็ได้และจะมีภาษาของข้อความ ช่องภาษาที่เว้นว่างไว้หรือมีค่าเป็น "ค่าเริ่มต้น" จะระบุข้อความที่จะใช้เมื่อภาษาของผู้ใช้ไม่มีข้อความ ช่องแท็กจะระบุประเภทการสแกนที่จะมีการแสดงข้อความ รายการ custom_messages อาจไม่มีรายการย่อยเลยหรือมีรายการย่อยเพิ่มเติม โดยที่รายการย่อยแต่ละรายการจำเป็นต้องมีช่องข้อความและช่องแท็กที่ไม่เว้นว่างไว้ + + นโยบายนี้ตั้งค่าได้จาก<ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> เท่านั้น</translation> <translation id="7246767840750730334">อนุญาตให้มีการเปิดใช้การแจ้งเตือนของฮับโทรศัพท์</translation> <translation id="7249828445670652637">เปิดใช้ใบรับรอง CA ของ <ph name="PRODUCT_OS_NAME" /> สำหรับแอป ARC</translation> <translation id="7252681704926980614">ส่งชื่อผู้ใช้และชื่อไฟล์ไปยังเซิร์ฟเวอร์เครื่องพิมพ์ดั้งเดิมพร้อมด้วยงานพิมพ์ทั้งหมด ค่าเริ่มต้นคือไม่ส่ง @@ -4724,6 +4799,13 @@ <translation id="780629758750905699">อนุญาตให้มีการเพิ่มบัญชี Family Link ลงในอุปกรณ์</translation> <translation id="7807139251387225825">รายการของประเภทที่จะไม่รวมในการซิงค์ข้อมูล</translation> <translation id="781268256210530471">การตั้งค่าปลั๊กอิน</translation> +<translation id="7814528532170362496">นโยบายนี้ควบคุมการตรวจสอบ URL แบบเรียลไทม์เพื่อระบุ URL ที่เป็นอันตราย + + หากไม่ได้ตั้งค่านโยบายนี้หรือตั้งค่าเป็น "ปิดใช้" ระบบจะใช้การตรวจสอบกับ Google Safe Browsing สำหรับผู้บริโภค การตรวจสอบกับ Google Safe Browsing สำหรับผู้บริโภคยังคงรวมการค้นหาแบบเรียลไทม์ได้อยู่ โดยขึ้นอยู่กับค่าของการตั้งค่า "ปรับปรุงการค้นหาและการท่องเว็บให้ดียิ่งขึ้น" และค่าของนโยบาย UrlKeyedAnonymizedDataCollectionEnabled + + หากตั้งค่านโยบายนี้เป็น "เปิดใช้" ระบบจะส่ง URL ไปสแกนแบบเรียลไทม์ตามข้อกำหนดในการให้บริการขององค์กร ซึ่งจะทำให้ Chrome ส่ง URL ไปยัง Google Cloud หรือบุคคลที่สามที่คุณเลือกเพื่อตรวจสอบ URL เหล่านั้นแบบเรียลไทม์ ระบบจะปิดการค้นหาแบบเรียลไทม์ของ Google Safe Browsing เวอร์ชันสำหรับผู้บริโภค + + นโยบายนี้ตั้งค่าได้จาก<ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> เท่านั้น</translation> <translation id="7816326058023670173">ข้อมูลลับที่แชร์ระหว่างอุปกรณ์ของบุตรหลานและผู้ปกครอง</translation> <translation id="7818131573217430250">ตั้งค่าสถานะเริ่มต้นของโหมดคอนทราสต์สูงบนหน้าจอการเข้าสู่ระบบ</translation> <translation id="7823902813460802031">การตั้งค่านโยบายเป็น "เปิดใช้" หมายความว่า <ph name="PRODUCT_OS_NAME" /> จะหยุดไม่ให้อุปกรณ์เข้าสู่โหมดนักพัฒนาซอฟต์แวร์ @@ -5551,6 +5633,13 @@ หากตั้งค่านโยบายเป็น "เท็จ" ระบบจะปิดใช้การอัปเกรดอัตโนมัติสำหรับเสียงและวิดีโอ และจะไม่แสดงคำเตือนสำหรับรูปภาพ นโยบายนี้ไม่มีผลต่อเนื้อหาผสมประเภทอื่นๆ ที่ไม่ใช่เสียง วิดีโอ และรูปภาพ นโยบายนี้จะไม่มีผลอีกต่อไปตั้งแต่ <ph name="PRODUCT_NAME" /> 84</translation> +<translation id="9009505213521705952">หากปิดใช้ <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> ไว้ การตั้งค่านโยบายนี้จะทำให้คุณตั้งค่ารายการรูปแบบต้นทางได้ ซึ่งระบุเว็บไซต์ที่ผู้ใช้จะคลิกผ่านหน้าคำเตือนที่ <ph name="PRODUCT_NAME" /> แสดงขึ้นเมื่อผู้ใช้ไปยังเว็บไซต์ที่มีข้อผิดพลาด SSL ผู้ใช้จะคลิกผ่านหน้าคำเตือน SSL ในต้นทางที่ไม่อยู่ในรายการนี้ไม่ได้ + + หากเปิดใช้ <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> หรือไม่ได้ตั้งค่าไว้ นโยบายนี้จะไม่ดำเนินการใดๆ + + การไม่ตั้งค่านโยบายหมายความว่า <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> จะมีผลกับทุกเว็บไซต์ + + ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบอินพุตที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns <ph name="WILDCARD_VALUE" /> ไม่ใช่ค่าที่ยอมรับสำหรับนโยบายนี้ นโยบายนี้จะจับคู่โดยอิงตามต้นทางเท่านั้น ด้วยเหตุนี้จึงเพิกเฉยต่อเส้นทางใดก็ตามในรูปแบบ URL</translation> <translation id="9010080992450148617">เปิดใช้การส่งเนื้อหาที่ดาวน์โหลดไปให้ Google สแกนอย่างละเอียดสำหรับผู้ใช้ที่ลงทะเบียนในโปรแกรมการปกป้องขั้นสูง</translation> <translation id="9013875414788074110">ในระหว่างการเข้าสู่ระบบ <ph name="PRODUCT_OS_NAME" /> จะตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ (แบบออนไลน์) หรือใช้รหัสผ่านในแคช (แบบออฟไลน์) ได้
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index a16cea52..42de4ef 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -453,6 +453,7 @@ Bu politika False (Yanlış) değerine ayarlanırsa kullanıcılar kendi yazıcılarını ekleyemez ve yapılandıramazlar. Ayrıca kullanıcılar, önceden yapılandırılmış yazıcıları kullanarak da yazdırma işlemi yapamazlar. </translation> <translation id="1615221548356595305">İstemci sertifikaları kullanıldığında bile bu ana makineler için HTTP/2 bağlantılarının birleşmesine izin ver</translation> +<translation id="1616280227447957376">Belirli kaynaklarda SSL uyarı sayfasından devam etmeye izin ver</translation> <translation id="1617235075406854669">Tarayıcı ve indirme geçmişinin silinmesini etkinleştir</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1626379196197114720">Geri-ileri önbelleğin kullanılmasına izin ver</translation> @@ -997,6 +998,7 @@ Bu özellik, <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> tarafından devre dışı bırakılmadıkça yazım denetimi her zaman yerel olarak indirilen bir sözlüğü kullanabilir. Bu durumda politikanın hiçbir etkisi olmaz.</translation> <translation id="2433516903565257847">Belirlenen günlerden sonra cihaz filosunun yüzde kaçının güncellenmesi gerektiği.</translation> <translation id="2435052056904485763">Kerberos yetki sunucusu izin verilenler listesi</translation> +<translation id="2435232509335686514"><ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> tarafından indirilen dosyaların işlenmesi için yapılandırma politikası</translation> <translation id="2448315169529769573">Politika Etkin değerine ayarlanırsa <ph name="PRODUCT_OS_NAME" />, kilitlenme raporları da dahil olmak üzere kullanım metriklerini ve teşhis verilerini Google'a bildirir. Politika Devre Dışı değerine ayarlanırsa metrikler ve teşhis verisi raporlama devre dışı bırakılır. Politika ayarlanmadan bırakılırsa metrikler ve teşhis verisi raporlama, yönetilmeyen cihazlarda devre dışı, yönetilen cihazlarda ise etkin kalır.</translation> @@ -1238,6 +1240,15 @@ <translation id="2757054304033424106">Yüklenmesine izin verilen uzantı/uygulama türleri</translation> <translation id="2759224876420453487">Çok profilli bir oturumda kullanıcı çalışma biçimini kontrol et</translation> <translation id="2761483219396643566">Pil gücüyle çalışırken boşta kalma uyarısı gecikmesi</translation> +<translation id="2764165704281937018">Bir dosya indirildiğinde tetiklenen <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> için uygulanacak ayarların listesi. + + <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MIME_TYPES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> ve <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> alanları, bağlayıcının web sayfasından dosya indirirken ilgili dosyayı servis sağlayıcıya gönderip göndermemesi gerektiğini belirlemek için kullanılır. Web sayfası URL'si, "devre dışı bırak" kalıbıyla ilişkilendirilmiş değil "etkinleştir" kalıbıyla ilişkilendirilmiş kalıpla eşleşmelidir. Dosyanın MIME türü de "devre dışı bırak" kalıbıyla ilişkilendirilmiş değil "etkinleştir" kalıbıyla ilişkilendirilmiş kalıpla eşleşmelidir. + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> alanı, ayarların hangi analiz servis sağlayıcısına karşılık geldiğini tanımlar. + + <ph name="ENTERPRISE_CONNECTOR_ENTERPRISE_ID_FIELD" /> alanı, servis sağlayıcısı olan kurumu tanımlar. Kullanıcıdan <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> kurulumunun bir parçası olarak oturum açması istendiğinde, yalnızca bu kurumla ilişkilendirilmiş kullanıcı hesaplarına izin verilir. + + Bu politika, yalnızca <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> üzerinden ayarlanabilir.</translation> <translation id="2769952903507981510">Uzaktan erişim ana makineleri için gerekli alan adını yapılandır</translation> <translation id="2772955711376920612">Politika, Etkin değerine ayarlanır ve <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> ile <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> ayarlanırsa desteklenen cihazlarda yoğun saatler için güç yönetimi açık kalır. Yoğun saatler için güç yönetimi politikası, kullanımın en yüksek olduğu zamanlarda alternatif akım kullanımını minimuma indiren bir güç tasarrufu politikasıdır. Hafta içi her gün, yoğun saatler için güç yönetimi modunun başlangıç ve bitiş saati ayarlanabilir. Bu saatler sırasında alternatif akım takılı olsa bile, pil belirtilen eşiğin üstünde kaldığı sürece cihaz pille çalışır. Bitiş zamanından sonra cihaz, takılıysa alternatif akımı kullanarak çalışır, ancak pil şarj olmaz. Cihaz, belirtilen şarj başlangıç zamanından sonra alternatif akımı kullanarak ve pili şarj ederek tekrar normal şekilde çalışır. @@ -1320,6 +1331,23 @@ Politika Devre Dışı değerine ayarlanır veya ayarlanmadan bırakılırsa kayıtlı cihazlar Android durum bilgilerini rapor etmez.</translation> <translation id="288923520817177650"><ph name="WEBXR_API_NAME_SHORT" /> API'nin <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> oturumlarına izin ver</translation> <translation id="2890645751406497668">Bu sitelere, sağlanan tedarikçi ve ürün kimlikleriyle otomatik olarak USB cihazlarına bağlanma izni verir.</translation> +<translation id="2892041629748346178">Chrome'da bir dosya indirildiğinde tetiklenen <ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" /> Enterprise Bağlayıcı'ya uygulanacak Chrome Enterprise Connectors hizmetleri ayarlarının listesidir. + + <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> ve <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> alanları, bağlayıcının, belirli bir sayfadan dosya indirildiğinde ilgili dosyayı analiz için gönderip göndermemesi gerektiğini ve bu dosyanın analiz isteğine hangi etiketlerin dahil edileceğini belirlemek üzere kullanılır. Sayfa URL'si, etiketle ilişkilendirilen kalıpla eşleşirse "etkinleştir" kalıbına karşılık gelen bu etiket analiz isteğine dahil edilir. Ancak, aynı etikete sahip "devre dışı bırak" kalıbı sayfa URL'si ile eşleşirse dahil edilmez. Analiz, isteğe en az 1 etiket dahil edilecekse gerçekleşir. + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> alanı, ayarların hangi analiz servis sağlayıcısına karşılık geldiğini tanımlar. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> alanının 1 değerine ayarlanması, Chrome'un kullanıcıya indirilen dosyaya erişim izni vermeden önce analiz hizmetinden yanıt almak için bekleyeceği anlamına gelir. Başka herhangi bir tam sayı değeri, Chrome'un, kullanıcıya dosya erişim iznini hemen vereceği anlamına gelir. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> alanı, Chrome'un şifre korumalı dosyaları engelleyeceğini mi yoksa izin mi vereceğini kontrol eder. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> alanı, Chrome'un analiz edilemeyecek kadar büyük dosyaları (50 MB'tan büyük) engelleyeceğini mi yoksa izin mi vereceğini kontrol eder. + + <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> alanı, bağlayıcının hangi etiketler için kullanıcının atlanabilir uyarıyla sonuçlanan taramayı atlamak üzere gerekçe girmesini gerektirdiğini belirlemek amacıyla kullanılır. Bu alan ayarlanmazsa gerekçe girmenin zorunlu olmadığı varsayılır. + + <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> ve <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> alanları, tarama sonucu net olmadığında görüntülenen uyarıdan sonra kullanıcıya gösterilen mesajı yapılandırmak için kullanılır. Mesaj alanında, en fazla 200 karakterden oluşması gereken metin bulunur. Learn_more_url (daha fazla bilgi edinin) alanı, yönetici tarafından sağlanan URL'yi içerir. Bu URL, işlemin neden engellendiği hakkında daha fazla müşteri tarafından sağlanan bilgi edinmek için kullanıcı tarafından tıklanabilir olur. Mesajın dilini içeren dil alanı isteğe bağlıdır. Dil alanının boş bırakılması veya "varsayılan" değerine ayarlanması, kullanıcının dilinde mesaj olmadığında kullanılacak mesajı gösterir. Etiket alanı, mesajın hangi tarama türleri için görüntüleneceğini belirtir. Custom_messages (özel mesajlar) listesi herhangi bir giriş içermeyebilir veya birden fazla giriş içerebilir. Her girişin boş olmayan mesajı ve etiket alanları olmalıdır. + + Bu politika, yalnızca <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> üzerinden ayarlanabilir.</translation> <translation id="2893546967669465276">Yönetim sunucusuna sistem günlükleri gönder</translation> <translation id="2899002520262095963">Android uygulamaları, bu politika aracılığıyla ayarlanan CA sertifikalarını ve ağ yapılandırmalarını kullanabilir, ancak bazı yapılandırma seçeneklerine erişemez.</translation> <translation id="2899213072616346687">Arka plan grafikleri yazdırma modunu kısıtlar. Politika ayarlanmazsa herhangi bir kısıtlama uygulanmaz.</translation> @@ -1720,6 +1748,21 @@ <translation id="3412937883532015092">Bu politika bir sayıya ayarlanırsa <ph name="PRODUCT_NAME" />, ayarlanan milisaniye süresince bir mesaj görüntüler, ardından alternatif tarayıcıyı açar. Bu politika ayarlanmadan bırakılırsa veya 0 değerine ayarlanırsa tanımlanan bir URL'ye gidildiğinde URL hemen alternatif tarayıcıda açılır.</translation> +<translation id="3413215487296688603">Chrome'da panodan veri girildiğinde veya web içeriği sürüklenip bırakıldığında tetiklenen <ph name="ON_BULK_DATA_ENTRY_ENTERPRISE_CONNECTOR" /> Enterprise Bağlayıcı'ya uygulanacak Chrome Enterprise Connectors hizmetleri ayarlarının listesidir. + + <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> ve <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> alanları, bağlayıcının, belirli bir sayfada veri girildiğinde ilgili veriyi analiz için gönderip göndermemesi gerektiğini ve bu veri analiz isteğine hangi etiketlerin dahil edileceğini belirlemek üzere kullanılır. Sayfa URL'si, etiketle ilişkilendirilen kalıpla eşleşirse "etkinleştir" kalıbına karşılık gelen bu etiket analiz isteğine dahil edilir. Ancak, aynı etikete sahip "devre dışı bırak" kalıbı sayfa URL'si ile eşleşirse dahil edilmez. Analiz, isteğe en az 1 etiket dahil edilecekse gerçekleşir. + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> alanı, ayarların hangi analiz servis sağlayıcısına karşılık geldiğini tanımlar. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> alanının 1 değerine ayarlanması, Chrome'un verilere sayfaya erişim izni vermeden önce analiz hizmetinden yanıt almak için bekleyeceği anlamına gelir. Başka herhangi bir tam sayı değeri, Chrome'un sayfaya dosya erişim iznini hemen vereceği anlamına gelir. + + <ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" /> alanı, Chrome'a girilen verilerin taranabilmesi için eşit olması veya aşması gereken minimum boyutu (bayt cinsinden) belirtir. Alan ayarlanmadan bırakılırsa varsayılan değer 100 bayttır. + + <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> alanı, bağlayıcının hangi etiketler için kullanıcının atlanabilir uyarıyla sonuçlanan taramayı atlamak üzere gerekçe girmesini gerektirdiğini belirlemek amacıyla kullanılır. Bu alan ayarlanmazsa gerekçe girmenin zorunlu olmadığı varsayılır. + + <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> ve <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> alanları, tarama sonucu net olmadığında görüntülenen uyarıdan sonra kullanıcıya gösterilen mesajı yapılandırmak için kullanılır. Mesaj alanında, en fazla 200 karakterden oluşması gereken metin bulunur. Learn_more_url (daha fazla bilgi edinin) alanı, yönetici tarafından sağlanan URL'yi içerir. Bu URL, işlemin neden engellendiği hakkında daha fazla müşteri tarafından sağlanan bilgi edinmek için kullanıcı tarafından tıklanabilir olur. Mesajın dilini içeren dil alanı isteğe bağlıdır. Dil alanının boş bırakılması veya "varsayılan" değerine ayarlanması, kullanıcının dilinde mesaj olmadığında kullanılacak mesajı gösterir. Etiket alanı, mesajın hangi tarama türleri için görüntüleneceğini belirtir. Custom_messages (özel mesajlar) listesi herhangi bir giriş içermeyebilir veya birden fazla giriş içerebilir. Her girişin boş olmayan mesajı ve etiket alanları olmalıdır. + + Bu politika, yalnızca <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> üzerinden ayarlanabilir.</translation> <translation id="3415954062311826850">Bu politika Arc dahilinde desteklenmemektedir.</translation> <translation id="34160070798637152">Cihaz genelindeki ağ yapılandırmasını kontrol eder.</translation> <translation id="3417130629744653218">Web sitelerinin kullanılabilir ödeme yöntemlerini sorgulamalarına izin ver.</translation> @@ -2344,6 +2387,11 @@ <translation id="4377599627073874279">Tüm sitelerin tüm resimleri görüntülemesine izin ver</translation> <translation id="437791893267799639">Politika ayarlanmadı, veri taşıma ve ARC'ye izin verme</translation> <translation id="4382413175336720282">Gerçek zamanlı URL kontrolü devre dışı bırakıldı.</translation> +<translation id="4387741272680827493">Politika ayarlanırsa önceden yüklenmiş HSTS'lerin http'den https'ye geçirilmelerini atlayan ana makine adlarının bir listesi belirtilir. + + Bu politikada yalnızca tek etiketli ana makine adlarına izin verilir. Bu politika, yalnızca "statik" HSTS-önceden yüklenmiş öğeler için (örneğin, <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />) geçerlidir. Bu politika, <ph name="HSTS_HEADER_NAME" /> yanıt başlığı kullanarak "dinamik" olarak HSTS sürümüne geçiş isteğinde bulunmuş sunucular için HSTS geçişlerini engellemez. + + Sağlanan ana makine adları standartlaştırılmalıdır: Tüm IDN'ler, A-etiket biçimine dönüştürülmeli ve tüm ASCII harfleri küçük harf olmalıdır. Bu politika, yalnızca belirtilen tek etiketli ana makine adları için geçerlidir. Bu ana makine adlarının alt alan adları için geçerli değildir.</translation> <translation id="4387922553629365459">Politikayı ayarlamak pop-up'ları açamayan siteleri belirten URL kalıpları için bir liste yapmanıza olanak tanır. Politika ayarlanmadan bırakılırsa <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> (etkinse) bütün siteler için geçerli olur. Aksi takdirde kullanıcının kişisel ayarları geçerlidir. @@ -2957,6 +3005,11 @@ * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />, <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" /> ve <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> alanları kullanılır. Not: Daha ayrıntılı örnekler için Chromium Projeleri'ni ziyaret edin (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation> +<translation id="5266173014392157048">Bu politika kullanımdan kaldırıldı. Bunun yerine lütfen "<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />" politikasını kullanın. + + Politikayı ayarlamak <ph name="PRODUCT_NAME" /> ürününün yetki verebileceği sunucular atar. Birden fazla sunucu adını virgülle ayırın. Joker karakterlere (<ph name="WILDCARD_VALUE" />) izin verilir. + + Politika ayarlanmadan bırakılırsa bir sunucunun intranet olduğu belirlense dahi <ph name="PRODUCT_NAME" />, kullanıcı kimlik bilgilerine yetki vermez.</translation> <translation id="5273744932022326215">Giriş ekranında imleci vurgulama erişilebilirlik özelliğini etkinleştirin. Bu politika true (doğru) değerine ayarlanırsa giriş ekranında imleci vurgulama her zaman etkin olur. @@ -3485,6 +3538,11 @@ Politika, Devre Dışı değerine ayarlanırsa kullanıcılar teklifleri kullanamazlar.</translation> <translation id="6048199181629830227">Güç tüketimi en üst düzeydeyken pil kullanımına geçme güç yönetimini etkinleştir</translation> <translation id="6053681087509103368">WebRTC'nin, TLD/DTLS protokolünün eski sürümlerini kullunmasına izin ver</translation> +<translation id="605543517695935623">Chrome'da bir güvenlik işlemi oluştuğunda tetiklenen <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> Enterprise Bağlayıcı'ya uygulanacak Chrome Enterprise Bağlayıcılar hizmetleri ayarlarının listesidir. Bu liste Enterprise Bağlayıcılar analizinin olumsuz sonuçlarını, şifre yeniden kullanımını, güvensiz sayfalarda gezinmeleri ve diğer güvenlik açısından hassas kullanıcı işlemlerini içerir. + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> alanı, ayarların hangi servis sağlayıcısına karşılık geldiğini; <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> alanı, bu sağlayıcı için hangi etkinliklerin etkinleştirildiğini tanımlar. + + Bu politika, yalnızca <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> üzerinden ayarlanabilir.</translation> <translation id="6058879286588763839"><ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> politikasını geçersiz kılan <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> belirtilmediğinde <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> politikasının ayarlanması pil şarj modu güç yönetimi politikasını belirtir (cihazda destekleniyorsa). Politika, pil ömrünü uzatmak için stresi ve yıpranmayı en aza indirerek pil şarjını dinamik olarak kontrol eder. Politika, ayarlanmadan bırakılırsa (cihazda destekleniyorsa) standart pil şarj modu uygulanır ve kullanıcılar bunu değiştiremez. @@ -4366,6 +4424,23 @@ Bu politika ayarlanmamış olarak veya boş bırakılırsa, kullanıcı <ph name="PRODUCT_NAME" /> dahilinde herhangi bir Google hesabını tarayıcı birincil hesabı olarak ayarlayabilir.</translation> <translation id="723103540848640830">Kilit ekranı PIN'inin minimum uzunluğunu ayarla</translation> <translation id="7234280155140786597">Yasak yerel mesajlaşma ana makinelerinin adları (veya hepsi için *)</translation> +<translation id="72369543045636739">Chrome'a bir dosya eklendiğinde tetiklenen <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" /> Enterprise Bağlayıcı'ya uygulanacak Chrome Enterprise Connectors hizmetleri ayarlarının listesidir. + + <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> ve <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> alanları, bağlayıcının, belirli bir sayfaya dosya eklendiğinde ilgili dosyayı analiz için gönderip göndermemesi gerektiğini ve bu dosyanın analiz isteğine hangi etiketlerin dahil edileceğini belirlemek amacıyla kullanılır. Sayfa URL'si, etiketle ilişkilendirilen kalıpla eşleşirse "etkinleştir" kalıbına karşılık gelen bu etiket analiz isteğine dahil edilir. Ancak, aynı etikete sahip "devre dışı bırak" kalıbı sayfa URL'si ile eşleşirse dahil edilmez. Analiz, isteğe en az 1 etiket dahil edilecekse gerçekleşir. + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> alanı, ayarların hangi analiz servis sağlayıcısına karşılık geldiğini tanımlar. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> alanının 1 değerine ayarlanması, Chrome'un dosyaya sayfaya erişim izni vermeden önce analiz hizmetinden yanıt almak için bekleyeceği anlamına gelir. Başka herhangi bir tam sayı değeri, Chrome'un sayfaya dosya erişim iznini hemen vereceği anlamına gelir. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> alanı, Chrome'un şifre korumalı dosyaları engelleyeceğini mi yoksa izin mi vereceğini kontrol eder. + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> alanı, Chrome'un analiz edilemeyecek kadar büyük dosyaları (50 MB'tan büyük) engelleyeceğini mi yoksa izin mi vereceğini kontrol eder. + + <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> alanı, bağlayıcının hangi etiketler için kullanıcının atlanabilir uyarıyla sonuçlanan taramayı atlamak üzere gerekçe girmesini gerektirdiğini belirlemek amacıyla kullanılır. Bu alan ayarlanmazsa gerekçe girmenin zorunlu olmadığı varsayılır. + + <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />, <ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> ve <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> alanları, tarama sonucu net olmadığında görüntülenen uyarıdan sonra kullanıcıya gösterilen mesajı yapılandırmak için kullanılır. Mesaj alanında, en fazla 200 karakterden oluşması gereken metin bulunur. Learn_more_url (daha fazla bilgi edinin) alanı, yönetici tarafından sağlanan URL'yi içerir. Bu URL, işlemin neden engellendiği hakkında daha fazla müşteri tarafından sağlanan bilgi edinmek için kullanıcı tarafından tıklanabilir olur. Mesajın dilini içeren dil alanı isteğe bağlıdır. Dil alanının boş bırakılması veya "varsayılan" değerine ayarlanması, kullanıcının dilinde mesaj olmadığında kullanılacak mesajı gösterir. Etiket alanı, mesajın hangi tarama türleri için görüntüleneceğini belirtir. Custom_messages (özel mesajlar) listesi herhangi bir giriş içermeyebilir veya birden fazla giriş içerebilir. Her girişin boş olmayan mesajı ve etiket alanları olmalıdır. + + Bu politika, yalnızca <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> üzerinden ayarlanabilir.</translation> <translation id="7246767840750730334">Telefon Merkezi bildirimlerinin etkinleştirilmesine izin ver.</translation> <translation id="7249828445670652637">ARC uygulamalarına ilişkin <ph name="PRODUCT_OS_NAME" /> CA sertifikalarını etkinleştir</translation> <translation id="7252681704926980614">Her yazdırma işinde kullanıcı adını ve dosya adını yerel yazıcı sunucusuna gönderir. Varsayılan ayar göndermemektir. @@ -4739,6 +4814,13 @@ <translation id="780629758750905699">Family Link hesaplarının cihaza eklenmesine izin ver</translation> <translation id="7807139251387225825">Senkronizasyonun dışında tutulması gereken türlerin listesi</translation> <translation id="781268256210530471">Eklenti ayarları</translation> +<translation id="7814528532170362496">Bu politika, güvenli olmayan URL'leri belirlemek için URL'lerin gerçek zamanlı olarak kontrol edilmesini denetler. + + Bu politika ayarlanmadan bırakılırsa veya "Devre Dışı" değerine ayarlanırsa tüketici Güvenli Tarama kontrolleri uygulanır. Tüketici Güvenli Tarama kontrolleri hem "Aramaları ve göz atmayı daha iyi yap" ayarının değerine hem de UrlKeyedAnonymizedDataCollectionEnabled politikasının değerine bağlı olarak gerçek zamanlı aramaları içermeye devam edebilir. + + Bu politika "Etkin" değerine ayarlanırsa URL'ler, kurumsal Hizmet Şartları kapsamında gerçek zamanlı olarak kontrol edilmek üzere gönderilir. Bu, Chrome'un gerçek zamanlı olarak kontrol etmek için URL'leri Google Cloud'a veya seçtiğiniz üçüncü taraflara göndermesine neden olur. Güvenli Tarama gerçek zamanlı aramanın tüketici sürümü kapatılır. + + Bu politika, yalnızca <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> üzerinden ayarlanabilir.</translation> <translation id="7816326058023670173">Çocuk ve ebeveyn cihazları arasında paylaşılan sır.</translation> <translation id="7818131573217430250">Giriş ekranında yüksek kontrast modunun varsayılan durumunu ayarla</translation> <translation id="7823902813460802031">Politika Etkin değerine ayarlanırsa <ph name="PRODUCT_OS_NAME" />, cihazın Geliştirici moduna girmesini engeller. @@ -5542,6 +5624,13 @@ Politika false (yanlış) değerine ayarlanırsa ses ve video için otomatik yükseltmeler devre dışı bırakılır ve görseller için herhangi bir uyarı gösterilmez. Bu politika ses, video ve görseller dışındaki diğer karma içerikleri etkilemez. Bu politika, <ph name="PRODUCT_NAME" /> 84 sürümünden itibaren geçerliliğini yitirecektir.</translation> +<translation id="9009505213521705952"><ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> Devre Dışı bırakılırsa politikayı ayarlamak, SSL hatası olan sitelere giden kullanıcıların, <ph name="PRODUCT_NAME" /> tarafından gösterilen uyarı sayfalarını hangi sitelerde atlayabileceklerini belirten kaynak kalıplarının olduğu bir liste yapmanıza olanak tanır. Kullanıcılar, bu listede olmayan kaynaklarda SSL uyarı sayfalarını atlayamaz. + + <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" />, Etkin değerine ayarlanır veya ayarlanmadan bırakılırsa bu politikanın bir işlevi olmaz. + + Politika ayarlanmadan bırakılırsa <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> bütün siteler için geçerli olur. + + Geçerli giriş kalıpları hakkında ayrıntılı bilgi için https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns adresine bakabilirsiniz. <ph name="WILDCARD_VALUE" />, bu politikada kabul edilen bir değer değildir. Bu politika, yalnızca kaynağa göre eşleşir. Dolayısıyla, URL kalıbındaki yollar yok sayılır.</translation> <translation id="9010080992450148617">Gelişmiş Koruma programına kayıtlı kullanıcıların indirdikleri dosyaları ayrıntılı tarama için Google'a göndermelerine izin ver</translation> <translation id="9013875414788074110"><ph name="PRODUCT_OS_NAME" /> giriş yapılırken bir sunucu (online) veya önbelleğe alınmış bir şifre (çevrimdışı) ile kimlik doğrulaması yapabilir.
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index d5b68d1..29ed836 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -452,6 +452,7 @@ 如果將這項政策設為 False,使用者就無法新增和設定自己的印表機,也無法使用任何先前設定過的印表機進行列印。 </translation> <translation id="1615221548356595305">即使在用戶端憑證已有人使用的情況下,仍允許這些主機合併 HTTP/2 連線</translation> +<translation id="1616280227447957376">允許忽略特定來源的 SSL 警告網頁繼續瀏覽</translation> <translation id="1617235075406854669">啟用刪除瀏覽器和下載記錄</translation> <translation id="1620510694547887537">攝影機</translation> <translation id="1626379196197114720">允許使用往返快取</translation> @@ -989,6 +990,7 @@ 拼字檢查功能一律可以使用本機下載的字典,但如果 <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> 政策停用此功能,這項政策就不會有任何作用。</translation> <translation id="2433516903565257847">應在指定天數後更新的裝置百分比。</translation> <translation id="2435052056904485763">Kerberos 委派伺服器許可清單</translation> +<translation id="2435232509335686514"><ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" /> 的下載檔案處理方式配置政策</translation> <translation id="2448315169529769573">如果將這項政策設為啟用,<ph name="PRODUCT_OS_NAME" />會將使用指標和診斷資料 (包括當機報告) 回報給 Google。如果將這項政策設為停用,系統會停用指標和診斷資料的報告功能。 如果未設定這項政策,系統會在未受管理的裝置上,將指標和診斷資料的報告功能保持停用,而在受管理的裝置上則保持啟用。</translation> @@ -1225,6 +1227,15 @@ <translation id="2757054304033424106">允許安裝的擴充功能/應用程式類型</translation> <translation id="2759224876420453487">控制使用者在多重設定檔工作階段中的行為</translation> <translation id="2761483219396643566">在電池供電環境下執行時的閒置警告延遲時間</translation> +<translation id="2764165704281937018">指定要套用 <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />的設定清單,這份清單會在下載檔案時觸發。 + + 從網頁執行下載作業時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_MIME_TYPES_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> 和 <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> 欄位來判斷連接器是否應將檔案傳送至服務供應商。相應的網頁網址必須符合與「enable」模式相關聯的模式,而非與「disable」模式相關聯的模式。該檔案的 MIME 類型也必須符合與「enable」模式相關聯的模式,而非與「disable」模式相關聯的模式。 + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 欄位可用來指定與設定對應的分析服務供應商。 + + <ph name="ENTERPRISE_CONNECTOR_ENTERPRISE_ID_FIELD" /> 欄位可用來指定服務供應商的對應企業。如果 <ph name="FILE_SYSTEM_ENTERPRISE_CONNECTOR" />的設定作業需要使用者登入,系統只會接受與該企業相關的使用者帳戶。 + + 這項政策只能透過 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />進行設定。</translation> <translation id="2769952903507981510">設定遠端存取主機所需的網域名稱</translation> <translation id="2772955711376920612">如果將這項政策設為啟用,同時設定 <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> 和 <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" />,電源尖峰轉移功能將保持在開啟狀態,前提是裝置提供相關支援。尖峰轉移電源管理政策是一項節電政策,能夠在用電尖峰時段將交流電的使用量降到最低。你可以針對每個平日,個別設定「電源尖峰轉移」模式的開始和結束時間。在這些時間範圍內,只要電池電量高於指定閾值,即使裝置已連接到交流電源,也仍會使用電池的電力。到達指定的結束時間後,如果裝置已連接到交流電源,則將改用交流電源,但不會為電池充電。到達指定的充電開始時間後,如果裝置已連接到交流電源,裝置一樣會使用交流電源運作,並為電池充電。 @@ -1307,6 +1318,23 @@ 如果將這項政策設為停用或不設定,已註冊的裝置不會回報 Android 狀態資訊</translation> <translation id="288923520817177650">允許建立 <ph name="WEBXR_API_NAME_SHORT" /> 的 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> 工作階段</translation> <translation id="2890645751406497668">自動授予權限給這些網站,以連結至指定廠商和產品 ID 的 USB 裝置。</translation> +<translation id="2892041629748346178">指定要套用至 <ph name="ON_FILE_DOWNLOADED_ENTERPRISE_CONNECTOR" /> Enterprise 連接器的 Chrome Enterprise 連接器服務設定清單,這份清單會在透過 Chrome 下載檔案時觸發。 + + 從特定網頁下載檔案時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> 欄位來判斷連接器是否要傳送檔案進行分析,以及要在該檔案的分析要求中加入哪些標記。系統會比對標記對應的模式,如果頁面網址符合與該標記相關聯的模式,且不符合該標記的「disable」模式,系統就會在分析要求中加入與「enable」模式對應的標記。當要求中加入至少 1 個標記,系統就會進行分析。 + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 欄位可用來指定與設定對應的分析服務供應商。 + + 如果將 <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> 欄位設為 1,Chrome 會先等候分析服務的回應,再授予使用者存取下載檔案的權限。如果設為其他整數值,Chrome 會立即授予使用者存取檔案的權限。 + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> 欄位可控制 Chrome 要封鎖還是允許受到密碼保護的檔案。 + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> 欄位可控制 Chrome 要封鎖還是允許超過檔案大小上限 (50 MB) 而無法分析的檔案。 + + 當掃描結果顯示可略過的警告時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> 欄位來判斷連接器該在哪些標記中要求使用者輸入略過掃描的原因。如果不設定這個欄位,系統會認定不需要輸入原因。 + + 當掃描結果判定檔案有問題時,系統會根據 <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> 和 <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> 欄位設定要向使用者顯示的訊息。message 欄位包含要向使用者顯示的文字,長度上限為 200 個字元。learn_more_url 欄位包含由管理員提供的網址,使用者點擊後可取得更多由客戶提供的資訊,瞭解動作遭到封鎖的原因。language 欄位為選填,包含訊息所用語言。如果將 language 欄位留空或設為「default」值,表示要使用的訊息不是以使用者語言設定的訊息。tag 欄位可供指定訊息顯示的掃描類型。custom_messages 清單可以有零或多個項目,每個項目都必須包括非空白的 message 和 tag 欄位。 + + 這項政策只能透過 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />進行設定。</translation> <translation id="2893546967669465276">將系統記錄傳送到管理伺服器</translation> <translation id="2899002520262095963">Android 應用程式可以使用透過這項政策指定的網路設定和 CA 憑證,但無法存取部分設定選項。</translation> <translation id="2899213072616346687">限制背景圖形列印模式。如未設定,系統會視為未設限制。</translation> @@ -1700,6 +1728,21 @@ <translation id="3412937883532015092">如果將這項政策設為數值,<ph name="PRODUCT_NAME" /> 在開啟替代瀏覽器前會先顯示一則等待訊息,並依據該數值 (以毫秒為單位) 來設定這則訊息要顯示多久的時間。 如果未設定這項政策或設為 0,當使用者前往指定網址時,系統會立即在替代瀏覽器中開啟該網址。</translation> +<translation id="3413215487296688603">指定要套用至 <ph name="ON_BULK_DATA_ENTRY_ENTERPRISE_CONNECTOR" /> Enterprise 連接器的 Chrome Enterprise 連接器服務設定清單,這份清單會在使用者以剪貼簿或拖曳網頁內容的方式在 Chrome 中輸入資料時觸發。 + + 在特定網頁中輸入資料時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> 欄位來判斷連接器是否要傳送資料進行分析,以及要在該資料的分析要求中加入哪些標記。系統會比對標記對應的模式,如果頁面網址符合與該標記相關聯的模式,且不符合該標記的「disable」模式,系統就會在分析要求中加入與「enable」模式對應的標記。當要求中加入至少 1 個標記,系統就會進行分析。 + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 欄位可用來指定與設定對應的分析服務供應商。 + + 如果將 <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> 欄位設為 1,Chrome 會先等候分析服務的回應,再授予頁面存取資料的權限。如果設為其他整數值,Chrome 會立即授予頁面存取資料的權限。 + + <ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE" /> 欄位代表在 Chrome 中輸入的資料大小下限 (以位元組為單位),要掃描的資料大小必須大於或等於這個值。如果不設定這個欄位,預設值為 100 個位元組。 + + 當掃描結果顯示可略過的警告時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> 欄位來判斷連接器該在哪些標記中要求使用者輸入略過掃描的原因。如果不設定這個欄位,系統會認定不需要輸入原因。 + + 當掃描結果判定檔案有問題時,系統會根據 <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> 和 <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> 欄位設定要向使用者顯示的訊息。message 欄位包含要向使用者顯示的文字,長度上限為 200 個字元。learn_more_url 欄位包含由管理員提供的網址,使用者點擊後可取得更多由客戶提供的資訊,瞭解動作遭到封鎖的原因。language 欄位為選填,包含訊息所用語言。如果將 language 欄位留空或設為「default」值,表示要使用的訊息不是以使用者語言設定的訊息。tag 欄位可供指定訊息顯示的掃描類型。custom_messages 清單可以有零或多個項目,每個項目都必須包括非空白的 message 和 tag 欄位。 + + 這項政策只能透過 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />進行設定。</translation> <translation id="3415954062311826850">ARC 不支援這項政策。</translation> <translation id="34160070798637152">控管裝置通用的網路設定。</translation> <translation id="3417130629744653218">允許網站查詢可用的付款方式。</translation> @@ -2323,6 +2366,11 @@ <translation id="4377599627073874279">允許所有網站顯示所有圖片</translation> <translation id="437791893267799639">未設定政策,不允許資料遷移和 ARC</translation> <translation id="4382413175336720282">已停用即時檢查網址的功能。</translation> +<translation id="4387741272680827493">你可以透過這項政策,指定可略過預先載入 HTTP 嚴格傳輸安全性升級 (從 http 至 https) 的主機名稱清單。 + + 這項政策只接受單一標籤主機名稱,而且只適用於「靜態」HTTP 嚴格傳輸安全性預先載入項目 (例如 <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />)。對於已使用 <ph name="HSTS_HEADER_NAME" /> 回應標頭「動態」要求 HTTP 嚴格傳輸安全性升級的伺服器,這項政策不會阻止伺服器進行升級。 + + 請務必提供標準化的主機名稱:所有 IDN 須轉換為單一標籤格式,而且所有 ASCII 字母須為小寫。這項政策只適用於指定的單一標籤主機名稱,不適用於這些主機名稱的子網域。</translation> <translation id="4387922553629365459">你可以透過這項政策設定網址模式清單,用於指定無法開啟彈出式視窗的網站。 如果未設定這項政策,系統會針對所有網站套用 <ph name="DEFAULT_POPUPS_SETTING_POLICY_NAME" /> 政策 (如果已設定)。否則系統會套用使用者的個人設定。 @@ -2934,6 +2982,11 @@ * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />:Chrome 會使用 <ph name="PROXY_BYPASS_LIST_PROXY_PAC_URL" /> 和 <ph name="PROXY_BYPASS_LIST_PROXY_SETTINGS_FIELD" /> 欄位。 注意:如需詳細範例,請前往 Chromium 計畫 (網址為 https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett )。</translation> +<translation id="5266173014392157048">這項政策已遭淘汰,請改用「<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />」政策。 + + 你可以透過這項政策,指派 <ph name="PRODUCT_NAME" /> 可能會委派的目標伺服器。每個伺服器名稱須以半形逗號分隔,亦可使用萬用字元 (<ph name="WILDCARD_VALUE" />)。 + + 如果未設定這項政策,即使 <ph name="PRODUCT_NAME" /> 偵測到內部網路伺服器,也不會委派使用者憑證。</translation> <translation id="5273744932022326215">在登入畫面上啟用游標醒目顯示無障礙功能。 如果將這項政策設為 True,系統將一律在登入畫面上啟用游標醒目顯示功能。 @@ -3458,6 +3511,11 @@ 如果將這項政策設為停用,使用者將無法兌換這類優惠。</translation> <translation id="6048199181629830227">開啟用電尖峰轉移電源管理功能</translation> <translation id="6053681087509103368">允許 WebRTC 使用過時的 TLD/DTLS 通訊協定版本</translation> +<translation id="605543517695935623">指定要套用至 <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> Enterprise 連接器的 Chrome Enterprise 連接器服務設定清單,這份清單會在 Chrome 中發生安全性事件時觸發。安全性事件包含分析 Enterprise 連接器指出的負面結果、重複使用密碼、瀏覽不安全的頁面,以及其他攸關安全性的使用者動作。 + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 欄位可用來指定與設定對應的報告服務供應商,<ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> 欄位則可用來指定針對這個供應商啟用的事件。 + + 這項政策只能透過 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />進行設定。</translation> <translation id="6058879286588763839">除非已指定會覆寫 <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" /> 的 <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" />,否則你可以透過設定 <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME" />,在支援的裝置上指定充電模式電源管理政策。為了延長電池壽命,這項政策會透過盡可能避免過度使用及損耗電池,以動態方式控制充電狀態。 如果在支援的裝置上不設定這項政策,系統會套用標準充電模式,且使用者無法變更設定。 @@ -4339,6 +4397,23 @@ 如未設定這項政策或將其留空,則使用者可以將任何 Google 帳戶設定為 <ph name="PRODUCT_NAME" /> 中的瀏覽器主要帳戶。</translation> <translation id="723103540848640830">設定螢幕鎖定 PIN 碼的長度下限</translation> <translation id="7234280155140786597">禁止的內建訊息傳遞主機名稱 (指定 * 表示涵蓋所有內建訊息傳遞主機)。</translation> +<translation id="72369543045636739">指定要套用至 <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" /> Enterprise 連接器的 Chrome Enterprise 連接器服務設定清單,這份清單會在檔案附加至 Chrome 時觸發。 + + 將檔案附加至特定網頁時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_URL_LIST_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" /> 和 <ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" /> 欄位來判斷連接器是否要傳送檔案進行分析,以及要在該檔案的分析要求中加入哪些標記。系統會比對標記對應的模式,如果頁面網址符合與該標記相關聯的模式,且不符合該標記的「disable」模式,系統就會在分析要求中加入與「enable」模式對應的標記。當要求中加入至少 1 個標記,系統就會進行分析。 + + <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 欄位可用來指定與設定對應的分析服務供應商。 + + 如果將 <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD" /> 欄位設為 1,Chrome 會先等候分析服務的回應,再授予頁面存取檔案的權限。如果設為其他整數值,Chrome 會立即授予頁面存取檔案的權限。 + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD" /> 欄位可控制 Chrome 要封鎖還是允許受到密碼保護的檔案。 + + <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD" /> 欄位可控制 Chrome 要封鎖還是允許超過檔案大小上限 (50 MB) 而無法分析的檔案。 + + 當掃描結果顯示可略過的警告時,系統會使用 <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD" /> 欄位來判斷連接器該在哪些標記中要求使用者輸入略過掃描的原因。如果不設定這個欄位,系統會認定不需要輸入原因。 + + 當掃描結果判定檔案有問題時,系統會根據 <ph name="ENTERPRISE_CONNECTOR_CUSTOM_MESSAGES_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_MESSAGE_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_LEARN_MORE_URL_FIELD" />、<ph name="ENTERPRISE_CONNECTOR_LANGUAGE_FIELD" /> 和 <ph name="ENTERPRISE_CONNECTOR_TAG_FIELD" /> 欄位設定要向使用者顯示的訊息。message 欄位包含要向使用者顯示的文字,長度上限為 200 個字元。learn_more_url 欄位包含由管理員提供的網址,使用者點擊後可取得更多由客戶提供的資訊,瞭解動作遭到封鎖的原因。language 欄位為選填,包含訊息所用語言。如果將 language 欄位留空或設為「default」值,表示要使用的訊息不是以使用者語言設定的訊息。tag 欄位可供指定訊息顯示的掃描類型。custom_messages 清單可以有零或多個項目,每個項目都必須包括非空白的 message 和 tag 欄位。 + + 這項政策只能透過 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />進行設定。</translation> <translation id="7246767840750730334">允許啟用 Phone Hub 通知。</translation> <translation id="7249828445670652637">允許 ARC 應用程式使用「<ph name="PRODUCT_OS_NAME" />」CA 憑證</translation> <translation id="7252681704926980614">在每個列印工作中,將使用者名稱和檔案名稱傳送給原生印表機伺服器。系統預設為不傳送。 @@ -4703,6 +4778,13 @@ <translation id="780629758750905699">允許將 Family Link 帳戶加入裝置</translation> <translation id="7807139251387225825">要從同步處理作業中排除的類型清單</translation> <translation id="781268256210530471">外掛程式設定</translation> +<translation id="7814528532170362496">這項政策可控管即時檢查網址,用於識別不安全的網址。 + + 如果不設定這項政策或設為「停用」,系統會執行一般使用者的安全瀏覽檢查。一般使用者的安全瀏覽檢查仍可能包含即時查詢,實際情況取決於「改善搜尋和瀏覽體驗」的設定值和 UrlKeyedAnonymizedDataCollectionEnabled 政策的值。 + + 如果將這項政策設為「啟用」,系統會依照《Chrome Enterprise 服務條款》傳送網址進行即時掃描。Chrome 會將網址傳送給 Google Cloud 或第三方,以便依照你的選擇進行即時檢查。系統會關閉一般使用者版本的安全瀏覽即時查詢功能。 + + 這項政策只能透過 <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />進行設定。</translation> <translation id="7816326058023670173">兒童和家長的裝置所共用的密鑰。</translation> <translation id="7818131573217430250">設定高反差模式在登入畫面的預設狀態</translation> <translation id="7823902813460802031">如果將這項政策設為啟用,<ph name="PRODUCT_OS_NAME" />會阻止裝置進入開發人員模式。 @@ -5510,6 +5592,13 @@ 如果將這項政策設為 False,系統會停用音訊和影片的自動升級功能,且不會針對圖片顯示警告訊息。 這項政策只會影響類型為音訊、影片和圖片的複合型內容。 這項政策將自 <ph name="PRODUCT_NAME" /> 第 84 版起失效。</translation> +<translation id="9009505213521705952">如果 <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> 已停用,你可以透過這項政策設定來源模式清單,用於指定當使用者瀏覽哪些具有 SSL 錯誤的網站時,可以忽略 <ph name="PRODUCT_NAME" /> 顯示的警告網頁,繼續前往該網站。對於不在這份清單中的來源網站,使用者將無法忽略相關的 SSL 警告網頁前往瀏覽。 + + 如果 <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> 已啟用或未設定,這項政策就沒有任何作用。 + + 如果未設定這項政策,系統就會針對所有網站套用 <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> 政策。 + + 想進一步瞭解有效的輸入模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。<ph name="WILDCARD_VALUE" /> 不是這項政策許可的值。這項政策只會根據來源進行比對,因此會忽略網址模式中的路徑。</translation> <translation id="9010080992450148617">加入進階保護計畫的使用者可以將下載內容傳送至 Google 進行深度掃描</translation> <translation id="9013875414788074110">在登入時,<ph name="PRODUCT_OS_NAME" />可以透過伺服器進行線上驗證,或使用快取密碼進行離線驗證。
diff --git a/components/safe_browsing/content/password_protection/password_protection_service_base.cc b/components/safe_browsing/content/password_protection/password_protection_service_base.cc deleted file mode 100644 index aacb5e8..0000000 --- a/components/safe_browsing/content/password_protection/password_protection_service_base.cc +++ /dev/null
@@ -1,417 +0,0 @@ -// Copyright 2021 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 "components/safe_browsing/content/password_protection/password_protection_service_base.h" - -#include <stddef.h> - -#include <memory> -#include <string> - -#include "base/bind.h" -#include "base/callback.h" -#include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_split.h" -#include "base/strings/string_util.h" -#include "components/password_manager/core/browser/password_manager_metrics_util.h" -#include "components/password_manager/core/browser/password_reuse_detector.h" -#include "components/safe_browsing/content/password_protection/password_protection_request.h" -#include "components/safe_browsing/core/common/thread_utils.h" -#include "components/safe_browsing/core/common/utils.h" -#include "components/safe_browsing/core/db/database_manager.h" -#include "components/safe_browsing/core/features.h" -#include "google_apis/google_api_keys.h" -#include "net/base/escape.h" -#include "net/base/url_util.h" - -using password_manager::metrics_util::PasswordType; - -namespace safe_browsing { - -using PasswordReuseEvent = LoginReputationClientRequest::PasswordReuseEvent; - -namespace { - -// Keys for storing password protection verdict into a DictionaryValue. -const int kRequestTimeoutMs = 10000; -const char kPasswordProtectionRequestUrl[] = - "https://sb-ssl.google.com/safebrowsing/clientreport/login"; - -} // namespace - -PasswordProtectionServiceBase::PasswordProtectionServiceBase( - const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - history::HistoryService* history_service) - : database_manager_(database_manager), - url_loader_factory_(url_loader_factory) { - DCHECK(CurrentlyOnThread(ThreadID::UI)); - if (history_service) - history_service_observation_.Observe(history_service); - - common_spoofed_domains_ = {"login.live.com", "facebook.com", "box.com", - "google.com", "paypal.com", "apple.com", - "yahoo.com", "adobe.com", "amazon.com", - "linkedin.com"}; -} - -PasswordProtectionServiceBase::~PasswordProtectionServiceBase() { - tracker_.TryCancelAll(); - CancelPendingRequests(); - history_service_observation_.Reset(); - weak_factory_.InvalidateWeakPtrs(); -} - -// static -bool PasswordProtectionServiceBase::CanGetReputationOfURL(const GURL& url) { - if (!safe_browsing::CanGetReputationOfUrl(url)) { - return false; - } - const std::string hostname = url.HostNoBrackets(); - return !net::IsHostnameNonUnique(hostname); -} - -bool PasswordProtectionServiceBase::ShouldShowModalWarning( - LoginReputationClientRequest::TriggerType trigger_type, - ReusedPasswordAccountType password_type, - LoginReputationClientResponse::VerdictType verdict_type) { - if (trigger_type != LoginReputationClientRequest::PASSWORD_REUSE_EVENT || - !IsSupportedPasswordTypeForModalWarning(password_type)) { - return false; - } - - return (verdict_type == LoginReputationClientResponse::PHISHING || - verdict_type == LoginReputationClientResponse::LOW_REPUTATION) && - IsWarningEnabled(password_type); -} - -LoginReputationClientResponse::VerdictType -PasswordProtectionServiceBase::GetCachedVerdict( - const GURL& url, - LoginReputationClientRequest::TriggerType trigger_type, - ReusedPasswordAccountType password_type, - LoginReputationClientResponse* out_response) { - return LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED; -} - -void PasswordProtectionServiceBase::CacheVerdict( - const GURL& url, - LoginReputationClientRequest::TriggerType trigger_type, - ReusedPasswordAccountType password_type, - const LoginReputationClientResponse& verdict, - const base::Time& receive_time) {} - -bool PasswordProtectionServiceBase::CanSendPing( - LoginReputationClientRequest::TriggerType trigger_type, - const GURL& main_frame_url, - ReusedPasswordAccountType password_type) { - return IsPingingEnabled(trigger_type, password_type) && - !IsURLAllowlistedForPasswordEntry(main_frame_url) && - !IsInExcludedCountry(); -} - -void PasswordProtectionServiceBase::RequestFinished( - PasswordProtectionRequest* request, - RequestOutcome outcome, - std::unique_ptr<LoginReputationClientResponse> response) { - DCHECK(CurrentlyOnThread(ThreadID::UI)); - DCHECK(request); - - if (response) { - ReusedPasswordAccountType password_type = - GetPasswordProtectionReusedPasswordAccountType(request->password_type(), - request->username()); - if (outcome != RequestOutcome::RESPONSE_ALREADY_CACHED) { - CacheVerdict(request->main_frame_url(), request->trigger_type(), - password_type, *response, base::Time::Now()); - } - bool enable_warning_for_non_sync_users = base::FeatureList::IsEnabled( - safe_browsing::kPasswordProtectionForSignedInUsers); - if (!enable_warning_for_non_sync_users && - request->password_type() == PasswordType::OTHER_GAIA_PASSWORD) { - return; - } - - // If it's password alert mode and a Gsuite/enterprise account, we do not - // show a modal warning. - if (outcome == RequestOutcome::PASSWORD_ALERT_MODE && - (password_type.account_type() == ReusedPasswordAccountType::GSUITE || - password_type.account_type() == - ReusedPasswordAccountType::NON_GAIA_ENTERPRISE)) { - return; - } - - if (ShouldShowModalWarning(request->trigger_type(), password_type, - response->verdict_type())) { - username_for_last_shown_warning_ = request->username(); - reused_password_account_type_for_last_shown_warning_ = password_type; - saved_passwords_matching_domains_ = request->matching_domains(); - ShowModalWarning(request, response->verdict_type(), - response->verdict_token(), password_type); - request->set_is_modal_warning_showing(true); - } - } - - MaybeHandleDeferredNavigations(request); - - // If the request is canceled, the PasswordProtectionServiceBase is already - // partially destroyed, and we won't be able to log accurate metrics. - if (outcome != RequestOutcome::CANCELED) { - auto verdict = - response ? response->verdict_type() - : LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED; - -// Disabled on Android, because enterprise reporting extension is not supported. -#if !defined(OS_ANDROID) - MaybeReportPasswordReuseDetected( - request, request->username(), request->password_type(), - verdict == LoginReputationClientResponse::PHISHING); -#endif - - // Persist a bit in CompromisedCredentials table when saved password is - // reused on a phishing or low reputation site. - auto is_unsafe_url = - verdict == LoginReputationClientResponse::PHISHING || - verdict == LoginReputationClientResponse::LOW_REPUTATION; - if (is_unsafe_url) { - PersistPhishedSavedPasswordCredential( - request->matching_reused_credentials()); - } - } - - // Remove request from |pending_requests_| list. If it triggers warning, add - // it into the !warning_reqeusts_| list. - for (auto it = pending_requests_.begin(); it != pending_requests_.end(); - it++) { - if (it->get() == request) { - if (request->is_modal_warning_showing()) - warning_requests_.insert(std::move(request)); - pending_requests_.erase(it); - break; - } - } -} - -void PasswordProtectionServiceBase::CancelPendingRequests() { - DCHECK(CurrentlyOnThread(ThreadID::UI)); - for (auto it = pending_requests_.begin(); it != pending_requests_.end();) { - PasswordProtectionRequest* request = it->get(); - // These are the requests for whom we're still waiting for verdicts. - // We need to advance the iterator before we cancel because canceling - // the request will invalidate it when RequestFinished is called. - it++; - request->Cancel(false); - } - DCHECK(pending_requests_.empty()); -} - -int PasswordProtectionServiceBase::GetStoredVerdictCount( - LoginReputationClientRequest::TriggerType trigger_type) { - return -1; -} - -scoped_refptr<SafeBrowsingDatabaseManager> -PasswordProtectionServiceBase::database_manager() { - return database_manager_; -} - -// static -GURL PasswordProtectionServiceBase::GetPasswordProtectionRequestUrl() { - GURL url(kPasswordProtectionRequestUrl); - std::string api_key = google_apis::GetAPIKey(); - DCHECK(!api_key.empty()); - return url.Resolve("?key=" + net::EscapeQueryParamValue(api_key, true)); -} - -// static -int PasswordProtectionServiceBase::GetRequestTimeoutInMS() { - return kRequestTimeoutMs; -} - -void PasswordProtectionServiceBase::FillUserPopulation( - LoginReputationClientRequest::TriggerType trigger_type, - LoginReputationClientRequest* request_proto) { - ChromeUserPopulation* user_population = request_proto->mutable_population(); - user_population->set_user_population( - IsEnhancedProtection() - ? ChromeUserPopulation::ENHANCED_PROTECTION - : IsExtendedReporting() ? ChromeUserPopulation::EXTENDED_REPORTING - : ChromeUserPopulation::SAFE_BROWSING); - user_population->set_profile_management_status( - GetProfileManagementStatus(GetBrowserPolicyConnector())); - user_population->set_is_history_sync_enabled(IsHistorySyncEnabled()); -#if BUILDFLAG(FULL_SAFE_BROWSING) - user_population->set_is_under_advanced_protection( - IsUnderAdvancedProtection()); -#endif - user_population->set_is_incognito(IsIncognito()); - user_population->set_is_mbb_enabled(IsUserMBBOptedIn()); -} - -void PasswordProtectionServiceBase::OnURLsDeleted( - history::HistoryService* history_service, - const history::DeletionInfo& deletion_info) { - GetTaskRunner(ThreadID::UI) - ->PostTask( - FROM_HERE, - base::BindRepeating(&PasswordProtectionServiceBase:: - RemoveUnhandledSyncPasswordReuseOnURLsDeleted, - GetWeakPtr(), deletion_info.IsAllHistory(), - deletion_info.deleted_rows())); -} - -void PasswordProtectionServiceBase::HistoryServiceBeingDeleted( - history::HistoryService* history_service) { - DCHECK(history_service_observation_.IsObservingSource(history_service)); - history_service_observation_.Reset(); -} - -bool PasswordProtectionServiceBase::IsWarningEnabled( - ReusedPasswordAccountType password_type) { - return GetPasswordProtectionWarningTriggerPref(password_type) == - PHISHING_REUSE; -} - -// static -ReusedPasswordType -PasswordProtectionServiceBase::GetPasswordProtectionReusedPasswordType( - password_manager::metrics_util::PasswordType password_type) { - switch (password_type) { - case PasswordType::SAVED_PASSWORD: - return PasswordReuseEvent::SAVED_PASSWORD; - case PasswordType::PRIMARY_ACCOUNT_PASSWORD: - return PasswordReuseEvent::SIGN_IN_PASSWORD; - case PasswordType::OTHER_GAIA_PASSWORD: - return PasswordReuseEvent::OTHER_GAIA_PASSWORD; - case PasswordType::ENTERPRISE_PASSWORD: - return PasswordReuseEvent::ENTERPRISE_PASSWORD; - case PasswordType::PASSWORD_TYPE_UNKNOWN: - return PasswordReuseEvent::REUSED_PASSWORD_TYPE_UNKNOWN; - case PasswordType::PASSWORD_TYPE_COUNT: - break; - } - NOTREACHED(); - return PasswordReuseEvent::REUSED_PASSWORD_TYPE_UNKNOWN; -} - -ReusedPasswordAccountType -PasswordProtectionServiceBase::GetPasswordProtectionReusedPasswordAccountType( - password_manager::metrics_util::PasswordType password_type, - const std::string& username) const { - ReusedPasswordAccountType reused_password_account_type; - switch (password_type) { - case PasswordType::SAVED_PASSWORD: - reused_password_account_type.set_account_type( - ReusedPasswordAccountType::SAVED_PASSWORD); - return reused_password_account_type; - case PasswordType::ENTERPRISE_PASSWORD: - reused_password_account_type.set_account_type( - ReusedPasswordAccountType::NON_GAIA_ENTERPRISE); - return reused_password_account_type; - case PasswordType::PRIMARY_ACCOUNT_PASSWORD: { - reused_password_account_type.set_is_account_syncing( - IsPrimaryAccountSyncing()); - if (!IsPrimaryAccountSignedIn()) { - reused_password_account_type.set_account_type( - ReusedPasswordAccountType::UNKNOWN); - return reused_password_account_type; - } - reused_password_account_type.set_account_type( - IsPrimaryAccountGmail() ? ReusedPasswordAccountType::GMAIL - : ReusedPasswordAccountType::GSUITE); - return reused_password_account_type; - } - case PasswordType::OTHER_GAIA_PASSWORD: { - AccountInfo account_info = GetSignedInNonSyncAccount(username); - if (account_info.account_id.empty()) { - reused_password_account_type.set_account_type( - ReusedPasswordAccountType::UNKNOWN); - return reused_password_account_type; - } - reused_password_account_type.set_account_type( - IsOtherGaiaAccountGmail(username) - ? ReusedPasswordAccountType::GMAIL - : ReusedPasswordAccountType::GSUITE); - return reused_password_account_type; - } - case PasswordType::PASSWORD_TYPE_UNKNOWN: - case PasswordType::PASSWORD_TYPE_COUNT: - reused_password_account_type.set_account_type( - ReusedPasswordAccountType::UNKNOWN); - return reused_password_account_type; - } - NOTREACHED(); - return reused_password_account_type; -} - -// static -PasswordType -PasswordProtectionServiceBase::ConvertReusedPasswordAccountTypeToPasswordType( - ReusedPasswordAccountType password_type) { - if (password_type.is_account_syncing()) { - return PasswordType::PRIMARY_ACCOUNT_PASSWORD; - } else if (password_type.account_type() == - ReusedPasswordAccountType::NON_GAIA_ENTERPRISE) { - return PasswordType::ENTERPRISE_PASSWORD; - } else if (password_type.account_type() == - ReusedPasswordAccountType::SAVED_PASSWORD) { - return PasswordType::SAVED_PASSWORD; - } else if (password_type.account_type() == - ReusedPasswordAccountType::UNKNOWN) { - return PasswordType::PASSWORD_TYPE_UNKNOWN; - } else { - return PasswordType::OTHER_GAIA_PASSWORD; - } -} - -bool PasswordProtectionServiceBase::IsSupportedPasswordTypeForPinging( - PasswordType password_type) const { - switch (password_type) { - case PasswordType::SAVED_PASSWORD: - return true; - case PasswordType::PRIMARY_ACCOUNT_PASSWORD: - return true; - case PasswordType::ENTERPRISE_PASSWORD: - return true; - case PasswordType::OTHER_GAIA_PASSWORD: - return base::FeatureList::IsEnabled( - safe_browsing::kPasswordProtectionForSignedInUsers); - case PasswordType::PASSWORD_TYPE_UNKNOWN: - case PasswordType::PASSWORD_TYPE_COUNT: - return false; - } - NOTREACHED(); - return false; -} - -bool PasswordProtectionServiceBase::IsSupportedPasswordTypeForModalWarning( - ReusedPasswordAccountType password_type) const { - if (password_type.account_type() == - ReusedPasswordAccountType::SAVED_PASSWORD && - base::FeatureList::IsEnabled( - safe_browsing::kPasswordProtectionForSavedPasswords)) - return true; - -// Currently password reuse warnings are only supported for saved passwords on -// Android. -#if defined(OS_ANDROID) - return false; -#else - if (password_type.account_type() == - ReusedPasswordAccountType::NON_GAIA_ENTERPRISE) - return true; - - if (password_type.account_type() != ReusedPasswordAccountType::GMAIL && - password_type.account_type() != ReusedPasswordAccountType::GSUITE) - return false; - - return password_type.is_account_syncing() || - base::FeatureList::IsEnabled( - safe_browsing::kPasswordProtectionForSignedInUsers); -#endif -} - -} // namespace safe_browsing
diff --git a/components/safe_browsing/content/password_protection/password_protection_service_base.h b/components/safe_browsing/content/password_protection/password_protection_service_base.h deleted file mode 100644 index 5291971..0000000 --- a/components/safe_browsing/content/password_protection/password_protection_service_base.h +++ /dev/null
@@ -1,454 +0,0 @@ -// Copyright 2021 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 COMPONENTS_SAFE_BROWSING_CONTENT_PASSWORD_PROTECTION_PASSWORD_PROTECTION_SERVICE_BASE_H_ -#define COMPONENTS_SAFE_BROWSING_CONTENT_PASSWORD_PROTECTION_PASSWORD_PROTECTION_SERVICE_BASE_H_ - -#include <set> - -#include "base/feature_list.h" -#include "base/gtest_prod_util.h" -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "base/scoped_observation.h" -#include "base/task/cancelable_task_tracker.h" -#include "base/values.h" -#include "build/build_config.h" -#include "components/history/core/browser/history_service.h" -#include "components/history/core/browser/history_service_observer.h" -#include "components/password_manager/core/browser/password_manager_metrics_util.h" -#include "components/password_manager/core/browser/password_reuse_detector.h" -#include "components/safe_browsing/buildflags.h" -#include "components/safe_browsing/core/browser/referrer_chain_provider.h" -#include "components/safe_browsing/core/common/safe_browsing_prefs.h" -#include "components/safe_browsing/core/db/v4_protocol_manager_util.h" -#include "components/safe_browsing/core/password_protection/metrics_util.h" -#include "components/safe_browsing/core/proto/csd.pb.h" -#include "components/sessions/core/session_id.h" -#include "components/signin/public/identity_manager/account_info.h" -#include "services/network/public/cpp/shared_url_loader_factory.h" -#include "services/service_manager/public/cpp/interface_provider.h" -#include "third_party/protobuf/src/google/protobuf/repeated_field.h" - -namespace policy { -class BrowserPolicyConnector; -} - -class GURL; - -namespace safe_browsing { - -class PasswordProtectionRequest; -class SafeBrowsingDatabaseManager; - -using ReusedPasswordAccountType = - LoginReputationClientRequest::PasswordReuseEvent::ReusedPasswordAccountType; -using ReusedPasswordType = - LoginReputationClientRequest::PasswordReuseEvent::ReusedPasswordType; -using password_manager::metrics_util::PasswordType; - -// Manage password protection pings and verdicts. There is one instance of this -// class per profile. Therefore, every PasswordProtectionServiceBase instance is -// associated with a unique HistoryService instance and a unique -// HostContentSettingsMap instance. -class PasswordProtectionServiceBase : public history::HistoryServiceObserver { - public: - PasswordProtectionServiceBase( - const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - history::HistoryService* history_service); - - ~PasswordProtectionServiceBase() override; - - base::WeakPtr<PasswordProtectionServiceBase> GetWeakPtr() { - return weak_factory_.GetWeakPtr(); - } - - // Looks up |settings| to find the cached verdict response. If verdict is not - // available or is expired, return VERDICT_TYPE_UNSPECIFIED. Can be called on - // any thread. - virtual LoginReputationClientResponse::VerdictType GetCachedVerdict( - const GURL& url, - LoginReputationClientRequest::TriggerType trigger_type, - ReusedPasswordAccountType password_type, - LoginReputationClientResponse* out_response); - - // Stores |verdict| in |settings| based on its |trigger_type|, |url|, - // reused |password_type|, |verdict| and |receive_time|. - virtual void CacheVerdict( - const GURL& url, - LoginReputationClientRequest::TriggerType trigger_type, - ReusedPasswordAccountType password_type, - const LoginReputationClientResponse& verdict, - const base::Time& receive_time); - - // If we want to show password reuse modal warning. - bool ShouldShowModalWarning( - LoginReputationClientRequest::TriggerType trigger_type, - ReusedPasswordAccountType password_type, - LoginReputationClientResponse::VerdictType verdict_type); - - // Shows modal warning dialog on the current |web_contents| and pass the - // |verdict_token| to callback of this dialog. - virtual void ShowModalWarning( - PasswordProtectionRequest* request, - LoginReputationClientResponse::VerdictType verdict_type, - const std::string& verdict_token, - ReusedPasswordAccountType password_type) = 0; - -// The following functions are disabled on Android, because enterprise reporting -// extension is not supported. -#if !defined(OS_ANDROID) - // Triggers the safeBrowsingPrivate.OnPolicySpecifiedPasswordReuseDetected. - virtual void MaybeReportPasswordReuseDetected( - PasswordProtectionRequest* request, - const std::string& username, - PasswordType password_type, - bool is_phishing_url) = 0; - - // Called when a protected password change is detected. Must be called on - // UI thread. - virtual void ReportPasswordChanged() = 0; -#endif - - scoped_refptr<SafeBrowsingDatabaseManager> database_manager(); - - // Safe Browsing backend cannot get a reliable reputation of a URL if - // (1) URL is not valid - // (2) URL doesn't have http or https scheme - // (3) It maps to a local host. - // (4) Its hostname is an IP Address in an IANA-reserved range. - // (5) Its hostname is a not-yet-assigned by ICANN gTLD. - // (6) Its hostname is a dotless domain. - static bool CanGetReputationOfURL(const GURL& url); - - // If user has clicked through any Safe Browsing interstitial for |request|'s - // web contents. - virtual bool UserClickedThroughSBInterstitial( - PasswordProtectionRequest* request) = 0; - - // Returns if the warning UI is enabled. - bool IsWarningEnabled(ReusedPasswordAccountType password_type); - - // Returns the pref value of password protection warning trigger. - virtual PasswordProtectionTrigger GetPasswordProtectionWarningTriggerPref( - ReusedPasswordAccountType password_type) const = 0; - - // If |url| matches Safe Browsing allowlist domains, password protection - // change password URL, or password protection login URLs in the enterprise - // policy. - virtual bool IsURLAllowlistedForPasswordEntry(const GURL& url) const = 0; - - // Persist the phished saved password credential in the "compromised - // credentials" table. Calls the password store to add a row for each - // MatchingReusedCredential where the phished saved password is used on. - virtual void PersistPhishedSavedPasswordCredential( - const std::vector<password_manager::MatchingReusedCredential>& - matching_reused_credentials) = 0; - - // Remove all rows of the phished saved password credential in the - // "compromised credentials" table. Calls the password store to remove a row - // for each - virtual void RemovePhishedSavedPasswordCredential( - const std::vector<password_manager::MatchingReusedCredential>& - matching_reused_credentials) = 0; - - // Converts from password::metrics_util::PasswordType to - // LoginReputationClientRequest::PasswordReuseEvent::ReusedPasswordType. - static ReusedPasswordType GetPasswordProtectionReusedPasswordType( - PasswordType password_type); - - // Converts from password_manager::metrics_util::PasswordType - // to PasswordReuseEvent::ReusedPasswordAccountType. |username| is only - // used if |password_type| is OTHER_GAIA_PASSWORD because it needs to be - // compared to the list of signed in accounts. - ReusedPasswordAccountType GetPasswordProtectionReusedPasswordAccountType( - PasswordType password_type, - const std::string& username) const; - - // Converts from ReusedPasswordAccountType to - // password_manager::metrics_util::PasswordType. - static PasswordType ConvertReusedPasswordAccountTypeToPasswordType( - ReusedPasswordAccountType password_type); - - // If we can send ping for this type of reused password. - bool IsSupportedPasswordTypeForPinging(PasswordType password_type) const; - - // If we can show modal warning for this type of reused password. - bool IsSupportedPasswordTypeForModalWarning( - ReusedPasswordAccountType password_type) const; - - const ReusedPasswordAccountType& - reused_password_account_type_for_last_shown_warning() const { - return reused_password_account_type_for_last_shown_warning_; - } -#if defined(UNIT_TEST) - void set_reused_password_account_type_for_last_shown_warning( - ReusedPasswordAccountType - reused_password_account_type_for_last_shown_warning) { - reused_password_account_type_for_last_shown_warning_ = - reused_password_account_type_for_last_shown_warning; - } -#endif - - const std::string& username_for_last_shown_warning() const { - return username_for_last_shown_warning_; - } -#if defined(UNIT_TEST) - void set_username_for_last_shown_warning(const std::string& username) { - username_for_last_shown_warning_ = username; - } -#endif - - const std::vector<password_manager::MatchingReusedCredential>& - saved_passwords_matching_reused_credentials() const { - return saved_passwords_matching_reused_credentials_; - } -#if defined(UNIT_TEST) - void set_saved_passwords_matching_reused_credentials( - const std::vector<password_manager::MatchingReusedCredential>& - credentials) { - saved_passwords_matching_reused_credentials_ = credentials; - } -#endif - const std::vector<std::string>& saved_passwords_matching_domains() const { - return saved_passwords_matching_domains_; - } -#if defined(UNIT_TEST) - void set_saved_passwords_matching_domains( - const std::vector<std::string>& matching_domains) { - saved_passwords_matching_domains_ = matching_domains; - } -#endif - - virtual AccountInfo GetAccountInfo() const = 0; - - // Returns the URL where PasswordProtectionRequest instances send requests. - static GURL GetPasswordProtectionRequestUrl(); - - protected: - friend class PasswordProtectionRequest; - friend class PasswordProtectionRequestContent; - - // Chrome can send password protection ping if it is allowed by for the - // |trigger_type| and |password_type| and if Safe Browsing can compute - // reputation of |main_frame_url| (e.g. Safe Browsing is not able to compute - // reputation of a private IP or a local host). - bool CanSendPing(LoginReputationClientRequest::TriggerType trigger_type, - const GURL& main_frame_url, - ReusedPasswordAccountType password_type); - - // Called by a PasswordProtectionRequest instance when it finishes to remove - // itself from |requests_|. - virtual void RequestFinished( - PasswordProtectionRequest* request, - RequestOutcome outcome, - std::unique_ptr<LoginReputationClientResponse> response); - - // Called by a PasswordProtectionRequest instance to check if a sample ping - // can be sent to Safe Browsing. - virtual bool CanSendSamplePing() = 0; - - // Sanitize referrer chain by only keeping origin information of all URLs. - virtual void SanitizeReferrerChain(ReferrerChain* referrer_chain) = 0; - - // Cancels all requests in |requests_|, empties it, and releases references to - // the requests. - void CancelPendingRequests(); - - // Gets the total number of verdicts of the specified |trigger_type| we cached - // for this profile. This counts both expired and active verdicts. - virtual int GetStoredVerdictCount( - LoginReputationClientRequest::TriggerType trigger_type); - - // Gets an unowned |BrowserPolicyConnector| for the current platform. - virtual const policy::BrowserPolicyConnector* GetBrowserPolicyConnector() - const = 0; - - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory() { - return url_loader_factory_; - } - - // Gets the request timeout in milliseconds. - static int GetRequestTimeoutInMS(); - - // Obtains referrer chain of |event_url| and |event_tab_id| and adds this - // info into |frame|. - virtual void FillReferrerChain( - const GURL& event_url, - SessionID - event_tab_id, // SessionID::InvalidValue() if tab not available. - LoginReputationClientRequest::Frame* frame) = 0; - - void FillUserPopulation( - LoginReputationClientRequest::TriggerType trigger_type, - LoginReputationClientRequest* request_proto); - - virtual bool IsExtendedReporting() = 0; - - virtual bool IsEnhancedProtection() = 0; - - virtual bool IsIncognito() = 0; - - virtual bool IsUserMBBOptedIn() = 0; - - virtual bool IsInPasswordAlertMode( - ReusedPasswordAccountType password_type) = 0; - - virtual bool IsPingingEnabled( - LoginReputationClientRequest::TriggerType trigger_type, - ReusedPasswordAccountType password_type) = 0; - - virtual bool IsHistorySyncEnabled() = 0; - - // If primary account is syncing. - virtual bool IsPrimaryAccountSyncing() const = 0; - - // If primary account is signed in. - virtual bool IsPrimaryAccountSignedIn() const = 0; - - // If a domain is not defined for the primary account. This means the primary - // account is a Gmail account. - virtual bool IsPrimaryAccountGmail() const = 0; - - // If the domain for the non sync account is equal to |kNoHostedDomainFound|, - // this means that the account is a Gmail account. - virtual bool IsOtherGaiaAccountGmail(const std::string& username) const = 0; - - // Gets the account based off of the username from a list of signed in - // accounts. - virtual AccountInfo GetSignedInNonSyncAccount( - const std::string& username) const = 0; - -#if BUILDFLAG(FULL_SAFE_BROWSING) - virtual bool IsUnderAdvancedProtection() = 0; -#endif - - // If Safe browsing endpoint is not enabled in the country. - virtual bool IsInExcludedCountry() = 0; - - // Determines if we should show chrome://reset-password interstitial based on - // the reused |password_type| and the |main_frame_url|. - virtual bool CanShowInterstitial(ReusedPasswordAccountType password_type, - const GURL& main_frame_url) = 0; - - void CheckCsdAllowlistOnIOThread(const GURL& url, bool* check_result); - - // Gets the type of sync account associated with current profile or - // |NOT_SIGNED_IN|. - virtual LoginReputationClientRequest::PasswordReuseEvent::SyncAccountType - GetSyncAccountType() const = 0; - - // Get information about Delayed Warnings and Omnibox URL display experiments. - // This information is sent in PhishGuard pings. - virtual LoginReputationClientRequest::UrlDisplayExperiment - GetUrlDisplayExperiment() const = 0; - - // Returns the reason why a ping is not sent based on the |trigger_type|, - // |url| and |password_type|. Crash if |CanSendPing| is true. - virtual RequestOutcome GetPingNotSentReason( - LoginReputationClientRequest::TriggerType trigger_type, - const GURL& url, - ReusedPasswordAccountType password_type) = 0; - - const std::list<std::string>& common_spoofed_domains() const { - return common_spoofed_domains_; - } - - // Subclasses may override this method to either cancel or resume deferred - // navigations. By default, deferred navigations are not handled. - virtual void MaybeHandleDeferredNavigations( - PasswordProtectionRequest* request) {} - - // Set of pending PasswordProtectionRequests that are still waiting for - // verdict. - std::set<scoped_refptr<PasswordProtectionRequest>> pending_requests_; - - // Set of PasswordProtectionRequests that are triggering modal warnings. - std::set<scoped_refptr<PasswordProtectionRequest>> warning_requests_; - - // The username of the account which password has been reused on. It is only - // set once a modal warning or interstitial is verified to be shown. - std::string username_for_last_shown_warning_ = ""; - - // The last ReusedPasswordAccountType that was shown a warning or - // interstitial. - ReusedPasswordAccountType - reused_password_account_type_for_last_shown_warning_; - - std::vector<password_manager::MatchingReusedCredential> - saved_passwords_matching_reused_credentials_; - - private: - friend class PasswordProtectionServiceTest; - friend class TestPasswordProtectionService; - friend class ChromePasswordProtectionServiceTest; - friend class ChromePasswordProtectionServiceBrowserTest; - FRIEND_TEST_ALL_PREFIXES(PasswordProtectionServiceTest, - TestParseInvalidVerdictEntry); - FRIEND_TEST_ALL_PREFIXES(PasswordProtectionServiceTest, - TestParseValidVerdictEntry); - FRIEND_TEST_ALL_PREFIXES(PasswordProtectionServiceTest, - TestPathVariantsMatchCacheExpression); - FRIEND_TEST_ALL_PREFIXES(PasswordProtectionServiceTest, - TestRemoveCachedVerdictOnURLsDeleted); - FRIEND_TEST_ALL_PREFIXES(PasswordProtectionServiceTest, - TestCleanUpExpiredVerdict); - - // Overridden from history::HistoryServiceObserver. - void OnURLsDeleted(history::HistoryService* history_service, - const history::DeletionInfo& deletion_info) override; - - void HistoryServiceBeingDeleted( - history::HistoryService* history_service) override; - - // Posted to UI thread by OnURLsDeleted(...). This function remove the related - // entries in kSafeBrowsingUnhandledSyncPasswordReuses. - virtual void RemoveUnhandledSyncPasswordReuseOnURLsDeleted( - bool all_history, - const history::URLRows& deleted_rows) = 0; - - static bool PathVariantsMatchCacheExpression( - const std::vector<std::string>& generated_paths, - const std::string& cache_expression_path); - - void RecordNoPingingReason( - LoginReputationClientRequest::TriggerType trigger_type, - RequestOutcome reason, - PasswordType password_type); - -#if BUILDFLAG(FULL_SAFE_BROWSING) - // Get the content area size of current browsing window. - virtual gfx::Size GetCurrentContentAreaSize() const = 0; -#endif - - std::vector<std::string> saved_passwords_matching_domains_; - - scoped_refptr<SafeBrowsingDatabaseManager> database_manager_; - - // The context we use to issue network requests. This request_context_getter - // is obtained from SafeBrowsingService so that we can use the Safe Browsing - // cookie store. - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; - - // List of most commonly spoofed domains to default to on the password warning - // dialog. - std::list<std::string> common_spoofed_domains_; - - base::ScopedObservation<history::HistoryService, - history::HistoryServiceObserver> - history_service_observation_{this}; - - // Weakptr can only cancel task if it is posted to the same thread. Therefore, - // we need CancelableTaskTracker to cancel tasks posted to IO thread. - base::CancelableTaskTracker tracker_; - - base::WeakPtrFactory<PasswordProtectionServiceBase> weak_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(PasswordProtectionServiceBase); -}; - -} // namespace safe_browsing - -#endif // COMPONENTS_SAFE_BROWSING_CONTENT_PASSWORD_PROTECTION_PASSWORD_PROTECTION_SERVICE_BASE_H_
diff --git a/components/storage_monitor/storage_monitor.h b/components/storage_monitor/storage_monitor.h index 28a3ef3..eb24327 100644 --- a/components/storage_monitor/storage_monitor.h +++ b/components/storage_monitor/storage_monitor.h
@@ -117,8 +117,8 @@ // persistent across sessions. virtual bool GetMTPStorageInfoFromDeviceId( const std::string& storage_device_id, - base::string16* device_location, - base::string16* storage_object_id) const = 0; + std::wstring* device_location, + std::wstring* storage_object_id) const = 0; #endif #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/components/storage_monitor/storage_monitor_win.cc b/components/storage_monitor/storage_monitor_win.cc index b3cc05f6..8844a2b 100644 --- a/components/storage_monitor/storage_monitor_win.cc +++ b/components/storage_monitor/storage_monitor_win.cc
@@ -122,19 +122,14 @@ bool StorageMonitorWin::GetMTPStorageInfoFromDeviceId( const std::string& storage_device_id, - base::string16* device_location, - base::string16* storage_object_id) const { + std::wstring* device_location, + std::wstring* storage_object_id) const { StorageInfo::Type type; StorageInfo::CrackDeviceId(storage_device_id, &type, nullptr); if (type != StorageInfo::MTP_OR_PTP) return false; - std::wstring location, id; - if (!portable_device_watcher_->GetMTPStorageInfoFromDeviceId( - storage_device_id, &location, &id)) - return false; - *device_location = base::WideToUTF16(location); - *storage_object_id = base::WideToUTF16(id); - return true; + return portable_device_watcher_->GetMTPStorageInfoFromDeviceId( + storage_device_id, device_location, storage_object_id); } // static
diff --git a/components/storage_monitor/storage_monitor_win.h b/components/storage_monitor/storage_monitor_win.h index d95ea87..d0e3e42 100644 --- a/components/storage_monitor/storage_monitor_win.h +++ b/components/storage_monitor/storage_monitor_win.h
@@ -42,8 +42,8 @@ StorageInfo* device_info) const override; bool GetMTPStorageInfoFromDeviceId( const std::string& storage_device_id, - base::string16* device_location, - base::string16* storage_object_id) const override; + std::wstring* device_location, + std::wstring* storage_object_id) const override; void EjectDevice(const std::string& device_id, base::OnceCallback<void(EjectStatus)> callback) override;
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index f8563f3..24985382 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -1836,6 +1836,7 @@ <translation id="8202370299023114387">Ziddiyət</translation> <translation id="8206978196348664717">Prc4 (Zərf)</translation> <translation id="8211406090763984747">Bağlantı təhlükəsizdir</translation> +<translation id="8213464188712611711">Yaddaşlar</translation> <translation id="8218327578424803826">Ayrılmış yer:</translation> <translation id="8220146938470311105">C7/C6 (Zərf)</translation> <translation id="8221250263817408492">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chromium indi <ph name="WEBSITE_1" /> və bu parolu istifadə etdiyiniz digər saytlara keçərək parolunuzu dəyişmənizi tövsiyə edir.</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 50325f3..7ce2101 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -1841,6 +1841,7 @@ <translation id="8202370299023114387">দ্বন্দ্ব</translation> <translation id="8206978196348664717">Prc4 (Envelope)</translation> <translation id="8211406090763984747">কানেকশনটি নিরাপদ</translation> +<translation id="8213464188712611711">মেমরি</translation> <translation id="8218327578424803826">নির্ধারিত লোকেশন:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8221250263817408492">আপনি এখনই প্রতারণামূলক একটি সাইটে আপনার পাসওয়ার্ড লিখেছেন। Chromium <ph name="WEBSITE_1" /> এবং অন্যান্য সাইটে, যেখানে এই পাসওয়ার্ড ব্যবহার করেছেন সেখানে গিয়ে এখনই পাসওয়ার্ড পরিবর্তন করার জন্য সাজেস্ট করছে।</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 7fc3642e..4ae13b1 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -1831,6 +1831,7 @@ <translation id="8202370299023114387">Conflicto</translation> <translation id="8206978196348664717">Prc4 (Envelope)</translation> <translation id="8211406090763984747">La conexión es segura</translation> +<translation id="8213464188712611711">Recuerdos</translation> <translation id="8218327578424803826">Ubicación asignada:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8221250263817408492">Ingresaste tu contraseña en un sitio engañoso. Chromium te recomienda que la cambies ahora en <ph name="WEBSITE_1" /> y otros sitios donde la uses.</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 22b3b5f..061eaeb 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -1490,7 +1490,7 @@ <translation id="6826993739343257035">Queres permitir realidade aumentada?</translation> <translation id="6831043979455480757">Traducir</translation> <translation id="6839929833149231406">Área</translation> -<translation id="6846340164947227603">Usar un número de tarxeta virtual…</translation> +<translation id="6846340164947227603">Usar un número de conta virtual…</translation> <translation id="6852204201400771460">Queres volver cargar a aplicación?</translation> <translation id="6865412394715372076">Esta tarxeta non puido verificarse neste momento</translation> <translation id="6874604403660855544">&Refacer adición</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 87eaf58..6fbc9d7b 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -1838,6 +1838,7 @@ <translation id="8202370299023114387">Konflikts</translation> <translation id="8206978196348664717">Prc4 (aploksne)</translation> <translation id="8211406090763984747">Savienojums ir drošs</translation> +<translation id="8213464188712611711">Atmiņas</translation> <translation id="8218327578424803826">Piešķirtā atrašanās vieta:</translation> <translation id="8220146938470311105">C7/C6 (aploksne)</translation> <translation id="8221250263817408492">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chromium ieteikums: tūlīt apmeklējiet vietni <ph name="WEBSITE_1" /> un citas vietnes, kurās izmantojat šo paroli, un nomainiet to.</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index b8201bd..96684a5 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -1833,6 +1833,7 @@ <translation id="8202370299023114387">പൊരുത്തക്കേട്</translation> <translation id="8206978196348664717">Prc4 (എൻവലപ്പ്)</translation> <translation id="8211406090763984747">കണക്ഷൻ സുരക്ഷിതമാണ്</translation> +<translation id="8213464188712611711">ചിത്രങ്ങൾ</translation> <translation id="8218327578424803826">നൽകിയിരിക്കുന്ന ലൊക്കേഷൻ:</translation> <translation id="8220146938470311105">C7/C6 (എൻവലപ്പ്)</translation> <translation id="8221250263817408492">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. നിങ്ങൾ ഈ പാസ്വേഡ് ഉപയോഗിക്കുന്ന <ph name="WEBSITE_1" /> എന്നതിലേക്കും മറ്റ് സൈറ്റുകളിലേക്കും പോയി, ഇപ്പോൾ തന്നെ അത് മാറ്റാൻ Chromium ശുപാർശ ചെയ്യുന്നു.</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index 5fb35a30..d7944216 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -1837,6 +1837,7 @@ <translation id="8202370299023114387">बेमेल</translation> <translation id="8206978196348664717">Prc4 (Envelope)</translation> <translation id="8211406090763984747">जडान सुरक्षित छ</translation> +<translation id="8213464188712611711">स्मृतिहरू</translation> <translation id="8218327578424803826">तोकिएको स्थान:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8221250263817408492">तपाईंले भर्खरै कुनै भ्रामक साइटमा आफ्नो पासवर्ड प्रविष्टि गर्नुभएको छ। Chromium ले <ph name="WEBSITE_1" /> र तपाईंले यो पासवर्ड प्रयोग गर्ने अन्य साइटहरूमा गई आफ्नो पासवर्ड अहिले नै बदल्न सिफारिस गर्छ।</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index d687848..fea1172 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -1827,6 +1827,7 @@ <translation id="8202370299023114387">ਵਿਵਾਦ</translation> <translation id="8206978196348664717">Prc4 (ਲਿਫ਼ਾਫ਼ਾ)</translation> <translation id="8211406090763984747">ਕਨੈਕਸ਼ਨ ਸੁਰੱਖਿਅਤ ਹੈ</translation> +<translation id="8213464188712611711">ਯਾਦਾਂ</translation> <translation id="8218327578424803826">ਅਸਾਈਨ ਕੀਤਾ ਗਿਆ ਨਿਰਧਾਰਿਤ ਸਥਾਨ:</translation> <translation id="8220146938470311105">C7/C6 (ਲਿਫ਼ਾਫ਼ਾ)</translation> <translation id="8221250263817408492">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chromium ਵੱਲੋਂ <ph name="WEBSITE_1" /> ਅਤੇ ਉਹਨਾਂ ਹੋਰ ਸਾਈਟਾਂ 'ਤੇ ਜਾ ਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਜਿੱਥੇ ਤੁਸੀਂ ਆਪਣਾ ਪਾਸਵਰਡ ਵਰਤਿਆ ਹੈ।</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 3d3687f..efb661b 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -1834,6 +1834,7 @@ <translation id="8202370299023114387">முரண்பாடு</translation> <translation id="8206978196348664717">Prc4 (என்வலப்)</translation> <translation id="8211406090763984747">இணைப்பு பாதுகாப்பானது</translation> +<translation id="8213464188712611711">நினைவுகள்</translation> <translation id="8218327578424803826">ஒதுக்கிய இருப்பிடம்:</translation> <translation id="8220146938470311105">C7/C6 (என்வலப்)</translation> <translation id="8221250263817408492">மோசடிசெய்யும் இணையதளத்தில் உங்கள் கடவுச்சொல்லை உள்ளிட்டுள்ளீர்கள். இந்தக் கடவுச்சொல்லைப் பயன்படுத்தி உள்நுழையும் <ph name="WEBSITE_1" /> மற்றும் பிற தளங்களுக்குச் சென்று இதை இப்போதே மாற்றுமாறு Chromium பரிந்துரைக்கிறது.</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index dc231e7d..d266e7b4 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -1841,6 +1841,7 @@ <translation id="8202370299023114387">వైరుధ్యం</translation> <translation id="8206978196348664717">Prc4 (ఎన్వలప్)</translation> <translation id="8211406090763984747">కనెక్షన్ సురక్షితంగా ఉంది</translation> +<translation id="8213464188712611711">మెమరీలు</translation> <translation id="8218327578424803826">కేటాయించిన స్థానం:</translation> <translation id="8220146938470311105">C7/C6 (ఎన్వలప్)</translation> <translation id="8221250263817408492">మీరు మోసపూరితమైన సైట్లో మీ పాస్వర్డ్ను ఎంటర్ చేశారు. మీరు ఈ పాస్వర్డ్ను ఉపయోగించిన <ph name="WEBSITE_1" />, ఇతర సైట్లకు ఇప్పుడే వెళ్లి, దాన్ని మార్చాల్సిందిగా Chromium సిఫార్సు చేస్తోంది.</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index a61d610..fba2920 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -1845,6 +1845,7 @@ <translation id="8202370299023114387">تصادم</translation> <translation id="8206978196348664717">Prc4 (Envelope)</translation> <translation id="8211406090763984747">کنکشن محفوظ ہے</translation> +<translation id="8213464188712611711">میموریز</translation> <translation id="8218327578424803826">تفویض کردہ مقام</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8221250263817408492">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chromium <ph name="WEBSITE_1" /> اور دیگر ایسی سائٹس پر جا کر ابھی پاس ورڈ بدلنے کی تجویز کرتا ہے جہاں آپ اسے استعمال کرتے ہیں۔</translation>
diff --git a/components/sync/engine/model_type_worker.cc b/components/sync/engine/model_type_worker.cc index 4cd048b..84415e23 100644 --- a/components/sync/engine/model_type_worker.cc +++ b/components/sync/engine/model_type_worker.cc
@@ -42,9 +42,10 @@ const char kTimeUntilEncryptionKeyFoundHistogramPrefix[] = "Sync.ModelTypeTimeUntilEncryptionKeyFound."; - const char kUndecryptablePendingUpdatesDroppedHistogramPrefix[] = "Sync.ModelTypeUndecryptablePendingUpdatesDropped."; +const char kBlockedDueToUndecryptableUpdateHistogramName[] = + "Sync.ModelTypeBlockedDueToUndecryptableUpdate"; const int kMinGuResponsesToIgnoreKey = 50; @@ -269,6 +270,12 @@ RemoveKeysNoLongerUnknown(); if (!cryptographer_ || cryptographer_->CanEncrypt()) { + if (!entries_pending_decryption_.empty()) { + base::UmaHistogramEnumeration( + kBlockedDueToUndecryptableUpdateHistogramName, + ModelTypeHistogramValue(type_)); + } + // Encryption keys should've been known in this state. for (auto& key_and_info : unknown_encryption_keys_by_name_) { key_and_info.second.gu_responses_while_should_have_been_known++;
diff --git a/components/sync/engine/model_type_worker_unittest.cc b/components/sync/engine/model_type_worker_unittest.cc index 4828e9b..eb7e136 100644 --- a/components/sync/engine/model_type_worker_unittest.cc +++ b/components/sync/engine/model_type_worker_unittest.cc
@@ -1308,6 +1308,11 @@ TriggerUpdateFromServer(10, kTag1, kValue1); gu_responses_while_should_have_been_known++; + // The fact that the data type is now blocked should have been recorded. + histogram_tester.ExpectUniqueSample( + "Sync.ModelTypeBlockedDueToUndecryptableUpdate", + ModelTypeHistogramValue(worker()->GetModelType()), 1); + // Send empty GetUpdatesResponse. Again, the cryptographer isn't in a pending // state, so increase |gu_responses_while_should_have_been_known|. worker()->ProcessGetUpdatesResponse(
diff --git a/components/variations/service/variations_service_unittest.cc b/components/variations/service/variations_service_unittest.cc index de92196..e37b248 100644 --- a/components/variations/service/variations_service_unittest.cc +++ b/components/variations/service/variations_service_unittest.cc
@@ -7,6 +7,7 @@ #include <stddef.h> #include <memory> +#include <string> #include <utility> #include <vector> @@ -315,7 +316,7 @@ // stability state from prefs after tests have a chance to initialize it. if (!metrics_state_manager_) { metrics_state_manager_ = metrics::MetricsStateManager::Create( - &prefs_, enabled_state_provider_.get(), base::string16(), + &prefs_, enabled_state_provider_.get(), std::wstring(), base::BindRepeating(&StubStoreClientInfo), base::BindRepeating(&StubLoadClientInfo)); }
diff --git a/components/viz/service/display/direct_renderer.cc b/components/viz/service/display/direct_renderer.cc index 29a73e7..98644e13 100644 --- a/components/viz/service/display/direct_renderer.cc +++ b/components/viz/service/display/direct_renderer.cc
@@ -427,6 +427,15 @@ current_frame_valid_ = false; } +gfx::Rect DirectRenderer::GetTargetDamageBoundingRect() const { + gfx::Rect bounding_rect = output_surface_->GetCurrentFramebufferDamage(); + if (overlay_processor_) { + bounding_rect.Union( + overlay_processor_->GetPreviousFrameOverlaysBoundingRect()); + } + return bounding_rect; +} + gfx::Rect DirectRenderer::DeviceViewportRectInDrawSpace() const { gfx::Rect device_viewport_rect(current_frame()->device_viewport_size); device_viewport_rect -= current_viewport_rect_.OffsetFromOrigin();
diff --git a/components/viz/service/display/direct_renderer.h b/components/viz/service/display/direct_renderer.h index 0bc00c4b..8298e97 100644 --- a/components/viz/service/display/direct_renderer.h +++ b/components/viz/service/display/direct_renderer.h
@@ -76,6 +76,11 @@ const gfx::DisplayColorSpaces& display_color_spaces, SurfaceDamageRectList surface_damage_rect_list); + // The renderer might expand the damage (e.g: HW overlays were used, + // invalidation rects on previous buffers). This function returns a + // bounding rect of the area that might need to be recomposited. + gfx::Rect GetTargetDamageBoundingRect() const; + // Public interface implemented by subclasses. struct SwapFrameData { SwapFrameData();
diff --git a/components/viz/service/display/display.cc b/components/viz/service/display/display.cc index 0fde006..8ddbd7fc 100644 --- a/components/viz/service/display/display.cc +++ b/components/viz/service/display/display.cc
@@ -545,8 +545,8 @@ // Outputting a partial list of quads might not work in cases where contents // outside the damage rect might be needed by the renderer. bool output_partial_list = - output_surface_->capabilities().only_invalidates_damage_rect && renderer_->use_partial_swap() && + output_surface_->capabilities().only_invalidates_damage_rect && !overlay_processor_->IsOverlaySupported(); aggregator_ = std::make_unique<SurfaceAggregator>( @@ -630,10 +630,14 @@ { FrameRateDecider::ScopedAggregate scoped_aggregate( frame_rate_decider_.get()); + gfx::Rect target_damage_bounding_rect; + if (output_surface_->capabilities().supports_target_damage) + target_damage_bounding_rect = renderer_->GetTargetDamageBoundingRect(); + // Ensure that the surfaces that were damaged by any delegated ink trail are // aggregated again so that the trail exists for a single frame. - gfx::Rect target_damage_bounding_rect = - renderer_->GetDelegatedInkTrailDamageRect(); + target_damage_bounding_rect.Union( + renderer_->GetDelegatedInkTrailDamageRect()); frame = aggregator_->Aggregate( current_surface_id_, expected_display_time, current_display_transform,
diff --git a/components/viz/service/display/output_surface.h b/components/viz/service/display/output_surface.h index 9cca29ac..93ab70a 100644 --- a/components/viz/service/display/output_surface.h +++ b/components/viz/service/display/output_surface.h
@@ -98,6 +98,9 @@ // When this is false contents outside the damaged area might need to be // recomposited to the surface. bool only_invalidates_damage_rect = true; + // Whether OutputSurface::GetTargetDamageBoundingRect is implemented and + // will return a bounding rectangle of the target buffer invalidated area. + bool supports_target_damage = false; // Whether the gpu supports surfaceless surface (equivalent of using buffer // queue). bool supports_surfaceless = false;
diff --git a/components/viz/service/display/overlay_processor_interface.h b/components/viz/service/display/overlay_processor_interface.h index 3fa06a6..eb5cd84 100644 --- a/components/viz/service/display/overlay_processor_interface.h +++ b/components/viz/service/display/overlay_processor_interface.h
@@ -109,6 +109,10 @@ virtual ~OverlayProcessorInterface() = default; virtual bool IsOverlaySupported() const = 0; + // Returns a bounding rectangle of the last set of overlay planes scheduled. + // It's expected to be called after ProcessForOverlays at frame N-1 has been + // called and before GetAndResetOverlayDamage at frame N. + virtual gfx::Rect GetPreviousFrameOverlaysBoundingRect() const = 0; virtual gfx::Rect GetAndResetOverlayDamage() = 0; // Returns true if the platform supports hw overlays and surface occluding
diff --git a/components/viz/service/display/overlay_processor_mac.cc b/components/viz/service/display/overlay_processor_mac.cc index 969907a..d1816cc 100644 --- a/components/viz/service/display/overlay_processor_mac.cc +++ b/components/viz/service/display/overlay_processor_mac.cc
@@ -35,6 +35,14 @@ return true; } +gfx::Rect OverlayProcessorMac::GetPreviousFrameOverlaysBoundingRect() const { + // This function's return value is used to determine the range of quads + // produced by surface aggregation. We use the quads to generate our CALayer + // tree every frame, and we use the quads that didn't change. For that + // reason, always return the full frame. + return previous_frame_full_bounding_rect_; +} + gfx::Rect OverlayProcessorMac::GetAndResetOverlayDamage() { gfx::Rect result = ca_overlay_damage_rect_; ca_overlay_damage_rect_ = gfx::Rect(); @@ -58,6 +66,7 @@ // Clear to get ready to handle output surface as overlay. output_surface_already_handled_ = false; + previous_frame_full_bounding_rect_ = render_pass->output_rect; // Skip overlay processing if we have copy request. if (!render_pass->copy_requests.empty()) @@ -81,6 +90,7 @@ // Set |last_overlay_damage_| to be everything, so that the next // frame that we draw to the output surface will do a full re-draw. ca_overlay_damage_rect_ = render_pass->output_rect; + previous_frame_full_bounding_rect_ = ca_overlay_damage_rect_; // Everything in |render_pass->quad_list| has been moved over to // |candidates|. Ideally we would clear |render_pass->quad_list|, but some
diff --git a/components/viz/service/display/overlay_processor_mac.h b/components/viz/service/display/overlay_processor_mac.h index e25740a..d7e4228 100644 --- a/components/viz/service/display/overlay_processor_mac.h +++ b/components/viz/service/display/overlay_processor_mac.h
@@ -36,6 +36,7 @@ bool DisableSplittingQuads() const override; bool IsOverlaySupported() const override; + gfx::Rect GetPreviousFrameOverlaysBoundingRect() const override; gfx::Rect GetAndResetOverlayDamage() override; // Returns true if the platform supports hw overlays and surface occluding @@ -71,6 +72,7 @@ // The damage that should be added the next frame for drawing to the output // surface. gfx::Rect ca_overlay_damage_rect_; + gfx::Rect previous_frame_full_bounding_rect_; protected: // Protected for testing.
diff --git a/components/viz/service/display/overlay_processor_stub.cc b/components/viz/service/display/overlay_processor_stub.cc index 658c735..ad6a26f 100644 --- a/components/viz/service/display/overlay_processor_stub.cc +++ b/components/viz/service/display/overlay_processor_stub.cc
@@ -11,6 +11,9 @@ gfx::Rect OverlayProcessorStub::GetAndResetOverlayDamage() { return gfx::Rect(); } +gfx::Rect OverlayProcessorStub::GetPreviousFrameOverlaysBoundingRect() const { + return gfx::Rect(); +} bool OverlayProcessorStub::NeedsSurfaceDamageRectList() const { return false;
diff --git a/components/viz/service/display/overlay_processor_stub.h b/components/viz/service/display/overlay_processor_stub.h index cc5de1f..d90c996 100644 --- a/components/viz/service/display/overlay_processor_stub.h +++ b/components/viz/service/display/overlay_processor_stub.h
@@ -20,6 +20,7 @@ // Overrides OverlayProcessorInterface's pure virtual functions. bool IsOverlaySupported() const final; + gfx::Rect GetPreviousFrameOverlaysBoundingRect() const final; gfx::Rect GetAndResetOverlayDamage() final; bool NeedsSurfaceDamageRectList() const final; void ProcessForOverlays(
diff --git a/components/viz/service/display/overlay_processor_using_strategy.cc b/components/viz/service/display/overlay_processor_using_strategy.cc index a8c3e5f..3150093 100644 --- a/components/viz/service/display/overlay_processor_using_strategy.cc +++ b/components/viz/service/display/overlay_processor_using_strategy.cc
@@ -106,6 +106,13 @@ OverlayProcessorUsingStrategy::~OverlayProcessorUsingStrategy() = default; +gfx::Rect OverlayProcessorUsingStrategy::GetPreviousFrameOverlaysBoundingRect() + const { + gfx::Rect result = overlay_damage_rect_; + result.Union(previous_frame_overlay_rect_); + return result; +} + gfx::Rect OverlayProcessorUsingStrategy::GetAndResetOverlayDamage() { gfx::Rect result = overlay_damage_rect_; overlay_damage_rect_ = gfx::Rect();
diff --git a/components/viz/service/display/overlay_processor_using_strategy.h b/components/viz/service/display/overlay_processor_using_strategy.h index 2ab9109..09cb009 100644 --- a/components/viz/service/display/overlay_processor_using_strategy.h +++ b/components/viz/service/display/overlay_processor_using_strategy.h
@@ -120,6 +120,7 @@ ~OverlayProcessorUsingStrategy() override; + gfx::Rect GetPreviousFrameOverlaysBoundingRect() const final; gfx::Rect GetAndResetOverlayDamage() final; // Override OverlayProcessor.
diff --git a/components/viz/service/display/overlay_processor_win.cc b/components/viz/service/display/overlay_processor_win.cc index abb668cc..4c21ff9 100644 --- a/components/viz/service/display/overlay_processor_win.cc +++ b/components/viz/service/display/overlay_processor_win.cc
@@ -37,6 +37,12 @@ return true; } +gfx::Rect OverlayProcessorWin::GetPreviousFrameOverlaysBoundingRect() const { + // TODO(dcastagna): Implement me. + NOTIMPLEMENTED(); + return gfx::Rect(); +} + gfx::Rect OverlayProcessorWin::GetAndResetOverlayDamage() { return gfx::Rect(); }
diff --git a/components/viz/service/display/overlay_processor_win.h b/components/viz/service/display/overlay_processor_win.h index 81212d8..a865bd0 100644 --- a/components/viz/service/display/overlay_processor_win.h +++ b/components/viz/service/display/overlay_processor_win.h
@@ -35,6 +35,7 @@ ~OverlayProcessorWin() override; bool IsOverlaySupported() const override; + gfx::Rect GetPreviousFrameOverlaysBoundingRect() const override; gfx::Rect GetAndResetOverlayDamage() override; // Returns true if the platform supports hw overlays and surface occluding
diff --git a/components/viz/service/display_embedder/buffer_queue.cc b/components/viz/service/display_embedder/buffer_queue.cc index dc80f797a..f311d904 100644 --- a/components/viz/service/display_embedder/buffer_queue.cc +++ b/components/viz/service/display_embedder/buffer_queue.cc
@@ -53,8 +53,18 @@ } gfx::Rect BufferQueue::CurrentBufferDamage() const { - DCHECK(current_surface_); - return current_surface_->damage; + if (current_surface_) + return current_surface_->damage; + + // In case there is no current_surface_, we get the damage from the surface + // that will be set as current_surface_ by the next call to GetNextSurface. + if (!available_surfaces_.empty()) { + return available_surfaces_.back()->damage; + } + + // If we can't determine which surface will be the next current_surface_, we + // conservatively invalidate the whole buffer. + return gfx::Rect(size_); } void BufferQueue::SwapBuffers(const gfx::Rect& damage) {
diff --git a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc index c0f9a3f..c25c095 100644 --- a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc +++ b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/logging.h" +#include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "components/viz/common/frame_sinks/begin_frame_source.h" #include "components/viz/common/gpu/context_provider.h" @@ -42,6 +43,13 @@ // shifts the start of the new frame forward relative to the old // implementation. capabilities_.max_frames_pending = 2; + // GetCurrentFramebufferDamage will return an upper bound of the part of the + // buffer that needs to be recomposited. +#if defined(OS_APPLE) + capabilities_.supports_target_damage = false; +#else + capabilities_.supports_target_damage = true; +#endif // Force the number of max pending frames to one when the switch // "double-buffer-compositing" is passed. // This will keep compositing in double buffered mode assuming |buffer_queue_|
diff --git a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc index 58882d74..626396c 100644 --- a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc +++ b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
@@ -146,6 +146,9 @@ capabilities_.max_frames_pending = capabilities_.number_of_buffers - 1; presenter_->InitializeCapabilities(&capabilities_); + + if (capabilities_.supports_post_sub_buffer) + capabilities_.supports_target_damage = true; } SkiaOutputDeviceBufferQueue::~SkiaOutputDeviceBufferQueue() {
diff --git a/components/viz/service/display_embedder/skia_output_device_vulkan.cc b/components/viz/service/display_embedder/skia_output_device_vulkan.cc index fc43b34..2648d33 100644 --- a/components/viz/service/display_embedder/skia_output_device_vulkan.cc +++ b/components/viz/service/display_embedder/skia_output_device_vulkan.cc
@@ -290,6 +290,7 @@ capabilities_.preserve_buffer_content = true; capabilities_.output_surface_origin = gfx::SurfaceOrigin::kTopLeft; capabilities_.supports_post_sub_buffer = true; + capabilities_.supports_target_damage = true; capabilities_.orientation_mode = OutputSurface::OrientationMode::kHardware; #if defined(OS_ANDROID) // With vulkan, if the chrome is launched in landscape mode, the chrome is
diff --git a/content/browser/accessibility/accessibility_auralinux_browsertest.cc b/content/browser/accessibility/accessibility_auralinux_browsertest.cc index 69d1a55..8bbb8990 100644 --- a/content/browser/accessibility/accessibility_auralinux_browsertest.cc +++ b/content/browser/accessibility/accessibility_auralinux_browsertest.cc
@@ -234,9 +234,8 @@ host_view_parent)); } -IN_PROC_BROWSER_TEST_F( - AccessibilityAuraLinuxBrowserTest, - DISABLED_TestTextAtOffsetWithBoundaryCharacterAndEmbeddedObject) { +IN_PROC_BROWSER_TEST_F(AccessibilityAuraLinuxBrowserTest, + TestTextAtOffsetWithBoundaryCharacterAndEmbeddedObject) { LoadInitialAccessibilityTreeFromHtml(R"HTML(<!DOCTYPE html> <div contenteditable> Before<img alt="image">after.
diff --git a/content/browser/accessibility/accessibility_tree_formatter_android.cc b/content/browser/accessibility/accessibility_tree_formatter_android.cc index bfc55c5..a257a38 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_android.cc +++ b/content/browser/accessibility/accessibility_tree_formatter_android.cc
@@ -29,12 +29,14 @@ "checkable", "checked", "clickable", + "collapsed", "collection", "collection_item", "content_invalid", "disabled", "dismissable", "editable_text", + "expanded", "focusable", "focused", "has_character_locations", @@ -76,6 +78,17 @@ "text_change_added_count", "text_change_removed_count", }; + +const char* const ACTION_ATTRIBUTES[] = { + "action_scroll_forward", + "action_scroll_backward", + "action_scroll_up", + "action_scroll_down", + "action_scroll_left", + "action_scroll_right", + "action_expand", + "action_collapse", +}; // clang-format on } // namespace @@ -149,11 +162,13 @@ dict->SetBoolean("checkable", android_node->IsCheckable()); dict->SetBoolean("checked", android_node->IsChecked()); dict->SetBoolean("clickable", android_node->IsClickable()); + dict->SetBoolean("collapsed", android_node->IsCollapsed()); dict->SetBoolean("collection", android_node->IsCollection()); dict->SetBoolean("collection_item", android_node->IsCollectionItem()); dict->SetBoolean("disabled", !android_node->IsEnabled()); dict->SetBoolean("dismissable", android_node->IsDismissable()); dict->SetBoolean("editable_text", android_node->IsTextField()); + dict->SetBoolean("expanded", android_node->IsExpanded()); dict->SetBoolean("focusable", android_node->IsFocusable()); dict->SetBoolean("focused", android_node->IsFocused()); dict->SetBoolean("has_character_locations", @@ -205,6 +220,8 @@ dict->SetBoolean("action_scroll_down", android_node->CanScrollDown()); dict->SetBoolean("action_scroll_left", android_node->CanScrollLeft()); dict->SetBoolean("action_scroll_right", android_node->CanScrollRight()); + dict->SetBoolean("action_expand", android_node->IsCollapsed()); + dict->SetBoolean("action_collapse", android_node->IsExpanded()); } std::string AccessibilityTreeFormatterAndroid::ProcessTreeForOutput( @@ -256,6 +273,15 @@ WriteAttribute(true, StringPrintf("%s=%d", attribute_name, value), &line); } + for (unsigned i = 0; i < base::size(ACTION_ATTRIBUTES); i++) { + const char* attribute_name = ACTION_ATTRIBUTES[i]; + bool value; + if (dict.GetBoolean(attribute_name, &value) && value) { + WriteAttribute(false /* Exclude actions by default */, attribute_name, + &line); + } + } + return line; }
diff --git a/content/browser/accessibility/accessibility_win_browsertest.cc b/content/browser/accessibility/accessibility_win_browsertest.cc index a2b950e..5824701 100644 --- a/content/browser/accessibility/accessibility_win_browsertest.cc +++ b/content/browser/accessibility/accessibility_win_browsertest.cc
@@ -3716,9 +3716,8 @@ } } -IN_PROC_BROWSER_TEST_F( - AccessibilityWinBrowserTest, - DISABLED_TestTextAtOffsetWithBoundaryCharacterAndEmbeddedObject) { +IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, + TestTextAtOffsetWithBoundaryCharacterAndEmbeddedObject) { LoadInitialAccessibilityTreeFromHtml(R"HTML(<!DOCTYPE html> <div contenteditable> Before<img alt="image">after.
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc index 85d0ff6..1356c3b 100644 --- a/content/browser/accessibility/browser_accessibility.cc +++ b/content/browser/accessibility/browser_accessibility.cc
@@ -223,15 +223,12 @@ return InternalGetChild(child_index); } -BrowserAccessibility* BrowserAccessibility::PlatformGetClosestPlatformObject() +BrowserAccessibility* BrowserAccessibility::PlatformGetLowestPlatformAncestor() const { - BrowserAccessibility* platform_object = - const_cast<BrowserAccessibility*>(this); - while (platform_object && platform_object->IsChildOfLeaf()) - platform_object = platform_object->InternalGetParent(); - - DCHECK(platform_object); - return platform_object; + ui::AXNode* lowest_platform_ancestor = node()->GetLowestPlatformAncestor(); + if (!lowest_platform_ancestor) + return nullptr; + return manager()->GetFromAXNode(lowest_platform_ancestor); } bool BrowserAccessibility::IsPreviousSiblingOnSameLine() const { @@ -1196,7 +1193,7 @@ // need to ensure that we check against the lowest unignored ancestor of this // object if this object is ignored. if (!focus_object || - !focus_object->IsDescendantOf(PlatformGetClosestPlatformObject())) { + !focus_object->IsDescendantOf(PlatformGetLowestPlatformAncestor())) { return false; } @@ -1517,6 +1514,9 @@ return !child_count || (child_count == 1 && InternalGetFirstChild()->IsText()); } + + // If this object is hosting another accessibility tree, then it is certainly + // not a leaf. return PlatformGetRootOfChildTree() ? false : node()->IsLeaf(); } @@ -1539,9 +1539,13 @@ return node()->IsDescendantOfPlainTextField(); } -gfx::NativeViewAccessible BrowserAccessibility::GetClosestPlatformObject() +gfx::NativeViewAccessible BrowserAccessibility::GetLowestPlatformAncestor() const { - return PlatformGetClosestPlatformObject()->GetNativeViewAccessible(); + BrowserAccessibility* lowest_platform_ancestor = + PlatformGetLowestPlatformAncestor(); + if (lowest_platform_ancestor) + return lowest_platform_ancestor->GetNativeViewAccessible(); + return nullptr; } BrowserAccessibility::PlatformChildIterator::PlatformChildIterator(
diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h index 03f39b9..635c68f 100644 --- a/content/browser/accessibility/browser_accessibility.h +++ b/content/browser/accessibility/browser_accessibility.h
@@ -158,9 +158,10 @@ // Return a pointer to the first ancestor that is a selection container BrowserAccessibility* PlatformGetSelectionContainer() const; - // If this object is exposed to the platform, returns this object. Otherwise, - // returns the platform leaf under which this object is found. - BrowserAccessibility* PlatformGetClosestPlatformObject() const; + // If this object is exposed to the platform's accessibility layer, returns + // this object. Otherwise, returns the lowest ancestor that is exposed to the + // platform. + virtual BrowserAccessibility* PlatformGetLowestPlatformAncestor() const; bool IsPreviousSiblingOnSameLine() const; bool IsNextSiblingOnSameLine() const; @@ -414,7 +415,7 @@ bool IsFocused() const override; bool IsInvisibleOrIgnored() const override; bool IsToplevelBrowserWindow() override; - gfx::NativeViewAccessible GetClosestPlatformObject() const override; + gfx::NativeViewAccessible GetLowestPlatformAncestor() const override; std::unique_ptr<ChildIterator> ChildrenBegin() override; std::unique_ptr<ChildIterator> ChildrenEnd() override;
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc index 55a236e0..af59f6e 100644 --- a/content/browser/accessibility/browser_accessibility_android.cc +++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -326,8 +326,9 @@ // The root inside a portal is not interesting. if (ui::IsPlatformDocument(GetRole()) && PlatformGetParent() && - PlatformGetParent()->GetRole() == ax::mojom::Role::kPortal) + PlatformGetParent()->GetRole() == ax::mojom::Role::kPortal) { return false; + } // Mark as uninteresting if it's hidden, even if it is focusable. if (IsInvisibleOrIgnored()) @@ -336,7 +337,7 @@ // Walk up the ancestry. A non-focusable child of a control is not // interesting. A child of an invisible iframe is also not interesting. const BrowserAccessibility* parent = PlatformGetParent(); - while (parent != nullptr) { + while (parent) { if (ui::IsControl(parent->GetRole()) && !IsFocusable()) return false; @@ -455,11 +456,13 @@ if (BrowserAccessibility::IsLeaf()) return true; - // Iframes are always allowed to contain children. + // Document roots (e.g. kRootWebArea and kPdfRoot), and iframes are always + // allowed to contain children. if (ui::IsIframe(GetRole()) || ui::IsPlatformDocument(GetRole())) return false; - // Button, date and time controls should drop their children. + // Button, date and time controls should not expose their children to Android + // accessibility APIs. switch (GetRole()) { case ax::mojom::Role::kButton: case ax::mojom::Role::kDate: @@ -487,7 +490,7 @@ } } - // Focusable nodes with text can drop their children. + // Focusable nodes with text should not expose their children. if (HasState(ax::mojom::State::kFocusable) && !name.empty()) { if (HasFocusableNonOptionChild()) { return false; @@ -496,7 +499,7 @@ } } - // Nodes with only static text as children can drop their children. + // Nodes with only static text as children should not expose their children. if (HasOnlyTextChildren()) return true; } @@ -2198,6 +2201,34 @@ return false; } +BrowserAccessibility* +BrowserAccessibilityAndroid::PlatformGetLowestPlatformAncestor() const { + BrowserAccessibility* current_object = + const_cast<BrowserAccessibilityAndroid*>(this); + BrowserAccessibility* lowest_unignored_node = current_object; + if (lowest_unignored_node->IsIgnored()) + lowest_unignored_node = lowest_unignored_node->PlatformGetParent(); + DCHECK(!lowest_unignored_node || !lowest_unignored_node->IsIgnored()) + << "`BrowserAccessibility::PlatformGetParent()` should return either an " + "unignored object or nullptr."; + + // `highest_leaf_node` could be nullptr. + BrowserAccessibility* highest_leaf_node = lowest_unignored_node; + // For the purposes of this method, a leaf node does not include leaves in the + // internal accessibility tree, only in the platform exposed tree. + for (BrowserAccessibility* ancestor_node = lowest_unignored_node; + ancestor_node; ancestor_node = ancestor_node->PlatformGetParent()) { + if (ancestor_node->IsLeaf()) + highest_leaf_node = ancestor_node; + } + if (highest_leaf_node) + return highest_leaf_node; + + if (lowest_unignored_node) + return lowest_unignored_node; + return current_object; +} + bool BrowserAccessibilityAndroid::HasOnlyTextChildren() const { // This is called from IsLeaf, so don't call PlatformChildCount // from within this!
diff --git a/content/browser/accessibility/browser_accessibility_android.h b/content/browser/accessibility/browser_accessibility_android.h index a33c238..a847e33a 100644 --- a/content/browser/accessibility/browser_accessibility_android.h +++ b/content/browser/accessibility/browser_accessibility_android.h
@@ -23,7 +23,7 @@ static BrowserAccessibilityAndroid* GetFromUniqueId(int32_t unique_id); int32_t unique_id() const { return GetUniqueId().Get(); } - // Overrides from BrowserAccessibility. + // BrowserAccessibility Overrides. void OnDataChanged() override; void OnLocationChanged() override; base::string16 GetLocalizedStringForImageAnnotationStatus( @@ -184,15 +184,6 @@ // This gives BrowserAccessibility::Create access to the class constructor. friend class BrowserAccessibility; - BrowserAccessibilityAndroid(); - ~BrowserAccessibilityAndroid() override; - - bool HasOnlyTextChildren() const; - bool HasOnlyTextAndImageChildren() const; - bool ShouldExposeValueAsName() const; - - int CountChildrenWithRole(ax::mojom::Role role) const; - static size_t CommonPrefixLength(const base::string16 a, const base::string16 b); static size_t CommonSuffixLength(const base::string16 a, @@ -200,6 +191,17 @@ static size_t CommonEndLengths(const base::string16 a, const base::string16 b); + BrowserAccessibilityAndroid(); + ~BrowserAccessibilityAndroid() override; + + // BrowserAccessibility overrides. + BrowserAccessibility* PlatformGetLowestPlatformAncestor() const override; + + bool HasOnlyTextChildren() const; + bool HasOnlyTextAndImageChildren() const; + bool ShouldExposeValueAsName() const; + int CountChildrenWithRole(ax::mojom::Role role) const; + void AppendTextToString(base::string16 extra_text, base::string16* string) const;
diff --git a/content/browser/accessibility/browser_accessibility_android_unittest.cc b/content/browser/accessibility/browser_accessibility_android_unittest.cc index fad6f012..3589577 100644 --- a/content/browser/accessibility/browser_accessibility_android_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_android_unittest.cc
@@ -261,52 +261,49 @@ BrowserAccessibility* root_obj = manager->GetRoot(); EXPECT_FALSE(root_obj->PlatformIsLeaf()); EXPECT_TRUE(root_obj->CanFireEvents()); - BrowserAccessibility* label_obj = manager->GetFromID(1111); + BrowserAccessibility* label_obj = manager->GetFromID(label.id); EXPECT_TRUE(label_obj->PlatformIsLeaf()); EXPECT_TRUE(label_obj->CanFireEvents()); - BrowserAccessibility* label_text_obj = manager->GetFromID(11111); + BrowserAccessibility* label_text_obj = manager->GetFromID(label_text.id); EXPECT_TRUE(label_text_obj->PlatformIsLeaf()); EXPECT_FALSE(label_text_obj->CanFireEvents()); BrowserAccessibility* updated = manager->RetargetForEvents( label_text_obj, BrowserAccessibilityManager::RetargetEventType:: RetargetEventTypeBlinkHover); - // |updated| should be the labelText. - EXPECT_EQ(1111, updated->GetId()); + EXPECT_EQ(label.id, updated->GetId()); EXPECT_TRUE(updated->CanFireEvents()); - BrowserAccessibility* input_time_obj = manager->GetFromID(1112); + BrowserAccessibility* input_time_obj = manager->GetFromID(input_time.id); EXPECT_TRUE(input_time_obj->PlatformIsLeaf()); EXPECT_TRUE(input_time_obj->CanFireEvents()); - BrowserAccessibility* input_time_container_obj = manager->GetFromID(11121); + BrowserAccessibility* input_time_container_obj = + manager->GetFromID(input_container.id); EXPECT_TRUE(input_time_container_obj->PlatformIsLeaf()); EXPECT_FALSE(input_time_container_obj->CanFireEvents()); updated = manager->RetargetForEvents( input_time_container_obj, BrowserAccessibilityManager::RetargetEventType:: RetargetEventTypeBlinkHover); - // |updated| should be the inputTime. - EXPECT_EQ(1112, updated->GetId()); + EXPECT_EQ(input_time.id, updated->GetId()); EXPECT_TRUE(updated->CanFireEvents()); - BrowserAccessibility* input_text_obj = manager->GetFromID(111211); + BrowserAccessibility* input_text_obj = manager->GetFromID(input_text.id); EXPECT_TRUE(input_text_obj->PlatformIsLeaf()); EXPECT_FALSE(input_text_obj->CanFireEvents()); updated = manager->RetargetForEvents( input_text_obj, BrowserAccessibilityManager::RetargetEventType:: RetargetEventTypeBlinkHover); - // |updated| should be the inputTime. - EXPECT_EQ(1112, updated->GetId()); + EXPECT_EQ(input_time.id, updated->GetId()); EXPECT_TRUE(updated->CanFireEvents()); - BrowserAccessibility* button_obj = manager->GetFromID(1113); + BrowserAccessibility* button_obj = manager->GetFromID(button.id); EXPECT_TRUE(button_obj->PlatformIsLeaf()); EXPECT_TRUE(button_obj->CanFireEvents()); - BrowserAccessibility* button_text_obj = manager->GetFromID(11131); + BrowserAccessibility* button_text_obj = manager->GetFromID(button_text.id); EXPECT_TRUE(button_text_obj->PlatformIsLeaf()); EXPECT_FALSE(button_text_obj->CanFireEvents()); updated = manager->RetargetForEvents( button_text_obj, BrowserAccessibilityManager::RetargetEventType:: RetargetEventTypeBlinkHover); - // |updated| should be the button. - EXPECT_EQ(1113, updated->GetId()); + EXPECT_EQ(button.id, updated->GetId()); EXPECT_TRUE(updated->CanFireEvents()); manager.reset(); }
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index 8c5ecdd6..22e75e73 100644 --- a/content/browser/accessibility/browser_accessibility_manager.cc +++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -365,7 +365,7 @@ } BrowserAccessibility* BrowserAccessibilityManager::GetPopupRoot() const { - DCHECK(popup_root_ids_.size() <= 1); + DCHECK_LE(popup_root_ids_.size(), 1u); if (popup_root_ids_.size() == 1) { BrowserAccessibility* node = GetFromID(*popup_root_ids_.begin()); if (node) { @@ -637,8 +637,10 @@ if (!node) return; - // If an ancestor of this node is a leaf node, fire the notification on that. - node = node->PlatformGetClosestPlatformObject(); + // If an ancestor of this node is a leaf node, or if this node is ignored, + // fire the notification on that. + node = node->PlatformGetLowestPlatformAncestor(); + DCHECK(node); // The "scrolled to anchor" notification is a great way to get a // screen reader to jump directly to a specific location in a document. @@ -1664,7 +1666,7 @@ BrowserAccessibility* hit_test_result) const { // Walk up to the highest ancestor that's a leaf node; we don't want to // return a node that's hidden from the tree. - hit_test_result = hit_test_result->PlatformGetClosestPlatformObject(); + hit_test_result = hit_test_result->PlatformGetLowestPlatformAncestor(); last_hover_ax_tree_id_ = hit_test_result->manager()->ax_tree_id(); last_hover_node_id_ = hit_test_result->GetId();
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc index 1c95d3d..972aa44 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.cc +++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -89,9 +89,10 @@ BrowserAccessibility* node, RetargetEventType type) const { // Sometimes we get events on nodes in our internal accessibility tree - // that aren't exposed on Android. Get |updated| to point to the highest - // ancestor that's a leaf node. - BrowserAccessibility* updated = node->PlatformGetClosestPlatformObject(); + // that aren't exposed on Android. Get |updated| to point to the lowest + // ancestor that is exposed. + BrowserAccessibility* updated = node->PlatformGetLowestPlatformAncestor(); + DCHECK(updated); switch (type) { case RetargetEventType::RetargetEventTypeGenerated: {
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm index d67fba3..03eb8ace 100644 --- a/content/browser/accessibility/browser_accessibility_manager_mac.mm +++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -467,10 +467,10 @@ // TODO(mrobinson): Determine definitively what the type of this text // selection change is. This requires passing this information here from // blink. - BrowserAccessibility* focused_accessibility = GetFocus(); - DCHECK(focused_accessibility); + BrowserAccessibility* focus_object = GetFocus(); + DCHECK(focus_object); - if (focused_accessibility != GetLastFocusedNode()) { + if (focus_object != GetLastFocusedNode()) { [user_info setObject:@(ui::AXTextStateChangeTypeSelectionMove) forKey:ui::NSAccessibilityTextStateChangeTypeKey]; } else { @@ -478,9 +478,8 @@ forKey:ui::NSAccessibilityTextStateChangeTypeKey]; } - focused_accessibility = - focused_accessibility->PlatformGetClosestPlatformObject(); - auto native_focus_object = ToBrowserAccessibilityCocoa(focused_accessibility); + focus_object = focus_object->PlatformGetLowestPlatformAncestor(); + auto native_focus_object = ToBrowserAccessibilityCocoa(focus_object); if (native_focus_object && [native_focus_object instanceActive]) { [user_info setObject:native_focus_object forKey:ui::NSAccessibilityTextChangeElement];
diff --git a/content/browser/accessibility/browser_accessibility_position.cc b/content/browser/accessibility/browser_accessibility_position.cc index 823e062..57cdc75 100644 --- a/content/browser/accessibility/browser_accessibility_position.cc +++ b/content/browser/accessibility/browser_accessibility_position.cc
@@ -31,6 +31,16 @@ base::string16 BrowserAccessibilityPosition::GetText() const { if (IsNullPosition()) return {}; + + // Special case, if a position's anchor node has only ignored descendants, + // i.e., it appears to be empty to assistive software, on some platforms we + // need to still treat it as a character and a word boundary. We achieve this + // by adding an embedded object character in the text representation used by + // this class, but we don't expose that character to assistive software that + // tries to retrieve the node's inner text. + if (IsEmptyObjectReplacedByCharacter()) + return ui::AXNode::kEmbeddedCharacter; + DCHECK(GetAnchor()); return GetAnchor()->GetText(); }
diff --git a/content/browser/accessibility/browser_accessibility_win_unittest.cc b/content/browser/accessibility/browser_accessibility_win_unittest.cc index 4a6fce1..9633eb2 100644 --- a/content/browser/accessibility/browser_accessibility_win_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_win_unittest.cc
@@ -1479,16 +1479,11 @@ ASSERT_NE(nullptr, menu_accessible_com); ASSERT_EQ(ax::mojom::Role::kMenu, menu_accessible_com->GetData().role); - // TODO(crbug.com/1039528): This should not have 2 embedded object characters. - { - const std::array<base::char16, 2> pieces = { - ui::AXPlatformNodeBase::kEmbeddedCharacter, - ui::AXPlatformNodeBase::kEmbeddedCharacter}; - const base::string16 expect(pieces.cbegin(), pieces.cend()); - EXPECT_IA2_TEXT_AT_OFFSET(menu_accessible_com, 0, IA2_TEXT_BOUNDARY_CHAR, - /*expected_hr=*/S_OK, /*start=*/0, /*end=*/2, - /*text=*/base::as_wcstr(expect)); - } + EXPECT_IA2_TEXT_AT_OFFSET( + menu_accessible_com, 0, IA2_TEXT_BOUNDARY_CHAR, + /*expected_hr=*/S_OK, /*start=*/0, /*end=*/1, + /*text=*/ + base::string16{ui::AXPlatformNodeBase::kEmbeddedCharacter}.c_str()); } TEST_F(BrowserAccessibilityWinTest, @@ -1640,6 +1635,8 @@ ASSERT_NE(nullptr, static_text_3_com); ASSERT_EQ(ax::mojom::Role::kStaticText, static_text_3_com->GetData().role); + // [obj] stands for the embedded object replacement character \xFFFC. + // L"<b>efore" [obj] [obj] L"after" L"tail" EXPECT_IA2_TEXT_AT_OFFSET(body_accessible_com, 0, IA2_TEXT_BOUNDARY_CHAR, /*expected_hr=*/S_OK, /*start=*/0, /*end=*/1, @@ -1656,29 +1653,18 @@ /*text=*/L"e"); // L"before" <[obj]> [obj] L"after" L"tail" - // TODO(crbug.com/1039528): This should not include multiple characters. - { - const std::array<base::char16, 3> pieces = { - ui::AXPlatformNodeBase::kEmbeddedCharacter, - ui::AXPlatformNodeBase::kEmbeddedCharacter, L'a'}; - const base::string16 expect(pieces.cbegin(), pieces.cend()); - EXPECT_IA2_TEXT_AT_OFFSET(body_accessible_com, 6, IA2_TEXT_BOUNDARY_CHAR, - /*expected_hr=*/S_OK, /*start=*/6, /*end=*/9, - /*text=*/ - base::as_wcstr(expect)); - } + EXPECT_IA2_TEXT_AT_OFFSET( + body_accessible_com, 6, IA2_TEXT_BOUNDARY_CHAR, + /*expected_hr=*/S_OK, /*start=*/6, /*end=*/7, + /*text=*/ + base::string16{ui::AXPlatformNodeBase::kEmbeddedCharacter}.c_str()); // L"before" [obj] <[obj]> L"after" L"tail" - // TODO(crbug.com/1039528): This should not include multiple characters. - { - const std::array<base::char16, 2> pieces = { - ui::AXPlatformNodeBase::kEmbeddedCharacter, L'a'}; - const base::string16 expect(pieces.cbegin(), pieces.cend()); - EXPECT_IA2_TEXT_AT_OFFSET(body_accessible_com, 7, IA2_TEXT_BOUNDARY_CHAR, - /*expected_hr=*/S_OK, /*start=*/7, /*end=*/9, - /*text=*/ - base::as_wcstr(expect)); - } + EXPECT_IA2_TEXT_AT_OFFSET( + body_accessible_com, 7, IA2_TEXT_BOUNDARY_CHAR, + /*expected_hr=*/S_OK, /*start=*/7, /*end=*/8, + /*text=*/ + base::string16{ui::AXPlatformNodeBase::kEmbeddedCharacter}.c_str()); // L"before" [obj] [obj] L"<a>fter" L"tail" EXPECT_IA2_TEXT_AT_OFFSET(body_accessible_com, 8, IA2_TEXT_BOUNDARY_CHAR, @@ -1810,22 +1796,18 @@ /*text=*/nullptr); // L"befor<e>" [obj] <[obj]> L"after" L"tail" - // TODO(crbug.com/1039528): This should not include multiple characters. - { - const std::array<base::char16, 3> pieces = { - ui::AXPlatformNodeBase::kEmbeddedCharacter, - ui::AXPlatformNodeBase::kEmbeddedCharacter, L'a'}; - const base::string16 expect(pieces.cbegin(), pieces.cend()); - EXPECT_IA2_TEXT_AFTER_OFFSET(body_accessible_com, 5, IA2_TEXT_BOUNDARY_CHAR, - /*expected_hr=*/S_OK, /*start=*/6, /*end=*/9, - /*text=*/base::as_wcstr(expect)); - } + EXPECT_IA2_TEXT_AFTER_OFFSET( + body_accessible_com, 5, IA2_TEXT_BOUNDARY_CHAR, + /*expected_hr=*/S_OK, /*start=*/6, /*end=*/7, + /*text=*/ + base::string16{ui::AXPlatformNodeBase::kEmbeddedCharacter}.c_str()); // L"before" <[obj]> [obj] L"after" L"tail" - // TODO(crbug.com/1039528): This should probably not skip over L"a" - EXPECT_IA2_TEXT_AFTER_OFFSET(body_accessible_com, 6, IA2_TEXT_BOUNDARY_CHAR, - /*expected_hr=*/S_OK, /*start=*/9, /*end=*/10, - /*text=*/L"f"); + EXPECT_IA2_TEXT_AFTER_OFFSET( + body_accessible_com, 6, IA2_TEXT_BOUNDARY_CHAR, + /*expected_hr=*/S_OK, /*start=*/7, /*end=*/8, + /*text=*/ + base::string16{ui::AXPlatformNodeBase::kEmbeddedCharacter}.c_str()); // <[obj]> EXPECT_IA2_TEXT_AFTER_OFFSET(menu_1_accessible_com, 0, IA2_TEXT_BOUNDARY_CHAR,
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index ddd73dc7..6cd059c9 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -459,6 +459,10 @@ RunHtmlTest(FILE_PATH_LITERAL("absolute-offscreen.html")); } +IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityAccordion) { + RunHtmlTest(FILE_PATH_LITERAL("accordion.html")); +} + IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityActionVerbs) { RunHtmlTest(FILE_PATH_LITERAL("action-verbs.html")); }
diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc index 09a89e4..c0d2406b 100644 --- a/content/browser/browser_context.cc +++ b/content/browser/browser_context.cc
@@ -611,6 +611,7 @@ } void BrowserContext::SetCorsOriginAccessListForOrigin( + TargetBrowserContexts target_mode, const url::Origin& source_origin, std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc index cf5c7f9..833a36a 100644 --- a/content/browser/child_process_security_policy_impl.cc +++ b/content/browser/child_process_security_policy_impl.cc
@@ -1615,15 +1615,7 @@ // BrowsingInstances are registered in the process. Allow this for now, // to maintain legacy behavior, until we rule out all the ways it can // happen. - RenderProcessHostImpl* child_host = static_cast<RenderProcessHostImpl*>( - RenderProcessHost::FromID(child_id)); - DCHECK(child_host); - failure_reason = base::StringPrintf( - "No BIids, keep_alive_count = %zu, last_source = %d", - child_host->keep_alive_ref_count(), - child_host->keep_alive_last_source()); - // This will fall through to the call to - // LogCanAccessDataForOriginCrashKeys and log the failure reason. + return true; } for (auto browsing_instance_id : security_state->browsing_instance_ids()) {
diff --git a/content/browser/devtools/devtools_instrumentation.cc b/content/browser/devtools/devtools_instrumentation.cc index fa44f69..f43a7aa 100644 --- a/content/browser/devtools/devtools_instrumentation.cc +++ b/content/browser/devtools/devtools_instrumentation.cc
@@ -15,6 +15,7 @@ #include "content/browser/devtools/protocol/emulation_handler.h" #include "content/browser/devtools/protocol/fetch_handler.h" #include "content/browser/devtools/protocol/log_handler.h" +#include "content/browser/devtools/protocol/network.h" #include "content/browser/devtools/protocol/network_handler.h" #include "content/browser/devtools/protocol/page_handler.h" #include "content/browser/devtools/protocol/security_handler.h" @@ -771,6 +772,55 @@ resource_address_space); } +void OnPrivateNetworkRequest( + int32_t process_id, + int32_t routing_id, + const base::Optional<std::string>& devtools_request_id, + const GURL& url, + bool is_warning, + network::mojom::IPAddressSpace resource_address_space, + const network::mojom::ClientSecurityStatePtr client_security_state) { + FrameTreeNode* ftn = GetFtnForNetworkRequest(process_id, routing_id); + if (!ftn) + return; + auto cors_error_status = + protocol::Network::CorsErrorStatus::Create() + .SetCorsError( + protocol::Network::CorsErrorEnum::InsecurePrivateNetwork) + .SetFailedParameter("") + .Build(); + std::unique_ptr<protocol::Audits::AffectedRequest> affected_request = + protocol::Audits::AffectedRequest::Create() + .SetRequestId(devtools_request_id.value_or("")) + .SetUrl(url.spec()) + .Build(); + auto cors_issue_details = + protocol::Audits::CorsIssueDetails::Create() + .SetIsWarning(is_warning) + .SetResourceIPAddressSpace( + protocol::NetworkHandler::BuildIpAddressSpace( + resource_address_space)) + .SetRequest(std::move(affected_request)) + .SetCorsErrorStatus(std::move(cors_error_status)) + .Build(); + auto maybe_protocol_security_state = + protocol::NetworkHandler::MaybeBuildClientSecurityState( + client_security_state); + if (maybe_protocol_security_state.isJust()) { + cors_issue_details->SetClientSecurityState( + maybe_protocol_security_state.takeJust()); + } + auto details = protocol::Audits::InspectorIssueDetails::Create() + .SetCorsIssueDetails(std::move(cors_issue_details)) + .Build(); + + auto issue = protocol::Audits::InspectorIssue::Create() + .SetCode(protocol::Audits::InspectorIssueCodeEnum::CorsIssue) + .SetDetails(std::move(details)) + .Build(); + ReportBrowserInitiatedIssue(ftn->current_frame_host(), issue.get()); +} + void OnCorsPreflightRequest(int32_t process_id, int32_t render_frame_id, const base::UnguessableToken& devtools_request_id,
diff --git a/content/browser/devtools/devtools_instrumentation.h b/content/browser/devtools/devtools_instrumentation.h index 46de9b7..572f521 100644 --- a/content/browser/devtools/devtools_instrumentation.h +++ b/content/browser/devtools/devtools_instrumentation.h
@@ -157,6 +157,14 @@ const std::vector<network::mojom::HttpRawHeaderPairPtr>& response_headers, const base::Optional<std::string>& response_headers_text, network::mojom::IPAddressSpace resource_address_space); +void OnPrivateNetworkRequest( + int32_t process_id, + int32_t routing_id, + const base::Optional<std::string>& devtools_request_id, + const GURL& url, + bool is_warning, + network::mojom::IPAddressSpace resource_address_space, + const network::mojom::ClientSecurityStatePtr client_security_state); void OnCorsPreflightRequest(int32_t process_id, int32_t render_frame_id, const base::UnguessableToken& devtools_request_id,
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc index b57ebc00..0fb8b63 100644 --- a/content/browser/devtools/protocol/network_handler.cc +++ b/content/browser/devtools/protocol/network_handler.cc
@@ -2453,44 +2453,6 @@ return Response::Success(); } -namespace { -String BuildPrivateNetworkRequestPolicy( - network::mojom::PrivateNetworkRequestPolicy policy) { - switch (policy) { - case network::mojom::PrivateNetworkRequestPolicy::kAllow: - return protocol::Network::PrivateNetworkRequestPolicyEnum::Allow; - case network::mojom::PrivateNetworkRequestPolicy:: - kBlockFromInsecureToMorePrivate: - return protocol::Network::PrivateNetworkRequestPolicyEnum:: - BlockFromInsecureToMorePrivate; - } -} -String BuildIpAddressSpace(network::mojom::IPAddressSpace space) { - switch (space) { - case network::mojom::IPAddressSpace::kLocal: - return protocol::Network::IPAddressSpaceEnum::Local; - case network::mojom::IPAddressSpace::kPrivate: - return protocol::Network::IPAddressSpaceEnum::Private; - case network::mojom::IPAddressSpace::kPublic: - return protocol::Network::IPAddressSpaceEnum::Public; - case network::mojom::IPAddressSpace::kUnknown: - return protocol::Network::IPAddressSpaceEnum::Unknown; - } -} -Maybe<protocol::Network::ClientSecurityState> MaybeBuildClientSecurityState( - const network::mojom::ClientSecurityStatePtr& state) { - if (!state) { - return {}; - } - return protocol::Network::ClientSecurityState::Create() - .SetPrivateNetworkRequestPolicy(BuildPrivateNetworkRequestPolicy( - state->private_network_request_policy)) - .SetInitiatorIPAddressSpace(BuildIpAddressSpace(state->ip_address_space)) - .SetInitiatorIsSecureContext(state->is_web_secure_context) - .Build(); -} -} // namespace - void NetworkHandler::OnRequestWillBeSentExtraInfo( const std::string& devtools_request_id, const net::CookieAccessResultList& request_cookie_list, @@ -2744,5 +2706,49 @@ result.issued_token_count); } +String NetworkHandler::BuildPrivateNetworkRequestPolicy( + network::mojom::PrivateNetworkRequestPolicy policy) { + switch (policy) { + case network::mojom::PrivateNetworkRequestPolicy::kAllow: + return protocol::Network::PrivateNetworkRequestPolicyEnum::Allow; + case network::mojom::PrivateNetworkRequestPolicy:: + kBlockFromInsecureToMorePrivate: + return protocol::Network::PrivateNetworkRequestPolicyEnum:: + BlockFromInsecureToMorePrivate; + case network::mojom::PrivateNetworkRequestPolicy:: + kWarnFromInsecureToMorePrivate: + return protocol::Network::PrivateNetworkRequestPolicyEnum:: + WarnFromInsecureToMorePrivate; + } +} + +String NetworkHandler::BuildIpAddressSpace( + network::mojom::IPAddressSpace space) { + switch (space) { + case network::mojom::IPAddressSpace::kLocal: + return protocol::Network::IPAddressSpaceEnum::Local; + case network::mojom::IPAddressSpace::kPrivate: + return protocol::Network::IPAddressSpaceEnum::Private; + case network::mojom::IPAddressSpace::kPublic: + return protocol::Network::IPAddressSpaceEnum::Public; + case network::mojom::IPAddressSpace::kUnknown: + return protocol::Network::IPAddressSpaceEnum::Unknown; + } +} + +Maybe<protocol::Network::ClientSecurityState> +NetworkHandler::MaybeBuildClientSecurityState( + const network::mojom::ClientSecurityStatePtr& state) { + if (!state) { + return {}; + } + return protocol::Network::ClientSecurityState::Create() + .SetPrivateNetworkRequestPolicy(BuildPrivateNetworkRequestPolicy( + state->private_network_request_policy)) + .SetInitiatorIPAddressSpace(BuildIpAddressSpace(state->ip_address_space)) + .SetInitiatorIsSecureContext(state->is_web_secure_context) + .Build(); +} + } // namespace protocol } // namespace content
diff --git a/content/browser/devtools/protocol/network_handler.h b/content/browser/devtools/protocol/network_handler.h index 490bb609..183114d 100644 --- a/content/browser/devtools/protocol/network_handler.h +++ b/content/browser/devtools/protocol/network_handler.h
@@ -234,6 +234,15 @@ std::unique_ptr<protocol::Network::LoadNetworkResourceOptions> options, std::unique_ptr<LoadNetworkResourceCallback> callback) override; + // Protocol builders. + static String BuildPrivateNetworkRequestPolicy( + network::mojom::PrivateNetworkRequestPolicy policy); + static protocol::Network::IPAddressSpace BuildIpAddressSpace( + network::mojom::IPAddressSpace space); + static Maybe<protocol::Network::ClientSecurityState> + MaybeBuildClientSecurityState( + const network::mojom::ClientSecurityStatePtr& state); + private: void OnLoadNetworkResourceFinished(DevToolsNetworkResourceLoader* loader, const net::HttpResponseHeaders* rh,
diff --git a/content/browser/dom_storage/dom_storage_context_wrapper.cc b/content/browser/dom_storage/dom_storage_context_wrapper.cc index 91aee39b..3e07a3c2 100644 --- a/content/browser/dom_storage/dom_storage_context_wrapper.cc +++ b/content/browser/dom_storage/dom_storage_context_wrapper.cc
@@ -349,10 +349,13 @@ void DOMStorageContextWrapper::OnStartupUsageRetrieved( std::vector<storage::mojom::StorageUsageInfoPtr> usage) { - for (const auto& info : usage) { - if (storage_policy_observer_) - storage_policy_observer_->StartTrackingOrigin(info->origin); - } + if (!storage_policy_observer_) + return; + + std::vector<url::Origin> origins; + for (const auto& info : usage) + origins.emplace_back(std::move(info->origin)); + storage_policy_observer_->StartTrackingOrigins(std::move(origins)); } void DOMStorageContextWrapper::ApplyPolicyUpdates(
diff --git a/content/browser/form_controls_browsertest.cc b/content/browser/form_controls_browsertest.cc index 98540357..d5202db 100644 --- a/content/browser/form_controls_browsertest.cc +++ b/content/browser/form_controls_browsertest.cc
@@ -133,17 +133,28 @@ gfx::Size(screenshot_width, screenshot_height), comparator)); } + // Check if the test can run on the current system. + bool CheckShouldRunTest() const { +#if defined(OS_ANDROID) + // Lower versions of android running on older devices, ex Nexus 5, render + // form controls with a too large of a difference -- >20% error -- to + // pixel compare. + if (base::android::BuildInfo::GetInstance()->sdk_int() < + base::android::SDK_VERSION_OREO) { + return false; + } +#endif // defined(OS_ANDROID) + return true; + } + private: base::test::ScopedFeatureList feature_list_; }; -// Disabled due to https://crbug.com/1172370 -#if defined(OS_ANDROID) -#define MAYBE_Checkbox DISABLED_Checkbox -#else -#define MAYBE_Checkbox Checkbox -#endif -IN_PROC_BROWSER_TEST_F(FormControlsBrowserTest, MAYBE_Checkbox) { +IN_PROC_BROWSER_TEST_F(FormControlsBrowserTest, Checkbox) { + if (!CheckShouldRunTest()) + return; + RunTest("form_controls_browsertest_checkbox", "<input type=checkbox>" "<input type=checkbox checked>" @@ -157,13 +168,10 @@ /* screenshot_height */ 40); } -// Disabled due to https://crbug.com/1172370 -#if defined(OS_ANDROID) -#define MAYBE_Radio DISABLED_Radio -#else -#define MAYBE_Radio Radio -#endif -IN_PROC_BROWSER_TEST_F(FormControlsBrowserTest, MAYBE_Radio) { +IN_PROC_BROWSER_TEST_F(FormControlsBrowserTest, Radio) { + if (!CheckShouldRunTest()) + return; + RunTest("form_controls_browsertest_radio", "<input type=radio>" "<input type=radio checked>"
diff --git a/content/browser/mojo_binder_policy_applier.cc b/content/browser/mojo_binder_policy_applier.cc index df73e986..ff7f98a 100644 --- a/content/browser/mojo_binder_policy_applier.cc +++ b/content/browser/mojo_binder_policy_applier.cc
@@ -35,7 +35,6 @@ std::move(binder_callback).Run(); break; case MojoBinderPolicy::kCancel: - // TODO(crbug.com/1132752): Integrate with `PrerenderHostRegistry`. if (cancel_closure_) std::move(cancel_closure_).Run(); break;
diff --git a/content/browser/network_service_client.cc b/content/browser/network_service_client.cc index e185cf4..b3a89a8 100644 --- a/content/browser/network_service_client.cc +++ b/content/browser/network_service_client.cc
@@ -232,6 +232,19 @@ headers, raw_response_headers, resource_address_space); } +void NetworkServiceClient::OnPrivateNetworkRequest( + int32_t process_id, + int32_t routing_id, + const base::Optional<std::string>& devtools_request_id, + const GURL& url, + bool is_warning, + network::mojom::IPAddressSpace resource_address_space, + network::mojom::ClientSecurityStatePtr client_security_state) { + devtools_instrumentation::OnPrivateNetworkRequest( + process_id, routing_id, devtools_request_id, url, is_warning, + resource_address_space, std::move(client_security_state)); +} + void NetworkServiceClient::OnCorsPreflightRequest( int32_t process_id, int32_t render_frame_id,
diff --git a/content/browser/network_service_client.h b/content/browser/network_service_client.h index 4bb750af..482feccb 100644 --- a/content/browser/network_service_client.h +++ b/content/browser/network_service_client.h
@@ -65,6 +65,14 @@ std::vector<network::mojom::HttpRawHeaderPairPtr> headers, const base::Optional<std::string>& raw_response_headers, network::mojom::IPAddressSpace resource_address_space) override; + void OnPrivateNetworkRequest( + int32_t process_id, + int32_t routing_id, + const base::Optional<std::string>& devtools_request_id, + const GURL& url, + bool is_warning, + network::mojom::IPAddressSpace resource_address_space, + network::mojom::ClientSecurityStatePtr client_security_state) override; void OnCorsPreflightRequest( int32_t process_id, int32_t render_frame_id,
diff --git a/content/browser/prerender/prerender_host.cc b/content/browser/prerender/prerender_host.cc index 39295f48..1501af95 100644 --- a/content/browser/prerender/prerender_host.cc +++ b/content/browser/prerender/prerender_host.cc
@@ -101,9 +101,6 @@ // TODO(https://crbug.com/1142658): Notify renderer processes that the // contents get activated. - // TODO(https://crbug.com/1132752): Notify the mojo capability controller that - // the prerendered contents get activated. - RecordFinalStatus(FinalStatus::kActivated); return true; }
diff --git a/content/browser/renderer_host/cors_rfc1918_browsertest.cc b/content/browser/renderer_host/cors_rfc1918_browsertest.cc index 6030842..1e4e65d 100644 --- a/content/browser/renderer_host/cors_rfc1918_browsertest.cc +++ b/content/browser/renderer_host/cors_rfc1918_browsertest.cc
@@ -2096,6 +2096,23 @@ FetchSubresourceScript(GetTestUrl("", "empty.html").spec()))); } +// This test verifies that with the blocking feature disabled, the private +// network request policy used by RenderFrameHostImpl for requests is set +// to warn about insecure requests. +IN_PROC_BROWSER_TEST_F(CorsRfc1918BrowserTestNoBlocking, + PrivateNetworkPolicyIsWarnByDefault) { + EXPECT_TRUE(NavigateToURL( + shell(), InsecureTreatAsPublicAddressURL(*embedded_test_server()))); + + const network::mojom::ClientSecurityStatePtr security_state = + root_frame_host()->BuildClientSecurityState(); + ASSERT_FALSE(security_state.is_null()); + + EXPECT_EQ(security_state->private_network_request_policy, + network::mojom::PrivateNetworkRequestPolicy:: + kWarnFromInsecureToMorePrivate); +} + // This test mimics the tests below, with the blocking feature disabled. It // verifies that by default requests: // - from an insecure page with the "treat-as-public-address" CSP directive
diff --git a/content/browser/renderer_host/keep_alive_handle_factory.cc b/content/browser/renderer_host/keep_alive_handle_factory.cc index 90f1e61..ebec43be 100644 --- a/content/browser/renderer_host/keep_alive_handle_factory.cc +++ b/content/browser/renderer_host/keep_alive_handle_factory.cc
@@ -30,8 +30,7 @@ if (!process_host || process_host->IsKeepAliveRefCountDisabled()) { return; } - process_host->IncrementKeepAliveRefCount( - RenderProcessHost::KeepAliveSource::KEEP_ALIVE_HANDLE_FACTORY); + process_host->IncrementKeepAliveRefCount(); } ~KeepAliveHandleImpl() override { GetContentClient()->browser()->OnKeepaliveRequestFinished();
diff --git a/content/browser/renderer_host/navigation_controller_impl.cc b/content/browser/renderer_host/navigation_controller_impl.cc index f39c8f4..055f4bc 100644 --- a/content/browser/renderer_host/navigation_controller_impl.cc +++ b/content/browser/renderer_host/navigation_controller_impl.cc
@@ -3936,6 +3936,34 @@ delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); } +void NavigationControllerImpl::HideEntryForEarlySwapAfterCrash( + RenderFrameHostImpl* rfh) { + // Nothing to do if there is no last committed entry to hide, or if we aren't + // swapping RenderFrameHosts before commit after a crash. + if (!GetLastCommittedEntry() || ShouldSkipEarlyCommitPendingForCrashedFrame()) + return; + + // Create a temporary about:blank NavigationEntry to show if we swap to a + // scriptable RenderFrameHost before the navigation commits (after a crash). + // The previous last committed entry will be set aside and restored if we go + // anywhere else or attempt a reload, just like a post-commit error page. + // + // Other uses of post-commit error pages will put the original entry back in + // RendererDidNavigate before creating a subsequent post-commit error page in + // InsertOrReplaceEntry. + // + // TODO(https://crbug.com/1072817): Remove this hack after we stop swapping + // RenderFrameHosts before the navigation commits. + InsertOrReplaceEntry( + std::make_unique<NavigationEntryImpl>( + rfh->GetSiteInstance(), GURL(url::kAboutBlankURL), Referrer(), + url::Origin() /* initiator origin */, + base::string16() /* extra_headers */, ui::PAGE_TRANSITION_LINK, + true /*is_renderer_initiated*/, + nullptr /* blob_url_loader_factory */), + true /* replace */, true /* was_post_commit_error */); +} + void NavigationControllerImpl::UpdateStateForFrame( RenderFrameHostImpl* rfhi, const blink::PageState& page_state) {
diff --git a/content/browser/renderer_host/navigation_controller_impl.h b/content/browser/renderer_host/navigation_controller_impl.h index 6432e77..40fc2fb 100644 --- a/content/browser/renderer_host/navigation_controller_impl.h +++ b/content/browser/renderer_host/navigation_controller_impl.h
@@ -326,6 +326,13 @@ // is no longer safe to display a pending URL without risking a URL spoof. void DidAccessInitialMainDocument(); + // Temporary hack to stop showing the last committed entry when we swap + // RenderFrameHosts before a navigation commits (e.g., after the previous + // process crashed). + // TODO(https://crbug.com/1072817): Remove this hack after we stop swapping + // RenderFrameHosts before the navigation commits. + void HideEntryForEarlySwapAfterCrash(RenderFrameHostImpl* rfh); + // The state for the page changed and should be updated in session history. void UpdateStateForFrame(RenderFrameHostImpl* render_frame_host, const blink::PageState& page_state);
diff --git a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc index f2437dd..13c995a 100644 --- a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc +++ b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
@@ -343,6 +343,10 @@ GURL url_in_redirect_chain = base_url_empty ? commit_url : base_url; EXPECT_EQ(entry->GetRedirectChain()[0], url_in_redirect_chain); + // The original request URL for loadDataWithBaseURL navigations will be the + // URL used for commit (the data URL/header). + EXPECT_EQ(entry->GetOriginalRequestURL(), commit_url); + // 3) Now reload and make sure the renderer isn't killed. ReloadBlockUntilNavigationsComplete(shell(), 1); EXPECT_TRUE(shell()->web_contents()->GetMainFrame()->IsRenderFrameLive()); @@ -358,6 +362,10 @@ EXPECT_EQ(reload_entry->GetRedirectChain().size(), 1u); EXPECT_EQ(reload_entry->GetRedirectChain()[0], url_in_redirect_chain); + + // The original request URL for loadDataWithBaseURL navigations will be the + // URL used for commit (the data URL/header). + EXPECT_EQ(entry->GetOriginalRequestURL(), commit_url); } IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, LoadDataWithBaseURL) { @@ -5695,8 +5703,13 @@ EXPECT_EQ(entry->GetRedirectChain().size(), 2u); EXPECT_EQ(entry->GetRedirectChain()[0], redirecting_url); EXPECT_EQ(entry->GetRedirectChain()[1], final_url); + // No replaced entry because it's not a client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, which + // is the URL that initiated the server redirect. + EXPECT_EQ(entry->GetOriginalRequestURL(), redirecting_url); } // Verifies that FrameNavigationEntry's redirect chain is created and stored on @@ -5789,6 +5802,10 @@ // No replaced entry because it's not a client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, which + // is also the final URL. + EXPECT_EQ(entry->GetOriginalRequestURL(), start_url); } GURL fragment_url(embedded_test_server()->GetURL("/title1.html#foo")); @@ -5813,6 +5830,10 @@ // No replaced entry because it's not a "real" client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, + // which is the URL that initiated the client redirect. + EXPECT_EQ(entry->GetOriginalRequestURL(), start_url); } { @@ -5838,6 +5859,10 @@ // No replaced entry because it's not a "real" client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, + // which is the URL that initiated the client redirect. + EXPECT_EQ(entry->GetOriginalRequestURL(), fragment_url); } { @@ -5858,6 +5883,10 @@ // No replaced entry because it's not a client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, which + // is also the final URL. + EXPECT_EQ(entry->GetOriginalRequestURL(), fragment_url_2); } } @@ -5883,6 +5912,10 @@ // No replaced entry because it's not a client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, which + // is also the final URL. + EXPECT_EQ(entry->GetOriginalRequestURL(), start_url); } GURL url_2(embedded_test_server()->GetURL("/title2.html")); @@ -5913,6 +5946,10 @@ // No replaced entry because it's not a "real" client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, + // which is the URL that initiated the client redirect. + EXPECT_EQ(entry->GetOriginalRequestURL(), entry->GetRedirectChain()[0]); } { @@ -5933,6 +5970,10 @@ // No replaced entry because it's not a client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, which + // is also the final URL. + EXPECT_EQ(entry->GetOriginalRequestURL(), url_3); } } @@ -5958,6 +5999,10 @@ // No replaced entry because it's not a client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, which + // is also the final URL. + EXPECT_EQ(entry->GetOriginalRequestURL(), start_url); } GURL url_2(embedded_test_server()->GetURL("b.com", "/title2.html")); @@ -5990,6 +6035,13 @@ // No replaced entry because it's not a "real" client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, + // which is the URL that initiated the client redirect. However due to the + // bug above this will actually result in a blank URL. + // TODO(https://crbug.com/1171210): Fix this. Also, figure out why this also + // happens when we didn't enter the "about:blank#blocked" part above? + EXPECT_EQ(entry->GetOriginalRequestURL(), GURL()); } { @@ -6010,6 +6062,10 @@ // No replaced entry because it's not a client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, which + // is also the final URL. + EXPECT_EQ(entry->GetOriginalRequestURL(), url_3); } } @@ -6035,6 +6091,10 @@ // No replaced entry because it's not a client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, which + // is also the final URL. + EXPECT_EQ(entry->GetOriginalRequestURL(), start_url); } { @@ -6059,6 +6119,10 @@ // The URL is saved as the "replaced entry" because it's a reload. ASSERT_TRUE(entry->GetReplacedEntryData().has_value()); EXPECT_EQ(start_url, entry->GetReplacedEntryData()->first_committed_url); + + // The original request URL will be the first entry of redirect chain, + // which is the URL that initiated the client redirect. + EXPECT_EQ(entry->GetOriginalRequestURL(), start_url); } { @@ -6082,6 +6146,10 @@ // The URL is saved as the "replaced entry" because it's a reload. ASSERT_TRUE(entry->GetReplacedEntryData().has_value()); EXPECT_EQ(start_url, entry->GetReplacedEntryData()->first_committed_url); + + // The original request URL will be the first entry of redirect chain, which + // is also the final URL. + EXPECT_EQ(entry->GetOriginalRequestURL(), start_url); } { @@ -6114,6 +6182,10 @@ // The URL is saved as the "replaced entry" because it's a reload. ASSERT_TRUE(entry->GetReplacedEntryData().has_value()); EXPECT_EQ(start_url, entry->GetReplacedEntryData()->first_committed_url); + + // The original request URL will be the first entry of redirect chain, which + // is also the final URL. + EXPECT_EQ(entry->GetOriginalRequestURL(), start_url); } } @@ -6140,6 +6212,10 @@ // No replaced entry because it's not a client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, which + // is also the final URL. + EXPECT_EQ(entry->GetOriginalRequestURL(), start_url); } FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) @@ -6224,6 +6300,10 @@ // No replaced entry because it's not a client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, which + // is also the final URL. + EXPECT_EQ(entry->GetOriginalRequestURL(), start_url); } GURL url_2(embedded_test_server()->GetURL("b.com", "/empty404.html")); @@ -6237,13 +6317,17 @@ // On renderer-initiated cross-site navigations with no redirects that end // up in error pages, the redirect chain contains the error page URL. - // TODO(https://crbug.com/1171237): Should this be the commit URL (url_2) - // instead? + // TODO(https://crbug.com/1171237): This should be the commit URL (url_2) + // instead. EXPECT_EQ(entry->GetRedirectChain().size(), 1u); EXPECT_EQ(entry->GetRedirectChain()[0], GURL(kUnreachableWebDataURL)); // No replaced entry because it's not a client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL on navigations that end up in an error page will + // be the URL of the page that failed to load. + EXPECT_EQ(entry->GetOriginalRequestURL(), url_2); } { @@ -6262,6 +6346,109 @@ // No replaced entry because it's not a client-side redirect. EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL on navigations that end up in an error page will + // be the URL of the page that failed to load. + EXPECT_EQ(entry->GetOriginalRequestURL(), url_3); + } +} + +// Checks the contents of the redirect chain after a browser-initiated +// navigation that server-redirects to an error page. +IN_PROC_BROWSER_TEST_P( + NavigationControllerBrowserTest, + FrameNavigationEntry_ServerRedirectToErrorPage_BrowserInitiated) { + NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>( + shell()->web_contents()->GetController()); + + GURL server_redirecting_url( + embedded_test_server()->GetURL("/server-redirect?/empty404.html")); + + // Browser-initiated cross-site navigation that server-redirects to an empty + // 404 page, which would result in an error page. + GURL fail_url(embedded_test_server()->GetURL("/empty404.html")); + EXPECT_FALSE(NavigateToURL(shell(), fail_url)); + + EXPECT_EQ(1, controller.GetEntryCount()); + NavigationEntry* entry = controller.GetLastCommittedEntry(); + EXPECT_EQ(fail_url, entry->GetURL()); + + // On navigations that end up in error pages, the redirect chain only + // contains the error page URL, even if the navigation went through server + // redirects. + // TODO(https://crbug.com/1171237): This should be the commit URL (fail_url) + // instead. + EXPECT_EQ(entry->GetRedirectChain().size(), 1u); + EXPECT_EQ(entry->GetRedirectChain()[0], GURL(kUnreachableWebDataURL)); + + // No replaced entry because it's not a client-side redirect. + EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL on navigations that end up in an error page will + // be the URL of the page that failed to load even if the navigation went + // through server redirects. + EXPECT_EQ(entry->GetOriginalRequestURL(), fail_url); +} + +// Checks the contents of the redirect chain after a renderer-initiated +// navigation that server-redirects to an error page. +IN_PROC_BROWSER_TEST_P( + NavigationControllerBrowserTest, + FrameNavigationEntry_ServerRedirectToErrorPage_RendererInitiated) { + NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>( + shell()->web_contents()->GetController()); + + // Navigate the main frame to a normal URL that won't cause any redirects, so + // that we can do a renderer-initiated navigation after this. + GURL start_url(embedded_test_server()->GetURL("/title1.html")); + + { + EXPECT_TRUE(NavigateToURL(shell(), start_url)); + + ASSERT_EQ(1, controller.GetEntryCount()); + NavigationEntry* entry = controller.GetLastCommittedEntry(); + ASSERT_EQ(start_url, entry->GetURL()); + // The redirect chain contains only the URL we navigated to. + EXPECT_EQ(entry->GetRedirectChain().size(), 1u); + EXPECT_EQ(entry->GetRedirectChain()[0], start_url); + + // No replaced entry because it's not a client-side redirect. + EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL will be the first entry of redirect chain, which + // is also the final URL. + EXPECT_EQ(entry->GetOriginalRequestURL(), start_url); + } + + { + // Renderer-initiated cross-site navigation that server-redirects to an + // empty 404 page, which would result in an error page. Note that since this + // is a script-initiated navigation, it will be marked as a client redirect + // too. + GURL server_redirecting_url( + embedded_test_server()->GetURL("/server-redirect?/empty404.html")); + GURL fail_url(embedded_test_server()->GetURL("/empty404.html")); + EXPECT_FALSE(NavigateToURLFromRenderer(shell(), server_redirecting_url)); + + EXPECT_EQ(2, controller.GetEntryCount()); + NavigationEntry* entry = controller.GetLastCommittedEntry(); + EXPECT_EQ(fail_url, entry->GetURL()); + + // On navigations that end up in error pages, the redirect chain only + // contains the error page URL, even if the navigation went through client + // and server redirects. + // TODO(https://crbug.com/1171237): This should be the commit URL (fail_url) + // instead. + EXPECT_EQ(entry->GetRedirectChain().size(), 1u); + EXPECT_EQ(entry->GetRedirectChain()[0], GURL(kUnreachableWebDataURL)); + + // No replaced entry because it's not a client-side redirect. + EXPECT_FALSE(entry->GetReplacedEntryData().has_value()); + + // The original request URL on navigations that end up in an error page will + // be the URL of the page that failed to load even if the navigation went + // through client and server redirects. + EXPECT_EQ(entry->GetOriginalRequestURL(), fail_url); } } @@ -6305,6 +6492,10 @@ ASSERT_TRUE(entry->GetReplacedEntryData().has_value()); EXPECT_EQ(client_redirecting_url, entry->GetReplacedEntryData()->first_committed_url); + + // The original request URL will be the first entry of redirect chain, + // which is the URL that initiated the client redirect. + EXPECT_EQ(entry->GetOriginalRequestURL(), client_redirecting_url); } { @@ -6331,6 +6522,10 @@ EXPECT_TRUE(entry->GetReplacedEntryData().has_value()); EXPECT_EQ(client_redirecting_url, entry->GetReplacedEntryData()->first_committed_url); + + // The original request URL will be the first entry of redirect chain, + // which is the URL that initiated the client redirect. + EXPECT_EQ(entry->GetOriginalRequestURL(), final_url); } } @@ -6375,6 +6570,10 @@ ASSERT_TRUE(entry->GetReplacedEntryData().has_value()); EXPECT_EQ(client_redirecting_url, entry->GetReplacedEntryData()->first_committed_url); + + // The original request URL will be the first entry of redirect chain, + // which is the URL that initiated the client redirect. + EXPECT_EQ(entry->GetOriginalRequestURL(), client_redirecting_url); } { @@ -6400,6 +6599,10 @@ EXPECT_TRUE(entry->GetReplacedEntryData().has_value()); EXPECT_EQ(client_redirecting_url, entry->GetReplacedEntryData()->first_committed_url); + + // The original request URL will be the first entry of redirect chain, + // which is the URL that initiated the client redirect. + EXPECT_EQ(entry->GetOriginalRequestURL(), final_url); } } @@ -6444,6 +6647,10 @@ ASSERT_TRUE(entry->GetReplacedEntryData().has_value()); EXPECT_EQ(client_redirecting_url, entry->GetReplacedEntryData()->first_committed_url); + + // The original request URL will be the first entry of redirect chain, + // which is the URL that initiated the client redirect. + EXPECT_EQ(entry->GetOriginalRequestURL(), client_redirecting_url); } } @@ -6491,6 +6698,10 @@ ASSERT_TRUE(entry->GetReplacedEntryData().has_value()); EXPECT_EQ(client_redirecting_url, entry->GetReplacedEntryData()->first_committed_url); + + // The original request URL will be the first entry of redirect chain, + // which is the URL that initiated the client redirect. + EXPECT_EQ(entry->GetOriginalRequestURL(), client_redirecting_url); } } @@ -11877,6 +12088,90 @@ "!!(iframe.contentDocument)")); } +// Verifies that we do not show a crashed page's URL above another site's +// initial empty document. See https://crbug.com/1111646. +IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, + VerifyURLAfterNavigatingCrashedPopup) { + // This test only makes sense if you can crash the cross-site popup's process. + if (!AreAllSitesIsolatedForTesting()) + return; + + // Navigate to a page. + GURL opener_url(embedded_test_server()->GetURL("a.com", "/title1.html")); + EXPECT_TRUE(NavigateToURL(shell(), opener_url)); + RenderFrameHost* opener_frame = shell()->web_contents()->GetMainFrame(); + scoped_refptr<SiteInstance> opener_site_instance = + opener_frame->GetSiteInstance(); + + // Open a cross-site popup that commits in a new process. + GURL popup_url(embedded_test_server()->GetURL("b.com", "/title1.html")); + Shell* popup_shell = OpenPopup(opener_frame, popup_url, "popup"); + EXPECT_TRUE(popup_shell); + WebContentsImpl* popup_contents = + static_cast<WebContentsImpl*>(popup_shell->web_contents()); + NavigationControllerImpl& controller = popup_contents->GetController(); + RenderFrameHostImpl* popup_main_frame = popup_contents->GetMainFrame(); + scoped_refptr<SiteInstance> popup_site_instance = + popup_main_frame->GetSiteInstance(); + EXPECT_NE(opener_frame->GetProcess(), popup_main_frame->GetProcess()); + NavigationEntryImpl* entry_b = controller.GetLastCommittedEntry(); + EXPECT_EQ(popup_url, entry_b->GetURL()); + + // Crash the popup. The URL should still be visible. + { + RenderProcessHost* process_b = popup_main_frame->GetProcess(); + RenderProcessHostWatcher crash_observer( + process_b, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); + process_b->Shutdown(0); + crash_observer.Wait(); + } + EXPECT_EQ(entry_b, controller.GetLastCommittedEntry()); + EXPECT_EQ(popup_url, entry_b->GetURL()); + + // Navigate the existing popup to a same-site URL that does not commit. (Here, + // we use a data URL that gets blocked.) There is no commit event to wait for, + // but the window.open call should trigger a RenderFrameHost swap because the + // previous RenderFrameHost isn't live. + EXPECT_TRUE( + ExecJs(shell(), "var popup = window.open('data:text/html,a', 'popup');")); + + if (ShouldSkipEarlyCommitPendingForCrashedFrame()) { + // Once https://crbug.com/1072817 is fixed, the sad tab will remain sad + // after the unsuccessful navigation above and no content will be visible + // below it. + EXPECT_EQ(popup_main_frame, popup_contents->GetMainFrame()); + EXPECT_EQ(popup_site_instance, + popup_contents->GetMainFrame()->GetSiteInstance()); + EXPECT_FALSE(popup_main_frame->IsRenderFrameLive()); + EXPECT_EQ(entry_b, controller.GetLastCommittedEntry()); + return; + } + + // TODO(https://crbug.com/1072817): Remove the expectations below once we stop + // swapping RFHs before the navigation commits. + + // When the RFH swaps (due to an optimization), ensure we do not show the + // previous last committed entry of the popup above the scriptable initial + // empty document of the new RFH. + EXPECT_NE(popup_main_frame, popup_contents->GetMainFrame()); + EXPECT_EQ(opener_site_instance, + popup_contents->GetMainFrame()->GetSiteInstance()); + EXPECT_NE(entry_b, controller.GetLastCommittedEntry()); + EXPECT_EQ(GURL(url::kAboutBlankURL), + controller.GetLastCommittedEntry()->GetURL()); + + // The original last committed entry should be preserved in case of reload. + { + TestNavigationObserver reload_observer(popup_contents); + controller.Reload(ReloadType::NORMAL, false); + reload_observer.Wait(); + } + EXPECT_NE(opener_site_instance, + popup_contents->GetMainFrame()->GetSiteInstance()); + EXPECT_EQ(entry_b, controller.GetLastCommittedEntry()); + EXPECT_EQ(popup_url, controller.GetLastCommittedEntry()->GetURL()); +} + // Starts a navigation to |url_to_start_| just before the DidCommitNavigation // call for |url_to_intercept_| gets processed. class NavigationStarterBeforeDidCommitNavigation @@ -11994,6 +12289,50 @@ EXPECT_EQ(url2, controller.GetEntryAtOffset(1)->GetURL()); } +// Test to verify that after loading a post-commit error page, forward entries +// are preserved and are treated as navigating to the entry after the page that +// was active when the post-commit error page was triggered. +IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, + ForwardOnBrowserInitiatedErrorPageNavigation) { + NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>( + shell()->web_contents()->GetController()); + + GURL url1(embedded_test_server()->GetURL("/title1.html")); + GURL url2(embedded_test_server()->GetURL("/title2.html")); + + // Navigate to a valid page. + EXPECT_TRUE(NavigateToURL(shell(), url1)); + + // Navigate to a different page. + EXPECT_TRUE(NavigateToURL(shell(), url2)); + + // Go back. + controller.GoBack(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + + // Trigger a post-commit error page navigation and ensure forward history is + // preserved. + TestNavigationObserver error_observer(shell()->web_contents()); + controller.LoadPostCommitErrorPage(shell()->web_contents()->GetMainFrame(), + url1, "Error Page", + net::ERR_BLOCKED_BY_CLIENT); + error_observer.Wait(); + EXPECT_EQ(PAGE_TYPE_ERROR, controller.GetLastCommittedEntry()->GetPageType()); + EXPECT_EQ(2, controller.GetEntryCount()); + EXPECT_EQ(0, controller.GetLastCommittedEntryIndex()); + + // Make sure forward is treated as going forward from the page that was + // visible when the post-commit error page was loaded. + controller.GoForward(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + EXPECT_EQ(2, controller.GetEntryCount()); + EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); + // Check that the previous entry has been replaced with the original visit + // to the site (i.e. it shouldn't be the error page). + EXPECT_EQ(PAGE_TYPE_NORMAL, controller.GetEntryAtOffset(-1)->GetPageType()); + EXPECT_EQ(url1, controller.GetEntryAtOffset(-1)->GetURL()); +} + // Test to verify that after loading a post-commit error page, reload // triggers a navigation to the previous page (the page that was active when // the navigation to an error was triggered). @@ -12087,6 +12426,58 @@ EXPECT_EQ(1, new_controller.GetEntryCount()); } +// Test to verify that loading a second post-commit error page preserves the +// original entry and not the previous post-commit error page. +IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, + DoublePostCommitErrorPage) { + NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>( + shell()->web_contents()->GetController()); + + GURL url1(embedded_test_server()->GetURL("/title1.html")); + GURL url2(embedded_test_server()->GetURL("/title2.html")); + + // Navigate to a valid page. + EXPECT_TRUE(NavigateToURL(shell(), url1)); + + // Navigate to a different page. + EXPECT_TRUE(NavigateToURL(shell(), url2)); + int initial_entry_index = controller.GetLastCommittedEntryIndex(); + int initial_entry_id = controller.GetLastCommittedEntry()->GetUniqueID(); + + // Trigger a first post-commit error page navigation. + TestNavigationObserver error_observer1(shell()->web_contents()); + controller.LoadPostCommitErrorPage(shell()->web_contents()->GetMainFrame(), + GURL(url::kAboutBlankURL), "Error Page 1", + net::ERR_BLOCKED_BY_CLIENT); + error_observer1.Wait(); + EXPECT_EQ(PAGE_TYPE_ERROR, controller.GetLastCommittedEntry()->GetPageType()); + EXPECT_EQ(2, controller.GetEntryCount()); + EXPECT_EQ(initial_entry_index, controller.GetLastCommittedEntryIndex()); + + // Trigger a second post-commit error page navigation. + TestNavigationObserver error_observer2(shell()->web_contents()); + controller.LoadPostCommitErrorPage(shell()->web_contents()->GetMainFrame(), + GURL("data:text/html,2"), "Error Page 2", + net::ERR_BLOCKED_BY_CLIENT); + error_observer2.Wait(); + EXPECT_EQ(PAGE_TYPE_ERROR, controller.GetLastCommittedEntry()->GetPageType()); + EXPECT_EQ(2, controller.GetEntryCount()); + EXPECT_EQ(initial_entry_index, controller.GetLastCommittedEntryIndex()); + + // Make sure reload triggers a reload of the original page, not either error, + // and that we get back to the original entry. + controller.Reload(ReloadType::NORMAL, false); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + EXPECT_EQ(initial_entry_index, controller.GetLastCommittedEntryIndex()); + + // We should be in the initial entry and no longer be in an error page. + EXPECT_EQ(initial_entry_id, + controller.GetLastCommittedEntry()->GetUniqueID()); + EXPECT_EQ(PAGE_TYPE_NORMAL, + controller.GetLastCommittedEntry()->GetPageType()); + EXPECT_EQ(url2, controller.GetLastCommittedEntry()->GetURL()); +} + // Tests that the navigation entry is marked as skippable on back/forward button // if it does a renderer initiated navigation without ever getting a user // activation.
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 72e77e3..f7fd3404 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -3020,8 +3020,8 @@ // right feature is not enabled. if (!base::FeatureList::IsEnabled( features::kBlockInsecurePrivateNetworkRequestsForNavigations)) { - client_security_state->private_network_request_policy = - network::mojom::PrivateNetworkRequestPolicy::kAllow; + client_security_state->private_network_request_policy = network::mojom:: + PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate; } } @@ -4647,12 +4647,6 @@ if (computed_ip_address_space != network::mojom::IPAddressSpace::kUnknown) policy_container_host_->SetIPAddressSpace(computed_ip_address_space); - if (!base::FeatureList::IsEnabled( - features::kBlockInsecurePrivateNetworkRequests)) { - // No need to ask the content browser client, the feature is entirely off. - return; - } - ContentBrowserClient* client = GetContentClient()->browser(); BrowserContext* context = frame_tree_node_->navigator().GetController()->GetBrowserContext(); @@ -4660,11 +4654,18 @@ url::Origin origin = GetOriginForURLLoaderFactory(); if (client->ShouldAllowInsecurePrivateNetworkRequests(context, origin)) { // The content browser client decided to make an exception for this URL. + private_network_request_policy_ = + network::mojom::PrivateNetworkRequestPolicy::kAllow; return; } - private_network_request_policy_ = network::mojom:: - PrivateNetworkRequestPolicy::kBlockFromInsecureToMorePrivate; + private_network_request_policy_ = + base::FeatureList::IsEnabled( + features::kBlockInsecurePrivateNetworkRequests) + ? network::mojom::PrivateNetworkRequestPolicy:: + kBlockFromInsecureToMorePrivate + : network::mojom::PrivateNetworkRequestPolicy:: + kWarnFromInsecureToMorePrivate; } void NavigationRequest::ReadyToCommitNavigation(bool is_error) {
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h index 2128cf05..5dbfedd 100644 --- a/content/browser/renderer_host/navigation_request.h +++ b/content/browser/renderer_host/navigation_request.h
@@ -1601,7 +1601,8 @@ // https://crbug.com/1154729 network::CrossOriginEmbedderPolicy cross_origin_embedder_policy_; network::mojom::PrivateNetworkRequestPolicy private_network_request_policy_ = - network::mojom::PrivateNetworkRequestPolicy::kAllow; + network::mojom::PrivateNetworkRequestPolicy:: + kWarnFromInsecureToMorePrivate; base::WeakPtrFactory<NavigationRequest> weak_factory_{this};
diff --git a/content/browser/renderer_host/raw_clipboard_host_impl.cc b/content/browser/renderer_host/raw_clipboard_host_impl.cc index b02ba07..8a219b9 100644 --- a/content/browser/renderer_host/raw_clipboard_host_impl.cc +++ b/content/browser/renderer_host/raw_clipboard_host_impl.cc
@@ -8,12 +8,14 @@ #include "base/bind.h" #include "base/i18n/number_formatting.h" +#include "base/memory/ptr_util.h" #include "content/browser/permissions/permission_controller_impl.h" #include "content/browser/renderer_host/clipboard_host_impl.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/common/child_process_host.h" #include "ipc/ipc_message.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/mojom/clipboard/raw_clipboard.mojom.h" #include "third_party/blink/public/mojom/permissions/permission_status.mojom-shared.h" @@ -61,29 +63,20 @@ return; } - // Clipboard implementations do interesting things, like run nested message - // loops. Use manual memory management instead of SelfOwnedReceiver<T> which - // synchronously destroys on failure and can result in some unfortunate - // use-after-frees after the nested message loops exit. - auto* host = new RawClipboardHostImpl(std::move(receiver), render_frame_host); - host->receiver_.set_disconnect_handler(base::BindOnce( - [](RawClipboardHostImpl* host) { - base::SequencedTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, host); - }, - host)); + mojo::MakeSelfOwnedReceiver( + base::WrapUnique(new RawClipboardHostImpl( + static_cast<RenderFrameHostImpl*>(render_frame_host))), + std::move(receiver)); } RawClipboardHostImpl::~RawClipboardHostImpl() { clipboard_writer_->Reset(); } -RawClipboardHostImpl::RawClipboardHostImpl( - mojo::PendingReceiver<blink::mojom::RawClipboardHost> receiver, - RenderFrameHost* render_frame_host) +RawClipboardHostImpl::RawClipboardHostImpl(RenderFrameHost* render_frame_host) : render_frame_routing_id_( GlobalFrameRoutingId(render_frame_host->GetProcess()->GetID(), render_frame_host->GetRoutingID())), - receiver_(this, std::move(receiver)), clipboard_(ui::Clipboard::GetForCurrentThread()), clipboard_writer_( new ui::ScopedClipboardWriter(ui::ClipboardBuffer::kCopyPaste, @@ -106,7 +99,7 @@ if (!HasTransientUserActivation()) return; if (format.size() >= kMaxFormatSize) { - receiver_.ReportBadMessage("Requested format string length too long."); + mojo::ReportBadMessage("Requested format string length too long."); return; } @@ -125,11 +118,11 @@ if (!HasTransientUserActivation()) return; if (format.size() >= kMaxFormatSize) { - receiver_.ReportBadMessage("Target format string length too long."); + mojo::ReportBadMessage("Target format string length too long."); return; } if (data.size() >= kMaxDataSize) { - receiver_.ReportBadMessage("Write data too large."); + mojo::ReportBadMessage("Write data too large."); return; }
diff --git a/content/browser/renderer_host/raw_clipboard_host_impl.h b/content/browser/renderer_host/raw_clipboard_host_impl.h index 16dda82..d5816c03 100644 --- a/content/browser/renderer_host/raw_clipboard_host_impl.h +++ b/content/browser/renderer_host/raw_clipboard_host_impl.h
@@ -33,9 +33,7 @@ ~RawClipboardHostImpl() override; private: - RawClipboardHostImpl( - mojo::PendingReceiver<blink::mojom::RawClipboardHost> receiver, - RenderFrameHost* render_frame_host); + explicit RawClipboardHostImpl(RenderFrameHost* render_frame_host); // mojom::RawClipboardHost. void ReadAvailableFormatNames( @@ -50,7 +48,6 @@ // The render frame is not owned. const GlobalFrameRoutingId render_frame_routing_id_; - mojo::Receiver<blink::mojom::RawClipboardHost> receiver_; ui::Clipboard* const clipboard_; // Not owned. std::unique_ptr<ui::ScopedClipboardWriter> clipboard_writer_; };
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index ec3aba1..b40d265a 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -1103,8 +1103,8 @@ if (!base::FeatureList::IsEnabled( features::kBlockInsecurePrivateNetworkRequests)) { - private_network_request_policy_ = - network::mojom::PrivateNetworkRequestPolicy::kAllow; + private_network_request_policy_ = network::mojom:: + PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate; } unload_event_monitor_timeout_ =
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index f23f999..91a4c1e 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -3129,9 +3129,6 @@ // BrowserInterfaceBroker implementation through which this // RenderFrameHostImpl exposes document-scoped Mojo services to the currently // active document in the corresponding RenderFrame. - // TODO(crbug.com/1132752): Enable capability control for Prerender2 by - // initializing BrowserInterfaceBrokerImpl with a non-null - // MojoBinderPolicyApplier pointer. BrowserInterfaceBrokerImpl<RenderFrameHostImpl, RenderFrameHost*> broker_{ this}; mojo::Receiver<blink::mojom::BrowserInterfaceBroker> broker_receiver_{
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc index 928b28ac..b8ace6d 100644 --- a/content/browser/renderer_host/render_frame_host_manager.cc +++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -916,6 +916,16 @@ CommitPending(std::move(speculative_render_frame_host_), nullptr, request->coop_status().require_browsing_instance_swap()); + + // Ensure that renderer-initiated main frame navigations that swap away + // from a non-live RenderFrameHost before commit do not leave the old URL + // visible in the address bar above a scriptable about:blank document. + // TODO(https://crbug.com/1072817): Remove this logic when removing the + // early commit. + if (frame_tree_node_->IsMainFrame() && request->IsRendererInitiated()) { + GetNavigationController().HideEntryForEarlySwapAfterCrash( + render_frame_host_.get()); + } } } DCHECK(navigation_rfh &&
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 478a8cb4..0f62a9f4 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2213,7 +2213,7 @@ if (IsKeepAliveRefCountDisabled() || deleting_soon_ || fast_shutdown_started_) return; - IncrementKeepAliveRefCount(KeepAliveSource::KEEP_ALIVE_SUBFRAME_UNLOAD); + IncrementKeepAliveRefCount(); GetUIThreadTaskRunner({})->PostDelayedTask( FROM_HERE, base::BindOnce( @@ -2722,10 +2722,9 @@ return priority_.is_background(); } -void RenderProcessHostImpl::IncrementKeepAliveRefCount(KeepAliveSource source) { +void RenderProcessHostImpl::IncrementKeepAliveRefCount() { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(!is_keep_alive_ref_count_disabled_); - keep_alive_last_source_ = source; ++keep_alive_ref_count_; if (keep_alive_ref_count_ == 1) GetRendererInterface()->SetSchedulerKeepActive(true);
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h index 50aaa03..91bb3a8 100644 --- a/content/browser/renderer_host/render_process_host_impl.h +++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -241,7 +241,7 @@ override; const base::TimeTicks& GetInitTimeForNavigationMetrics() override; bool IsProcessBackgrounded() override; - void IncrementKeepAliveRefCount(KeepAliveSource source) override; + void IncrementKeepAliveRefCount() override; void DecrementKeepAliveRefCount() override; void DisableKeepAliveRefCount() override; bool IsKeepAliveRefCountDisabled() override; @@ -656,10 +656,6 @@ } size_t keep_alive_ref_count() const { return keep_alive_ref_count_; } - // TODO(wjmaclean): remove this when the experiment is done. - KeepAliveSource keep_alive_last_source() const { - return keep_alive_last_source_; - } PeerConnectionTrackerHost* GetPeerConnectionTrackerHost(); @@ -931,7 +927,6 @@ mojo::OutgoingInvitation mojo_invitation_; size_t keep_alive_ref_count_; - KeepAliveSource keep_alive_last_source_ = KeepAliveSource::KEEP_ALIVE_NONE; // Set in DisableKeepAliveRefCount(). When true, |keep_alive_ref_count_| must // no longer be modified.
diff --git a/content/browser/service_worker/service_worker_process_manager.cc b/content/browser/service_worker/service_worker_process_manager.cc index f97726d2..8b1a392 100644 --- a/content/browser/service_worker/service_worker_process_manager.cc +++ b/content/browser/service_worker/service_worker_process_manager.cc
@@ -161,8 +161,7 @@ worker_process_map_.emplace(embedded_worker_id, std::move(site_instance)); if (!rph->IsKeepAliveRefCountDisabled()) - rph->IncrementKeepAliveRefCount( - RenderProcessHost::KeepAliveSource::KEEP_ALIVE_SERVICE_WORKER); + rph->IncrementKeepAliveRefCount(); out_info->process_id = rph->GetID(); out_info->start_situation = start_situation; return blink::ServiceWorkerStatusCode::kOk;
diff --git a/content/browser/service_worker/service_worker_registry.cc b/content/browser/service_worker/service_worker_registry.cc index e026bb53..5094c2e 100644 --- a/content/browser/service_worker/service_worker_registry.cc +++ b/content/browser/service_worker/service_worker_registry.cc
@@ -1530,10 +1530,8 @@ void ServiceWorkerRegistry::DidGetRegisteredOriginsOnStartup( const std::vector<url::Origin>& origins) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - if (!special_storage_policy_) - return; - for (const auto& origin : origins) - storage_policy_observer_->StartTrackingOrigin(origin); + if (special_storage_policy_) + storage_policy_observer_->StartTrackingOrigins(origins); } void ServiceWorkerRegistry::ApplyPolicyUpdates(
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 796ac13d..149bc1c7 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -7697,8 +7697,7 @@ // termination. RenderProcessHost* subframe_process = root->child_at(0)->current_frame_host()->GetProcess(); - subframe_process->IncrementKeepAliveRefCount( - RenderProcessHost::KeepAliveSource::KEEP_ALIVE_SUBFRAME_UNLOAD); + subframe_process->IncrementKeepAliveRefCount(); // Navigate the subframe away from b.com. Since this is the last active // frame in the b.com process, this causes the RenderWidget and RenderView to
diff --git a/content/browser/worker_host/shared_worker_host.cc b/content/browser/worker_host/shared_worker_host.cc index af84723..97b4a7d 100644 --- a/content/browser/worker_host/shared_worker_host.cc +++ b/content/browser/worker_host/shared_worker_host.cc
@@ -90,8 +90,7 @@ public: explicit ScopedProcessHostRef(RenderProcessHost* render_process_host) : render_process_host_(render_process_host) { - render_process_host_->IncrementKeepAliveRefCount( - RenderProcessHost::KeepAliveSource::KEEP_ALIVE_SHARED_WORKER); + render_process_host_->IncrementKeepAliveRefCount(); } ~ScopedProcessHostRef() {
diff --git a/content/child/blink_platform_impl.cc b/content/child/blink_platform_impl.cc index 0873940..d300553a 100644 --- a/content/child/blink_platform_impl.cc +++ b/content/child/blink_platform_impl.cc
@@ -284,7 +284,9 @@ } bool BlinkPlatformImpl::IsLowEndDevice() { - return base::SysInfo::IsLowEndDevice(); + // This value is static for performance because calculating it is non-trivial. + static bool is_low_end_device = base::SysInfo::IsLowEndDevice(); + return is_low_end_device; } scoped_refptr<base::SingleThreadTaskRunner> BlinkPlatformImpl::GetIOTaskRunner()
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index 8083822..caf6c6d 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -353,6 +353,7 @@ features::kBlockCredentialedSubresources}, {"BlockHTMLParserOnStyleSheets", blink::features::kBlockHTMLParserOnStyleSheets}, + {"COLRV1Fonts", blink::features::kCOLRV1Fonts}, {"CSSColorSchemeUARendering", features::kCSSColorSchemeUARendering}, {"DeclarativeShadowDOM", blink::features::kDeclarativeShadowDOM}, {"FeaturePolicyForClientHints",
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java index bb0d387..4009c49 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -565,6 +565,10 @@ public void onAccessibilitySnapshot(AccessibilitySnapshotNode root) { viewRoot.setClassName(""); viewRoot.setHint(mProductVersion); + + Bundle extras = viewRoot.getExtras(); + extras.putCharSequence("url", mWebContents.getVisibleUrl().getSpec()); + if (root == null) { viewRoot.asyncCommit(); return;
diff --git a/content/public/android/java/src/org/chromium/content/browser/sms/SmsProviderGms.java b/content/public/android/java/src/org/chromium/content/browser/sms/SmsProviderGms.java index 239d004..7afb6e3 100644 --- a/content/public/android/java/src/org/chromium/content/browser/sms/SmsProviderGms.java +++ b/content/public/android/java/src/org/chromium/content/browser/sms/SmsProviderGms.java
@@ -4,6 +4,9 @@ package org.chromium.content.browser.sms; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GoogleApiAvailability; + import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.annotations.CalledByNative; @@ -27,6 +30,7 @@ @JNIAdditionalImport(Wrappers.class) public class SmsProviderGms { private static final String TAG = "SmsProviderGms"; + private static final int MIN_GMS_VERSION_NUMBER_WITH_CODE_BROWSER_BACKEND = 202990000; private final long mSmsProviderGmsAndroid; private final @GmsBackend int mBackend; @@ -41,11 +45,14 @@ mSmsProviderGmsAndroid = smsProviderGmsAndroid; mBackend = backend; - mContext = new Wrappers.WebOTPServiceContext(ContextUtils.getApplicationContext()); + mContext = new Wrappers.WebOTPServiceContext(ContextUtils.getApplicationContext(), this); - // For AUTO, create both receivers since we may need to fallback to using the user consent - // backend when verification backend is not available. - if (mBackend == GmsBackend.AUTO || mBackend == GmsBackend.VERIFICATION) { + boolean isVerificationBackendAvailable = + GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable( + mContext, MIN_GMS_VERSION_NUMBER_WITH_CODE_BROWSER_BACKEND) + == ConnectionResult.SUCCESS; + if (isVerificationBackendAvailable + && (mBackend == GmsBackend.AUTO || mBackend == GmsBackend.VERIFICATION)) { mVerificationReceiver = new SmsVerificationReceiver(this, mContext); } @@ -53,7 +60,6 @@ mUserConsentReceiver = new SmsUserConsentReceiver(this, mContext); } - assert (mVerificationReceiver != null || mUserConsentReceiver != null); Log.i(TAG, "construction successfull %s, %s", mVerificationReceiver, mUserConsentReceiver); } @@ -73,15 +79,25 @@ @CalledByNative private void listen(WindowAndroid window) { mWindow = window; - switch (mBackend) { - case GmsBackend.AUTO: - case GmsBackend.VERIFICATION: - mVerificationReceiver.listen(window); - break; - case GmsBackend.USER_CONSENT: - mUserConsentReceiver.listen(window); - break; - } + + // Using the verification receiver is preferable but also start user consent receiver in + // case the verification receiver fails. i.e. if the start of the verification retriever has + // not been successful and the SMS arrives, we fall back to the user consent receiver to + // handle it. Note that starting both receiver means that we may end up using the user + // consent receiver even when the preferred verification backend is available but slow. But + // this is acceptable given that handling SMS should be done in timely manner. + if (mVerificationReceiver != null) mVerificationReceiver.listen(window); + if (mUserConsentReceiver != null) mUserConsentReceiver.listen(window); + } + + public void destoryUserConsentReceiver() { + Log.d(TAG, "DestroyUserConsentReceiver"); + if (mUserConsentReceiver != null) mUserConsentReceiver.destroy(); + } + + public void destoryVerificationReceiver() { + Log.d(TAG, "DestroyVerificationReceiver"); + if (mVerificationReceiver != null) mVerificationReceiver.destroy(); } void onMethodNotAvailable() { @@ -94,13 +110,7 @@ // verification method first on *each request* and fallback to the user consent method if it // fails. The initial call to verification is expected to be cheap so this should not have // any noticeable impact. - - if (mBackend == GmsBackend.AUTO) { - Log.d(TAG, "Retry using user consent API."); - mUserConsentReceiver.listen(mWindow); - } else { - onNotAvailable(); - } + if (mBackend == GmsBackend.VERIFICATION) onNotAvailable(); } // --------- Callbacks for receivers
diff --git a/content/public/android/java/src/org/chromium/content/browser/sms/SmsUserConsentReceiver.java b/content/public/android/java/src/org/chromium/content/browser/sms/SmsUserConsentReceiver.java index 5a58d33..bd450da8 100644 --- a/content/public/android/java/src/org/chromium/content/browser/sms/SmsUserConsentReceiver.java +++ b/content/public/android/java/src/org/chromium/content/browser/sms/SmsUserConsentReceiver.java
@@ -53,6 +53,7 @@ } public void destroy() { + if (mDestroyed) return; if (DEBUG) Log.d(TAG, "Destroying SmsUserConsentReceiver."); mDestroyed = true; mContext.unregisterReceiver(this);
diff --git a/content/public/android/java/src/org/chromium/content/browser/sms/SmsVerificationReceiver.java b/content/public/android/java/src/org/chromium/content/browser/sms/SmsVerificationReceiver.java index dbdf96e..65de58b 100644 --- a/content/public/android/java/src/org/chromium/content/browser/sms/SmsVerificationReceiver.java +++ b/content/public/android/java/src/org/chromium/content/browser/sms/SmsVerificationReceiver.java
@@ -73,6 +73,7 @@ } public void destroy() { + if (mDestroyed) return; if (DEBUG) Log.d(TAG, "Destroying SmsVerificationReceiver."); mDestroyed = true; mContext.unregisterReceiver(this); @@ -182,9 +183,14 @@ Wrappers.SmsRetrieverClientWrapper client = mProvider.getClient(); Task<Void> task = client.startSmsCodeBrowserRetriever(); - task.addOnSuccessListener( - unused -> { this.reportBackendAvailability(BackendAvailability.AVAILABLE); }); - task.addOnFailureListener((Exception e) -> { this.onRetrieverTaskFailure(window, e); }); + task.addOnSuccessListener(unused -> { + this.reportBackendAvailability(BackendAvailability.AVAILABLE); + mProvider.destoryUserConsentReceiver(); + }); + task.addOnFailureListener((Exception e) -> { + this.onRetrieverTaskFailure(window, e); + mProvider.destoryVerificationReceiver(); + }); if (DEBUG) Log.d(TAG, "Installed task"); }
diff --git a/content/public/android/java/src/org/chromium/content/browser/sms/Wrappers.java b/content/public/android/java/src/org/chromium/content/browser/sms/Wrappers.java index 050dcc097..446d207d 100644 --- a/content/public/android/java/src/org/chromium/content/browser/sms/Wrappers.java +++ b/content/public/android/java/src/org/chromium/content/browser/sms/Wrappers.java
@@ -59,9 +59,11 @@ static class WebOTPServiceContext extends ContextWrapper { private BroadcastReceiver mVerificationReceiver; private BroadcastReceiver mUserConsentReceiver; + private final SmsProviderGms mSmsProviderGms; - public WebOTPServiceContext(Context context) { + public WebOTPServiceContext(Context context, SmsProviderGms provider) { super(context); + mSmsProviderGms = provider; } public SmsVerificationReceiver getRegisteredVerificationReceiver() { @@ -72,6 +74,10 @@ return (SmsUserConsentReceiver) mUserConsentReceiver; } + public SmsVerificationReceiver createVerificationReceiverForTesting() { + return new SmsVerificationReceiver(mSmsProviderGms, this); + } + // --------------------------------------------------------------------- // Context overrides:
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AssistViewStructureTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AssistViewStructureTest.java index b94d1f3..e263e40 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AssistViewStructureTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AssistViewStructureTest.java
@@ -6,6 +6,7 @@ import android.annotation.TargetApi; import android.os.Build; +import android.os.Bundle; import androidx.test.filters.MediumTest; @@ -101,4 +102,27 @@ + " android.widget.TextView text='3. '\n" + " android.widget.TextView text='Janeway'\n"); } + + /** + * Test that the snapshot contains the url. + */ + @Test + @MediumTest + @MinAndroidSdkLevel(Build.VERSION_CODES.M) + @TargetApi(Build.VERSION_CODES.M) + @DisableIf.Build(sdk_is_less_than = Build.VERSION_CODES.M) + public void testUrl() throws Throwable { + TestViewStructureInterface root = getViewStructureFromHtml("<p>Hello World</p>"); + Assert.assertEquals(1, root.getChildCount()); + TestViewStructureInterface webview = root.getChild(0); + Assert.assertNotNull(webview); + + Bundle extras = webview.getExtras(); + String url = extras.getCharSequence("url").toString(); + Assert.assertTrue(url.contains("data:")); + Assert.assertFalse(url.contains("http:")); + Assert.assertTrue(url.contains("text/html")); + Assert.assertTrue(url.contains("Hello")); + Assert.assertTrue(url.contains("World")); + } }
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/TestViewStructure.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/TestViewStructure.java index 6762614a..8ba2655 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/TestViewStructure.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/TestViewStructure.java
@@ -60,6 +60,7 @@ builder.append(mText); builder.append("'"); } + builder.append("\n"); for (TestViewStructure child : mChildren) { @@ -143,7 +144,8 @@ return viewStructure; } - public TestViewStructure getChild(int index) { + @Override + public TestViewStructureInterface getChild(int index) { return mChildren.get(index); }
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/TestViewStructureInterface.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/TestViewStructureInterface.java index ba95019..19e79ea3 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/TestViewStructureInterface.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/TestViewStructureInterface.java
@@ -4,6 +4,8 @@ package org.chromium.content.browser.accessibility; +import android.os.Bundle; + /** * Interface for an implementation of ViewStructure that allows us * to print it out as a string and assert that the data in the @@ -20,4 +22,19 @@ * asyncNewChild has been balanced by a call to asyncCommit. */ public boolean isDone(); + + /** + * Get the extras bundle for this ViewStructure node. + */ + public Bundle getExtras(); + + /** + * Get the number of children. + */ + public int getChildCount(); + + /** + * Get a child by index. + */ + public TestViewStructureInterface getChild(int childIndex); }
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/sms/SmsProviderFakes.java b/content/public/android/javatests/src/org/chromium/content/browser/sms/SmsProviderFakes.java index 4181ac9..57485c38 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/sms/SmsProviderFakes.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/sms/SmsProviderFakes.java
@@ -54,7 +54,7 @@ Wrappers.WebOTPServiceContext context = super.getContext(); assert context != null; - BroadcastReceiver receiver = context.getRegisteredVerificationReceiver(); + BroadcastReceiver receiver = context.createVerificationReceiverForTesting(); receiver.onReceive(context, intent); } @@ -89,7 +89,7 @@ SmsCodeRetriever.EXTRA_STATUS, new Status(CommonStatusCodes.TIMEOUT)); intent.putExtras(bundle); - BroadcastReceiver receiver = context.getRegisteredVerificationReceiver(); + BroadcastReceiver receiver = context.createVerificationReceiverForTesting(); receiver.onReceive(context, intent); } @@ -112,7 +112,7 @@ Wrappers.WebOTPServiceContext context = super.getContext(); assert context != null; - SmsVerificationReceiver receiver = context.getRegisteredVerificationReceiver(); + SmsVerificationReceiver receiver = context.createVerificationReceiverForTesting(); receiver.onPermissionDone(window, Activity.RESULT_CANCELED); } @@ -127,7 +127,7 @@ } SmsVerificationReceiver receiver = - (SmsVerificationReceiver) context.getRegisteredVerificationReceiver(); + (SmsVerificationReceiver) context.createVerificationReceiverForTesting(); receiver.onPermissionDone(window, Activity.RESULT_OK); } @@ -136,7 +136,7 @@ Wrappers.WebOTPServiceContext context = super.getContext(); assert context != null; - SmsVerificationReceiver receiver = context.getRegisteredVerificationReceiver(); + SmsVerificationReceiver receiver = context.createVerificationReceiverForTesting(); Log.i(TAG, "receiver %s", receiver); int code;
diff --git a/content/public/browser/browser_context.h b/content/public/browser/browser_context.h index 9b03c09..c4adba4 100644 --- a/content/public/browser/browser_context.h +++ b/content/public/browser/browser_context.h
@@ -312,7 +312,16 @@ virtual BrowsingDataRemoverDelegate* GetBrowsingDataRemoverDelegate() = 0; // Sets CORS origin access lists. + enum class TargetBrowserContexts { + // Only modify |this| BrowserContext. + kSingleContext, + + // Modify |this| BrowserContext and all related regular/OffTheRecord + // BrowserContexts. + kAllRelatedContexts, + }; virtual void SetCorsOriginAccessListForOrigin( + TargetBrowserContexts target_mode, const url::Origin& source_origin, std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
diff --git a/content/public/browser/cors_origin_pattern_setter.cc b/content/public/browser/cors_origin_pattern_setter.cc index 27b4798f..90560f6e 100644 --- a/content/public/browser/cors_origin_pattern_setter.cc +++ b/content/public/browser/cors_origin_pattern_setter.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "content/public/browser/cors_origin_pattern_setter.h" +#include "content/public/browser/browser_context.h" #include "content/public/browser/storage_partition.h" #include "services/network/public/mojom/network_context.mojom.h" @@ -22,6 +23,13 @@ std::move(closure_).Run(); } +void CorsOriginPatternSetter::ApplyToEachStoragePartition( + BrowserContext* browser_context) { + BrowserContext::ForEachStoragePartition( + browser_context, base::BindRepeating(&CorsOriginPatternSetter::SetLists, + base::RetainedRef(this))); +} + void CorsOriginPatternSetter::SetLists(StoragePartition* partition) { partition->GetNetworkContext()->SetCorsOriginAccessListsForOrigin( source_origin_, ClonePatterns(allow_patterns_),
diff --git a/content/public/browser/cors_origin_pattern_setter.h b/content/public/browser/cors_origin_pattern_setter.h index da2b156f..6b33bcab 100644 --- a/content/public/browser/cors_origin_pattern_setter.h +++ b/content/public/browser/cors_origin_pattern_setter.h
@@ -16,6 +16,7 @@ namespace content { +class BrowserContext; class StoragePartition; // A class used to make an asynchronous Mojo call with cloned patterns for each @@ -35,7 +36,7 @@ std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, base::OnceClosure closure); - void SetLists(StoragePartition* partition); + void ApplyToEachStoragePartition(BrowserContext* browser_context); static std::vector<network::mojom::CorsOriginPatternPtr> ClonePatterns( const std::vector<network::mojom::CorsOriginPatternPtr>& patterns); @@ -43,6 +44,7 @@ private: friend class base::RefCounted<CorsOriginPatternSetter>; + void SetLists(StoragePartition* partition); ~CorsOriginPatternSetter(); const url::Origin source_origin_;
diff --git a/content/public/browser/render_process_host.h b/content/public/browser/render_process_host.h index 7b2bd0e..23d8cb97e 100644 --- a/content/public/browser/render_process_host.h +++ b/content/public/browser/render_process_host.h
@@ -121,15 +121,6 @@ GENERATE_CRASH_DUMP, }; - // Temporary enum to track source of KeepAlive increments. - enum class KeepAliveSource { - KEEP_ALIVE_NONE, - KEEP_ALIVE_HANDLE_FACTORY, - KEEP_ALIVE_SUBFRAME_UNLOAD, - KEEP_ALIVE_SERVICE_WORKER, - KEEP_ALIVE_SHARED_WORKER - }; - // General functions --------------------------------------------------------- ~RenderProcessHost() override {} @@ -406,7 +397,7 @@ // Keeps the process alive briefly to give subframe unload handlers a // chance to execute after their parent frame navigates or is detached. // See https://crbug.com/852204. - virtual void IncrementKeepAliveRefCount(KeepAliveSource source) = 0; + virtual void IncrementKeepAliveRefCount() = 0; virtual void DecrementKeepAliveRefCount() = 0; // Sets keep alive ref counts to zero. Called when the browser context will be
diff --git a/content/public/test/mock_render_process_host.cc b/content/public/test/mock_render_process_host.cc index 9a68585..a5df1e9f 100644 --- a/content/public/test/mock_render_process_host.cc +++ b/content/public/test/mock_render_process_host.cc
@@ -364,7 +364,7 @@ return keep_alive_ref_count_; } -void MockRenderProcessHost::IncrementKeepAliveRefCount(KeepAliveSource source) { +void MockRenderProcessHost::IncrementKeepAliveRefCount() { ++keep_alive_ref_count_; }
diff --git a/content/public/test/mock_render_process_host.h b/content/public/test/mock_render_process_host.h index cfb22ecd..d1dc8a0e 100644 --- a/content/public/test/mock_render_process_host.h +++ b/content/public/test/mock_render_process_host.h
@@ -145,7 +145,7 @@ const base::TimeTicks& GetInitTimeForNavigationMetrics() override; bool IsProcessBackgrounded() override; size_t GetKeepAliveRefCount() const; - void IncrementKeepAliveRefCount(KeepAliveSource source) override; + void IncrementKeepAliveRefCount() override; void DecrementKeepAliveRefCount() override; void DisableKeepAliveRefCount() override; bool IsKeepAliveRefCountDisabled() override;
diff --git a/content/renderer/accessibility/blink_ax_tree_source.cc b/content/renderer/accessibility/blink_ax_tree_source.cc index 365ae882..66b574b 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.cc +++ b/content/renderer/accessibility/blink_ax_tree_source.cc
@@ -147,48 +147,6 @@ return SearchForExactlyOneInnerImage(obj, inner_image, /* max_depth = */ 3); } -std::string GetEquivalentAriaRoleString(const ax::mojom::Role role) { - switch (role) { - case ax::mojom::Role::kArticle: - return "article"; - case ax::mojom::Role::kBanner: - return "banner"; - case ax::mojom::Role::kButton: - return "button"; - case ax::mojom::Role::kComplementary: - return "complementary"; - case ax::mojom::Role::kFigure: - return "figure"; - case ax::mojom::Role::kFooter: - return "contentinfo"; - case ax::mojom::Role::kHeader: - return "banner"; - case ax::mojom::Role::kHeading: - return "heading"; - case ax::mojom::Role::kImage: - return "img"; - case ax::mojom::Role::kMain: - return "main"; - case ax::mojom::Role::kNavigation: - return "navigation"; - case ax::mojom::Role::kRadioButton: - return "radio"; - case ax::mojom::Role::kRegion: - return "region"; - case ax::mojom::Role::kSection: - // A <section> element uses the 'region' ARIA role mapping. - return "region"; - case ax::mojom::Role::kSlider: - return "slider"; - case ax::mojom::Role::kTime: - return "time"; - default: - break; - } - - return std::string(); -} - } // namespace ScopedFreezeBlinkAXTreeSource::ScopedFreezeBlinkAXTreeSource( @@ -502,9 +460,6 @@ // unneeded WebAXObject interfaces. src.Serialize(dst, accessibility_mode_); - dst->role = src.Role(); - dst->id = src.AxID(); - TRACE_EVENT2("accessibility", "BlinkAXTreeSource::SerializeNode", "role", ui::ToString(dst->role), "id", dst->id); @@ -532,11 +487,6 @@ WebElement element = node.To<WebElement>(); is_iframe = element.HasHTMLTagName("iframe"); - SerializeElementAttributes(src, element, dst); - if (accessibility_mode_.has_mode(ui::AXMode::kHTML)) { - SerializeHTMLAttributes(src, element, dst); - } - // Presence of other ARIA attributes. if (src.HasAriaAttribute()) dst->AddBoolAttribute(ax::mojom::BoolAttribute::kHasAriaAttribute, true); @@ -846,52 +796,6 @@ } } -void BlinkAXTreeSource::SerializeElementAttributes(WebAXObject src, - WebElement element, - ui::AXNodeData* dst) const { - if (element.HasAttribute("class")) { - TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kClassName, - element.GetAttribute("class").Utf8()); - } - - // ARIA role. - if (element.HasAttribute("role")) { - TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kRole, - element.GetAttribute("role").Utf8()); - } else { - std::string role = GetEquivalentAriaRoleString(dst->role); - if (!role.empty()) - TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kRole, - role); - } -} - -void BlinkAXTreeSource::SerializeHTMLAttributes(WebAXObject src, - WebElement element, - ui::AXNodeData* dst) const { - // TODO(ctguil): The tagName in WebKit is lower cased but - // HTMLElement::nodeName calls localNameUpper. Consider adding - // a WebElement method that returns the original lower cased tagName. - TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kHtmlTag, - base::ToLowerASCII(element.TagName().Utf8())); - for (unsigned i = 0; i < element.AttributeCount(); ++i) { - std::string name = base::ToLowerASCII(element.AttributeLocalName(i).Utf8()); - if (name != "class") { // class already in kClassName. - std::string value = element.AttributeValue(i).Utf8(); - dst->html_attributes.push_back(std::make_pair(name, value)); - } - } - -// TODO(nektar): Turn off kHTMLAccessibilityMode for automation and Mac -// and remove ifdef. -#if defined(OS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) - if (dst->role == ax::mojom::Role::kMath && element.InnerHTML().length()) { - TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kInnerHtml, - element.InnerHTML().Utf8()); - } -#endif -} - blink::WebDocument BlinkAXTreeSource::GetMainDocument() const { CHECK(frozen_); return document_;
diff --git a/content/renderer/accessibility/blink_ax_tree_source.h b/content/renderer/accessibility/blink_ax_tree_source.h index bba80c1..e24b624 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.h +++ b/content/renderer/accessibility/blink_ax_tree_source.h
@@ -148,13 +148,6 @@ ui::AXNodeData* dst) const; void SerializeOtherScreenReaderAttributes(blink::WebAXObject src, ui::AXNodeData* dst) const; - void SerializeElementAttributes(blink::WebAXObject src, - blink::WebElement element, - ui::AXNodeData* dst) const; - void SerializeHTMLAttributes(blink::WebAXObject src, - blink::WebElement element, - ui::AXNodeData* dst) const; - blink::WebAXObject ComputeRoot() const; // Max length for attributes such as aria-label.
diff --git a/content/test/data/accessibility/aria/aria-combobox-uneditable-expected-android.txt b/content/test/data/accessibility/aria/aria-combobox-uneditable-expected-android.txt index 6617cab78..b07979f 100644 --- a/content/test/data/accessibility/aria/aria-combobox-uneditable-expected-android.txt +++ b/content/test/data/accessibility/aria/aria-combobox-uneditable-expected-android.txt
@@ -1,6 +1,6 @@ android.webkit.WebView focusable focused scrollable ++android.view.View name='Choose a fruit, with text content' -++android.widget.Spinner clickable focusable name='Choose a fruit, with text content' +++android.widget.Spinner clickable collapsed focusable name='Choose a fruit, with text content' ++android.widget.ListView role_description='list box' clickable collection state_description='3 items' item_count=3 row_count=3 ++++android.view.View clickable collection_item focusable selected name='Apple' state_description='in list, item 1 of 3' ++++android.view.View clickable collection_item focusable name='Banana' state_description='in list, item 2 of 3' item_index=1 row_index=1
diff --git a/content/test/data/accessibility/aria/aria-expanded-expected-android.txt b/content/test/data/accessibility/aria/aria-expanded-expected-android.txt index 3031564..c4a9495b 100644 --- a/content/test/data/accessibility/aria/aria-expanded-expected-android.txt +++ b/content/test/data/accessibility/aria/aria-expanded-expected-android.txt
@@ -1,9 +1,9 @@ android.webkit.WebView focusable focused scrollable ++android.view.View role_description='menu' -++++android.view.MenuItem role_description='menu item' clickable name='New' -++++android.view.MenuItem role_description='menu item' clickable name='Open' item_index=1 row_index=1 -++++android.view.MenuItem role_description='menu item' clickable name='Save' item_index=2 row_index=2 -++++android.view.MenuItem role_description='menu item' clickable name='Quit' item_index=3 row_index=3 +++++android.view.MenuItem role_description='menu item' clickable collapsed name='New' +++++android.view.MenuItem role_description='menu item' clickable expanded name='Open' item_index=1 row_index=1 +++++android.view.MenuItem role_description='menu item' clickable collapsed name='Save' item_index=2 row_index=2 +++++android.view.MenuItem role_description='menu item' clickable expanded name='Quit' item_index=3 row_index=3 ++android.view.View role_description='splitter' ++android.view.View role_description='splitter' -++android.view.View role_description='splitter' +++android.view.View role_description='splitter' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/accordion-expected-android.txt b/content/test/data/accessibility/html/accordion-expected-android.txt new file mode 100644 index 0000000..849ff781 --- /dev/null +++ b/content/test/data/accessibility/html/accordion-expected-android.txt
@@ -0,0 +1,13 @@ +android.webkit.WebView focusable focused scrollable +++android.view.View role_description='heading 3' heading name='Accordion Section #1' +++++android.widget.Button role_description='button' clickable expanded focusable heading name='Accordion Section #1' action_collapse +++android.view.View name='Accordion Section #1' +++++android.view.View name='Content for first section of accordion element.' +++android.view.View role_description='heading 3' heading name='Accordion Section #2' +++++android.widget.Button role_description='button' clickable collapsed focusable heading name='Accordion Section #2' action_expand +++android.view.View role_description='heading 3' heading name='Accordion Section #3' +++++android.widget.Button role_description='button' clickable collapsed focusable heading name='Accordion Section #3' action_expand +++android.view.View role_description='heading 3' heading name='Accordion Section #4' +++++android.widget.Button role_description='button' clickable disabled expanded focusable heading name='Accordion Section #4' action_collapse +++android.view.View name='Accordion Section #4' +++++android.view.View name='Content for forth section of accordion element. This section will always be visible but disabled.' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/accordion-expected-auralinux.txt b/content/test/data/accessibility/html/accordion-expected-auralinux.txt new file mode 100644 index 0000000..a5f4d25 --- /dev/null +++ b/content/test/data/accessibility/html/accordion-expected-auralinux.txt
@@ -0,0 +1,23 @@ +[document web] +++[heading] name='Accordion Section #1' +++++[push button] name='Accordion Section #1' expanded controller-for label-for +++++++[paragraph] +++++++++[static] name='Accordion Section #1' +++[section] name='Accordion Section #1' controlled-by labelled-by +++++[paragraph] +++++++[static] name='Content for first section of accordion element.' +++[heading] name='Accordion Section #2' +++++[push button] name='Accordion Section #2' +++++++[paragraph] +++++++++[static] name='Accordion Section #2' +++[heading] name='Accordion Section #3' +++++[push button] name='Accordion Section #3' +++++++[paragraph] +++++++++[static] name='Accordion Section #3' +++[heading] name='Accordion Section #4' +++++[push button] name='Accordion Section #4' expanded label-for +++++++[paragraph] +++++++++[static] name='Accordion Section #4' +++[section] name='Accordion Section #4' labelled-by +++++[paragraph] +++++++[static] name='Content for forth section of accordion element. This section will always be visible but disabled.' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/accordion-expected-blink.txt b/content/test/data/accessibility/html/accordion-expected-blink.txt new file mode 100644 index 0000000..0f838c1 --- /dev/null +++ b/content/test/data/accessibility/html/accordion-expected-blink.txt
@@ -0,0 +1,33 @@ +rootWebArea +++genericContainer ignored +++++genericContainer ignored +++++++heading name='Accordion Section #1' +++++++++button expanded name='Accordion Section #1' controlsIds=genericContainer +++++++++++paragraph +++++++++++++staticText name='Accordion Section #1' +++++++++++++++inlineTextBox name='Accordion Section #1' +++++++genericContainer name='Accordion Section #1' +++++++++paragraph +++++++++++staticText name='Content for first section of accordion element.' +++++++++++++inlineTextBox name='Content for first section of accordion element.' +++++++heading name='Accordion Section #2' +++++++++button collapsed name='Accordion Section #2' controlsIds= +++++++++++paragraph +++++++++++++staticText name='Accordion Section #2' +++++++++++++++inlineTextBox name='Accordion Section #2' +++++++genericContainer ignored invisible +++++++heading name='Accordion Section #3' +++++++++button collapsed name='Accordion Section #3' controlsIds= +++++++++++paragraph +++++++++++++staticText name='Accordion Section #3' +++++++++++++++inlineTextBox name='Accordion Section #3' +++++++genericContainer ignored invisible +++++++heading name='Accordion Section #4' +++++++++button expanded name='Accordion Section #4' restriction=disabled +++++++++++paragraph +++++++++++++staticText name='Accordion Section #4' +++++++++++++++inlineTextBox name='Accordion Section #4' +++++++genericContainer name='Accordion Section #4' +++++++++paragraph +++++++++++staticText name='Content for forth section of accordion element. This section will always be visible but disabled.' +++++++++++++inlineTextBox name='Content for forth section of accordion element. This section will always be visible but disabled.' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/accordion-expected-mac.txt b/content/test/data/accessibility/html/accordion-expected-mac.txt new file mode 100644 index 0000000..ecada9c --- /dev/null +++ b/content/test/data/accessibility/html/accordion-expected-mac.txt
@@ -0,0 +1,23 @@ +AXWebArea +++AXHeading AXTitle='Accordion Section #1' AXValue=3 +++++AXButton AXExpanded=1 AXTitle='Accordion Section #1' +++++++AXGroup +++++++++AXStaticText AXValue='Accordion Section #1' +++AXGroup AXDescription='Accordion Section #1' +++++AXGroup +++++++AXStaticText AXValue='Content for first section of accordion element.' +++AXHeading AXTitle='Accordion Section #2' AXValue=3 +++++AXButton AXExpanded=0 AXTitle='Accordion Section #2' +++++++AXGroup +++++++++AXStaticText AXValue='Accordion Section #2' +++AXHeading AXTitle='Accordion Section #3' AXValue=3 +++++AXButton AXExpanded=0 AXTitle='Accordion Section #3' +++++++AXGroup +++++++++AXStaticText AXValue='Accordion Section #3' +++AXHeading AXTitle='Accordion Section #4' AXValue=3 +++++AXButton AXExpanded=1 AXTitle='Accordion Section #4' +++++++AXGroup +++++++++AXStaticText AXValue='Accordion Section #4' +++AXGroup AXDescription='Accordion Section #4' +++++AXGroup +++++++AXStaticText AXValue='Content for forth section of accordion element. This section will always be visible but disabled.' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/accordion-expected-uia-win.txt b/content/test/data/accessibility/html/accordion-expected-uia-win.txt new file mode 100644 index 0000000..8e8d381 --- /dev/null +++ b/content/test/data/accessibility/html/accordion-expected-uia-win.txt
@@ -0,0 +1,23 @@ +Document +++Text Name='Accordion Section #1' +++++Button Name='Accordion Section #1' ExpandCollapse.ExpandCollapseState='Expanded' +++++++Group IsControlElement=false +++++++++Text Name='Accordion Section #1' IsControlElement=false +++Group Name='Accordion Section #1' +++++Group IsControlElement=false +++++++Text Name='Content for first section of accordion element.' +++Text Name='Accordion Section #2' +++++Button Name='Accordion Section #2' ExpandCollapse.ExpandCollapseState='Collapsed' +++++++Group IsControlElement=false +++++++++Text Name='Accordion Section #2' IsControlElement=false +++Text Name='Accordion Section #3' +++++Button Name='Accordion Section #3' ExpandCollapse.ExpandCollapseState='Collapsed' +++++++Group IsControlElement=false +++++++++Text Name='Accordion Section #3' IsControlElement=false +++Text Name='Accordion Section #4' +++++Button Name='Accordion Section #4' IsEnabled=false ExpandCollapse.ExpandCollapseState='Expanded' +++++++Group IsControlElement=false +++++++++Text Name='Accordion Section #4' IsControlElement=false +++Group Name='Accordion Section #4' +++++Group IsControlElement=false +++++++Text Name='Content for forth section of accordion element. This section will always be visible but disabled.' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/accordion-expected-win.txt b/content/test/data/accessibility/html/accordion-expected-win.txt new file mode 100644 index 0000000..6ed6328b --- /dev/null +++ b/content/test/data/accessibility/html/accordion-expected-win.txt
@@ -0,0 +1,23 @@ +ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE +++IA2_ROLE_HEADING name='Accordion Section #1' +++++ROLE_SYSTEM_PUSHBUTTON name='Accordion Section #1' EXPANDED FOCUSABLE +++++++IA2_ROLE_PARAGRAPH +++++++++ROLE_SYSTEM_STATICTEXT name='Accordion Section #1' +++IA2_ROLE_SECTION name='Accordion Section #1' +++++IA2_ROLE_PARAGRAPH +++++++ROLE_SYSTEM_STATICTEXT name='Content for first section of accordion element.' +++IA2_ROLE_HEADING name='Accordion Section #2' +++++ROLE_SYSTEM_PUSHBUTTON name='Accordion Section #2' COLLAPSED FOCUSABLE +++++++IA2_ROLE_PARAGRAPH +++++++++ROLE_SYSTEM_STATICTEXT name='Accordion Section #2' +++IA2_ROLE_HEADING name='Accordion Section #3' +++++ROLE_SYSTEM_PUSHBUTTON name='Accordion Section #3' COLLAPSED FOCUSABLE +++++++IA2_ROLE_PARAGRAPH +++++++++ROLE_SYSTEM_STATICTEXT name='Accordion Section #3' +++IA2_ROLE_HEADING name='Accordion Section #4' +++++ROLE_SYSTEM_PUSHBUTTON name='Accordion Section #4' UNAVAILABLE EXPANDED FOCUSABLE +++++++IA2_ROLE_PARAGRAPH +++++++++ROLE_SYSTEM_STATICTEXT name='Accordion Section #4' +++IA2_ROLE_SECTION name='Accordion Section #4' +++++IA2_ROLE_PARAGRAPH +++++++ROLE_SYSTEM_STATICTEXT name='Content for forth section of accordion element. This section will always be visible but disabled.' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/accordion.html b/content/test/data/accessibility/html/accordion.html new file mode 100644 index 0000000..45b9e54 --- /dev/null +++ b/content/test/data/accessibility/html/accordion.html
@@ -0,0 +1,55 @@ +<!-- +@ANDROID-ALLOW:expand* +@ANDROID-ALLOW:collapse* +@ANDROID-ALLOW:action_* +@AURALINUX-ALLOW:expanded* +@AURALINUX-ALLOW:collapsed* +@WIN-ALLOW:EXPANDED* +@WIN-ALLOW:COLLAPSED* +@BLINK-ALLOW:collapsed* +@BLINK-ALLOW:expanded* +@MAC-ALLOW:AXExpanded +--> +<html> +<body> + <!--Section #1--> + <h3> + <button id="header1control" aria-controls="section1" aria-expanded="true"> + <p>Accordion Section #1</p> + </button> + </h3> + <div id="section1" aria-labelledby="header1control"> + <p>Content for first section of accordion element.</p> + </div> + + <!--Section #2--> + <h3> + <button id="header2control" aria-controls="section2" aria-expanded="false"> + <p>Accordion Section #2</p> + </button> + </h3> + <div id="section2" aria-labelledby="header2control" hidden> + <p>Content for second section of accordion element.</p> + </div> + + <!--Section #3--> + <h3> + <button id="header3control" aria-controls="section3" aria-expanded="false"> + <p>Accordion Section #3</p> + </button> + </h3> + <div id="section3" aria-labelledby="header3control" hidden> + <p>Content for third section of accordion element.</p> + </div> + + <!--Section #4--> + <h3> + <button id="header4control" aria-controls="section4" aria-expanded="true" aria-disabled="true"> + <p>Accordion Section #4</p> + </button> + </h3> + <div id="section3" aria-labelledby="header4control"> + <p>Content for forth section of accordion element. This section will always be visible but disabled.</p> + </div> +</body> +</html>
diff --git a/content/test/data/accessibility/html/combobox-optgroup-expected-android.txt b/content/test/data/accessibility/html/combobox-optgroup-expected-android.txt index 107812e..4c69deb 100644 --- a/content/test/data/accessibility/html/combobox-optgroup-expected-android.txt +++ b/content/test/data/accessibility/html/combobox-optgroup-expected-android.txt
@@ -1,3 +1,3 @@ android.webkit.WebView focusable focused scrollable ++android.view.View -++++android.view.View role_description='menu pop up button' clickable focusable name='Mercedes Label' \ No newline at end of file +++++android.view.View role_description='menu pop up button' clickable collapsed focusable name='Mercedes Label' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/details-expected-android.txt b/content/test/data/accessibility/html/details-expected-android.txt index 2b60ec86..cb218e1 100644 --- a/content/test/data/accessibility/html/details-expected-android.txt +++ b/content/test/data/accessibility/html/details-expected-android.txt
@@ -1,6 +1,6 @@ android.webkit.WebView focusable focused scrollable ++android.view.View -++++android.view.View role_description='disclosure triangle' clickable focusable name='details tag' +++++android.view.View role_description='disclosure triangle' clickable collapsed focusable name='details tag' ++android.view.View -++++android.view.View role_description='disclosure triangle' clickable focusable name='details tag open' +++++android.view.View role_description='disclosure triangle' clickable expanded focusable name='details tag open' ++++android.view.View name='The details tag with open specifies that the details should be visible (open) to the user.' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-list-expected-blink.txt b/content/test/data/accessibility/html/input-list-expected-blink.txt index 24e8a99a..af5531ff 100644 --- a/content/test/data/accessibility/html/input-list-expected-blink.txt +++ b/content/test/data/accessibility/html/input-list-expected-blink.txt
@@ -5,5 +5,5 @@ ++++++++staticText name='Choose a pokemon ' ++++++++++inlineTextBox name='Choose a pokemon ' ++++++++textFieldWithComboBox editable focusable autoComplete='list' name='Choose a pokemon' haspopup=listbox -++++++++++genericContainer +++++++++++genericContainer editable ++++++genericContainer ignored invisible
diff --git a/content/test/data/accessibility/html/input-number-expected-blink.txt b/content/test/data/accessibility/html/input-number-expected-blink.txt index d795fca..5e80b1ca 100644 --- a/content/test/data/accessibility/html/input-number-expected-blink.txt +++ b/content/test/data/accessibility/html/input-number-expected-blink.txt
@@ -3,11 +3,9 @@ ++++genericContainer ++++++spinButton inputType='number' value='1' valueForRange=1.00 ++++++++genericContainer -++++++++++genericContainer -++++++++++++staticText name='1' -++++++++++++++inlineTextBox name='1' +++++++++++staticText name='1' +++++++++++++inlineTextBox name='1' ++++++spinButton inputType='number' value='6' valueForRange=6.00 minValueForRange=5.00 maxValueForRange=10.00 ++++++++genericContainer -++++++++++genericContainer -++++++++++++staticText name='6' -++++++++++++++inlineTextBox name='6' +++++++++++staticText name='6' +++++++++++++inlineTextBox name='6'
diff --git a/content/test/data/accessibility/html/input-search-expected-blink.txt b/content/test/data/accessibility/html/input-search-expected-blink.txt index 95a07ca..6756c6e 100644 --- a/content/test/data/accessibility/html/input-search-expected-blink.txt +++ b/content/test/data/accessibility/html/input-search-expected-blink.txt
@@ -3,6 +3,5 @@ ++++genericContainer ++++++searchBox value='Search terms' ++++++++genericContainer -++++++++++genericContainer -++++++++++++staticText name='Search terms' -++++++++++++++inlineTextBox name='Search terms' +++++++++++staticText name='Search terms' +++++++++++++inlineTextBox name='Search terms'
diff --git a/content/test/data/accessibility/html/modal-dialog-closed-expected-android.txt b/content/test/data/accessibility/html/modal-dialog-closed-expected-android.txt index 9332feb..2c87c03 100644 --- a/content/test/data/accessibility/html/modal-dialog-closed-expected-android.txt +++ b/content/test/data/accessibility/html/modal-dialog-closed-expected-android.txt
@@ -1,5 +1,5 @@ android.webkit.WebView focusable focused scrollable ++android.widget.TextView name='Test that elements respawn in the accessibility tree after a modal dialog closes.' ++android.view.View role_description='region' -++++android.view.View role_description='menu pop up button' clickable focusable name='This should be in the tree.' +++++android.view.View role_description='menu pop up button' clickable collapsed focusable name='This should be in the tree.' ++android.widget.Spinner role_description='color picker' clickable focusable name='#000000' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/optgroup-expected-android.txt b/content/test/data/accessibility/html/optgroup-expected-android.txt index 5fcd4dc..4cc12a0 100644 --- a/content/test/data/accessibility/html/optgroup-expected-android.txt +++ b/content/test/data/accessibility/html/optgroup-expected-android.txt
@@ -1,6 +1,6 @@ android.webkit.WebView focusable focused scrollable ++android.view.View -++++android.view.View role_description='menu pop up button' clickable focusable +++++android.view.View role_description='menu pop up button' clickable collapsed focusable ++++++android.view.View invisible ++++++++android.view.View clickable focusable invisible name='One' ++++++++android.view.View clickable focusable invisible name='Two' item_index=1 row_index=1 @@ -9,4 +9,4 @@ ++++++++android.view.View clickable disabled invisible name='One' item_index=4 row_index=4 ++++++++android.view.View clickable disabled invisible name='Two' item_index=5 row_index=5 ++++++++android.view.View clickable disabled invisible name='Three' item_index=6 row_index=6 -++++++++android.view.View clickable disabled invisible name='Four' item_index=7 row_index=7 +++++++++android.view.View clickable disabled invisible name='Four' item_index=7 row_index=7 \ No newline at end of file
diff --git a/content/test/data/accessibility/html/overflow-actions-expected-android.txt b/content/test/data/accessibility/html/overflow-actions-expected-android.txt index 13ff98d..e0d7dc4 100644 --- a/content/test/data/accessibility/html/overflow-actions-expected-android.txt +++ b/content/test/data/accessibility/html/overflow-actions-expected-android.txt
@@ -1,7 +1,7 @@ android.webkit.WebView focusable focused has_character_locations scrollable -++android.view.View has_character_locations scrollable name='Example Paragraph 1 Example Paragraph 2' +++android.view.View has_character_locations scrollable name='Example Paragraph 1 Example Paragraph 2' action_scroll_forward action_scroll_down ++++android.view.View has_character_locations interesting name='Example Paragraph 1' ++++android.view.View has_character_locations interesting name='Example Paragraph 2' ++android.view.View has_character_locations ++++android.view.View has_character_locations interesting name='Example Paragraph 1' -++++android.view.View has_character_locations interesting name='Example Paragraph 2' +++++android.view.View has_character_locations interesting name='Example Paragraph 2' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/summary-expected-android.txt b/content/test/data/accessibility/html/summary-expected-android.txt index d9d39873..c79ff3a 100644 --- a/content/test/data/accessibility/html/summary-expected-android.txt +++ b/content/test/data/accessibility/html/summary-expected-android.txt
@@ -1,3 +1,3 @@ android.webkit.WebView focusable focused scrollable ++android.view.View -++++android.view.View role_description='disclosure triangle' clickable focusable name='details tag' \ No newline at end of file +++++android.view.View role_description='disclosure triangle' clickable collapsed focusable name='details tag' \ No newline at end of file
diff --git a/content/test/data/forms/form_controls_browsertest_checkbox_android.png b/content/test/data/forms/form_controls_browsertest_checkbox_android.png index 07eef94d..d819a9b 100644 --- a/content/test/data/forms/form_controls_browsertest_checkbox_android.png +++ b/content/test/data/forms/form_controls_browsertest_checkbox_android.png Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_checkbox_android_kitkat.png b/content/test/data/forms/form_controls_browsertest_checkbox_android_kitkat.png deleted file mode 100644 index 296a7d8..0000000 --- a/content/test/data/forms/form_controls_browsertest_checkbox_android_kitkat.png +++ /dev/null Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_radio_android.png b/content/test/data/forms/form_controls_browsertest_radio_android.png index 0126008..3b9d02c 100644 --- a/content/test/data/forms/form_controls_browsertest_radio_android.png +++ b/content/test/data/forms/form_controls_browsertest_radio_android.png Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_radio_android_kitkat.png b/content/test/data/forms/form_controls_browsertest_radio_android_kitkat.png deleted file mode 100644 index a3f467dfb..0000000 --- a/content/test/data/forms/form_controls_browsertest_radio_android_kitkat.png +++ /dev/null Binary files differ
diff --git a/content/test/data/gpu/vc/webgpu_video.js b/content/test/data/gpu/vc/webgpu_video.js index 85192c3..304393d 100644 --- a/content/test/data/gpu/vc/webgpu_video.js +++ b/content/test/data/gpu/vc/webgpu_video.js
@@ -366,7 +366,7 @@ if (addUI) { passEncoder.setPipeline(pipelineForIcons); passEncoder.setVertexBuffer(0, verticesBufferForIcons); - passEncoder.draw(videos.length * 6, 1, 0, 0); + passEncoder.draw(videos.length * 6); } passEncoder.endPass(); @@ -374,7 +374,61 @@ }); } - setInterval(oneFrame, 143); + const oneFrameWithImportTextureApi = () => { + renderPassDescriptor.colorAttachments[0].attachment = swapChain + .getCurrentTexture() + .createView(); + + for (let i = 0; i < videos.length; ++i) { + videoTextures[i] = device.experimentalImportTexture( + videos[i], GPUTextureUsage.SAMPLED); + } + + const commandEncoder = device.createCommandEncoder(); + const passEncoder = + commandEncoder.beginRenderPass(renderPassDescriptor); + passEncoder.setPipeline(pipeline); + passEncoder.setVertexBuffer(0, verticesBuffer); + + for (let i = 0; i < videos.length; ++i) { + bindGroups[i] = device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { + binding: 0, + resource: sampler, + }, + { + binding: 1, + resource: videoTextures[i].createView(), + }, + ], + }); + const firstVertex = i * 6; + passEncoder.setBindGroup(0, bindGroups[i]); + passEncoder.draw(6, 1, firstVertex, 0); + } + + // Add UI on Top of (videoRows * videoColumns) videos. + if (addUI) { + passEncoder.setPipeline(pipelineForIcons); + passEncoder.setVertexBuffer(0, verticesBufferForIcons); + passEncoder.draw(videos.length * 6); + } + + passEncoder.endPass(); + device.queue.submit([commandEncoder.finish()]); + + // Destroy the texture after submit to promptly recycle resources. + for (let i = 0; i < videoTextures.length; ++i) + videoTextures[i].destroy(); + } + + if (useImportTextureApi) { + setInterval(oneFrameWithImportTextureApi, 143); + } else { + setInterval(oneFrame, 143); + } // TODO(magchen@): Render frames at different fps. // 4 videos at 30 fps, oneFrame() should be called every 33 milliseconds.
diff --git a/content/test/data/gpu/vc/webgpu_videos_mxn.html b/content/test/data/gpu/vc/webgpu_videos_mxn.html index 17c78ae..da84cc0 100644 --- a/content/test/data/gpu/vc/webgpu_videos_mxn.html +++ b/content/test/data/gpu/vc/webgpu_videos_mxn.html
@@ -23,7 +23,7 @@ const _totalVideoHeight = 900; var hasUIOnTop = true; var useWebGpuForUI = true; - var useImportTextureApi = false; + var useImportTextureApi = true; const parsedString = (function (names) { const pairs = {}; @@ -70,7 +70,11 @@ hasUIOnTop = false; else if (uiOption == 'css') useWebGpuForUI = false; - if (parsedString['import_texture_api'] == '1') + + const api = parsedString['import_texture_api'] + if (api == '0') + useImportTextureApi = false; + else if (api == '1') useImportTextureApi = true; // Get the number of video rows and columns from the string. @@ -116,7 +120,7 @@ videos[videoRows * videoColumns].height = 50; await Promise.all(videos.map(video => video.play())); - p.innerHTML = ""; + p.remove(); // Simulate video playback by WebGpu rendering. webGpuDrawVideoFrames(gpuSetting, videos, videoRows, videoColumns,
diff --git a/content/test/data/gpu/webgpu-import-video.html b/content/test/data/gpu/webgpu-import-video.html index 77a77246..570ab5a 100644 --- a/content/test/data/gpu/webgpu-import-video.html +++ b/content/test/data/gpu/webgpu-import-video.html
@@ -1,20 +1,12 @@ <html> <body> - <canvas id="canvas" width=960 height=1080></canvas> + <canvas id="canvas" width=960 height=540></canvas> <script type="module"> const video = document.createElement('video'); video.src = './vc/teddy1_vp9_640x360_30fps.webm'; video.loop = true; video.muted = true; - // Test with two videos. The original implementation had a bug - // where importing a second video would result in improper - // synchronization. The mailbox would be used before it was created. - const video2 = document.createElement('video'); - video2.src = './vc/teddy2_vp9_320x180_15fps.webm'; - video2.loop = true; - video2.muted = true; - const adapter = navigator.gpu && await navigator.gpu.requestAdapter(); const device = await adapter.requestDevice(); @@ -48,14 +40,15 @@ ); const uv : array<vec2<f32>, 6> = array<vec2<f32>, 6>( vec2<f32>(1.0, 0.0), - vec2<f32>(1.0, 2.0), - vec2<f32>(0.0, 2.0), + vec2<f32>(1.0, 1.0), + vec2<f32>(0.0, 1.0), vec2<f32>(1.0, 0.0), - vec2<f32>(0.0, 2.0), + vec2<f32>(0.0, 1.0), vec2<f32>(0.0, 0.0) ); Position = vec4<f32>(pos[VertexIndex], 1.0); fragUV = uv[VertexIndex]; + return; } `, }), @@ -66,19 +59,14 @@ code: ` [[binding(0), group(0)]] var<uniform_constant> mySampler: sampler; [[binding(1), group(0)]] var<uniform_constant> myTexture: texture_2d<f32>; -[[binding(2), group(0)]] var<uniform_constant> myTexture2: texture_2d<f32>; [[location(0)]] var<in> fragUV : vec2<f32>; [[location(0)]] var<out> outColor : vec4<f32>; [[stage(fragment)]] fn main() -> void { - if (fragUV.y <= 1.0) { - outColor = textureSample(myTexture, mySampler, fragUV); - } else { - var uv : vec2<f32> = vec2<f32>(fragUV.x, fragUV.y - 1.0); - outColor = textureSample(myTexture2, mySampler, uv); - } + outColor = textureSample(myTexture, mySampler, fragUV); + return; } `, }), @@ -114,9 +102,6 @@ const videoTexture = device.experimentalImportTexture( video, GPUTextureUsage.SAMPLED); - const videoTexture2 = device.experimentalImportTexture( - video2, GPUTextureUsage.SAMPLED); - const bindGroup = device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [ @@ -128,10 +113,6 @@ binding: 1, resource: videoTexture.createView(), }, - { - binding: 2, - resource: videoTexture2.createView(), - }, ], }); @@ -145,13 +126,11 @@ // Destroy the texture after submit to promptly recycle resources. videoTexture.destroy(); - videoTexture2.destroy(); requestAnimationFrame(frame); } await video.play(); - await video2.play(); requestAnimationFrame(frame); </script> </body>
diff --git a/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt index 9d248811..93e2448 100644 --- a/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt
@@ -61,6 +61,9 @@ crbug.com/681341 [ mac nvidia ] GpuProcess_mac_webgl_high_performance [ Skip ] crbug.com/681341 [ mac nvidia ] GpuProcess_mac_webgl_terminated_high_performance [ Skip ] +# Dual-GPU problem with SkiaRenderer. +crbug.com/1170840 [ mac amd skia-renderer-gl ] GpuProcess_mac_webgl_terminated_high_performance [ Skip ] + # Android and Fuchsia do not support software fallback. [ android ] GpuProcess_disable_gpu [ Skip ] [ android ] GpuProcess_disable_gpu_and_swiftshader [ Skip ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index bb89ab0..3e788e8 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -396,3 +396,6 @@ # Flakes on Mac dual-GPU crbug.com/1069339 [ mojave amd-0x6821 ] Pixel_OffscreenCanvasIBRCWebGLHighPerfWorker [ RetryOnFailure ] # finder:disable Very low flake rate (1 in 1k+ builds) + +# Failures on Mac FYI arm64 Release (Apple DTK) +crbug.com/1175753 [ mac release apple-apple-a12z ] Pixel_Video_BackdropFilter [ Skip ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt index 5e773eb..7ca77c6 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -126,8 +126,6 @@ crbug.com/1136231 [ win ] conformance/extensions/s3tc-and-rgtc.html [ Failure ] crbug.com/1136231 [ linux ] conformance/extensions/s3tc-and-rgtc.html [ Failure ] -crbug.com/1165751 conformance/glsl/bugs/vector-matrix-constructor-scalarization.html [ Failure ] - # Must handle rotated videos on all platforms. crbug.com/1136205 conformance/textures/misc/video-rotation.html [ Skip ] @@ -138,8 +136,8 @@ crbug.com/1175371 [ mac ] conformance/extensions/khr-parallel-shader-compile.html [ Failure ] crbug.com/1175371 [ win ] conformance/extensions/khr-parallel-shader-compile.html [ Failure ] -# TODO(kbr): investigate failure on validating command decoder. -crbug.com/angleproject/5499 [ no-passthrough ] conformance/glsl/misc/shaders-with-name-conflicts.html [ Skip ] +# Won't investigate failure on validating command decoder. Remove once it's unshipped. +crbug.com/angleproject/5499 [ no-passthrough ] conformance/glsl/misc/shaders-with-name-conflicts.html [ Failure ] crbug.com/953120 conformance/programs/program-handling.html [ Failure ] @@ -938,6 +936,10 @@ [ android qualcomm ] WebglExtension_WEBGL_compressed_texture_s3tc [ Skip ] [ android qualcomm ] WebglExtension_WEBGL_compressed_texture_s3tc_srgb [ Skip ] +# Was too difficult to suppress these failures on individual bots. +crbug.com/1165751 [ android-lollipop ] conformance/glsl/bugs/vector-matrix-constructor-scalarization.html [ Failure ] +crbug.com/1165751 [ android-marshmallow ] conformance/glsl/bugs/vector-matrix-constructor-scalarization.html [ Failure ] +crbug.com/1165751 [ android-nougat ] conformance/glsl/bugs/vector-matrix-constructor-scalarization.html [ Failure ] # Video tests are flaky. Sometimes the video is black. crbug.com/948894 [ android ] conformance/textures/video/* [ RetryOnFailure ] @@ -966,6 +968,8 @@ crbug.com/906737 [ android qualcomm ] conformance/extensions/webgl-compressed-texture-astc.html [ Failure ] crbug.com/906742 [ android qualcomm no-passthrough ] conformance2/glsl3/compare-structs-containing-arrays.html [ Failure ] +crbug.com/1155942 [ android qualcomm ] conformance2/glsl3/precision-side-effects-bug.html [ Failure ] +crbug.com/1176485 [ android qualcomm ] conformance2/glsl3/uint-int-shift-bug.html [ Failure ] crbug.com/1008535 [ android android-pixel-2 passthrough ] conformance2/textures/misc/tex-image-with-bad-args-from-dom-elements.html [ Skip ] crbug.com/1000354 [ android android-pixel-2 passthrough ] conformance2/reading/read-pixels-from-fbo-test.html [ Failure ] crbug.com/951628 [ android android-pixel-2 passthrough ] conformance/rendering/blending.html [ Failure ] @@ -982,6 +986,7 @@ crbug.com/1143323 [ android android-pixel-2 passthrough ] conformance/rendering/draw-arrays-out-of-bounds.html [ Failure ] crbug.com/1154706 [ android android-pixel-2 no-passthrough ] conformance/ogles/GL/clamp/clamp_001_to_006.html [ RetryOnFailure ] + # This test is failing on Android Pixel 2 and 3 (Qualcomm) # Seems to be an OpenGL ES bug. crbug.com/695742 [ android qualcomm angle-disabled ] deqp/functional/gles3/multisample.html [ RetryOnFailure ] @@ -1014,9 +1019,11 @@ crbug.com/angleproject/3753 [ android angle-opengles ] conformance/textures/misc/texture-upload-size.html [ Failure ] crbug.com/1037958 [ mac amd-0x679e ] conformance2/transform_feedback/switching-objects.html [ RetryOnFailure ] -crbug.com/1082003 [ android angle-opengles no-passthrough qualcomm ] deqp/functional/gles3/fragdepth.html [ RetryOnFailure ] crbug.com/1103370 [ android angle-opengles no-passthrough qualcomm ] deqp/functional/gles3/fborender/recreate_color_03.html [ RetryOnFailure ] +# Too flaky on vaidating command decoder to mark RetryOnFailure. +crbug.com/1082003 [ android angle-opengles no-passthrough qualcomm ] deqp/functional/gles3/fragdepth.html [ Failure ] + # Conflicting expectations to test that the # "Expectations have no collisions" unittest works.
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index 8592ce18..240d335 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -207,8 +207,6 @@ crbug.com/1136231 [ win ] conformance/extensions/s3tc-and-rgtc.html [ Failure ] crbug.com/1136231 [ linux ] conformance/extensions/s3tc-and-rgtc.html [ Failure ] -crbug.com/1165751 conformance/glsl/bugs/vector-matrix-constructor-scalarization.html [ Failure ] - # Must handle rotated videos on all platforms. crbug.com/1136205 conformance/textures/misc/video-rotation.html [ Skip ] @@ -219,8 +217,8 @@ crbug.com/1175371 [ mac ] conformance/extensions/khr-parallel-shader-compile.html [ Failure ] crbug.com/1175371 [ win ] conformance/extensions/khr-parallel-shader-compile.html [ Failure ] -# TODO(kbr): investigate failure on validating command decoder. -crbug.com/angleproject/5499 [ no-passthrough ] conformance/glsl/misc/shaders-with-name-conflicts.html [ Skip ] +# Won't investigate failure on validating command decoder. Remove once it's unshipped. +crbug.com/angleproject/5499 [ no-passthrough ] conformance/glsl/misc/shaders-with-name-conflicts.html [ Failure ] # Skipping new tests crbug.com/angleproject/5038 conformance/extensions/ext-color-buffer-half-float.html [ Skip ] @@ -259,6 +257,8 @@ # Win / Intel / Vulkan / Passthrough command decoder # Technically flaky, but flake rate is too high for RetryOnFailure. crbug.com/angleproject/4922 [ win intel angle-vulkan passthrough ] conformance/context/context-attributes-alpha-depth-stencil-antialias.html [ Failure ] +# Need to adjust tolerances of this test. +crbug.com/1165751 [ win intel angle-vulkan passthrough ] conformance/glsl/bugs/vector-matrix-constructor-scalarization.html [ Failure ] #################### # Fuchsia failures # @@ -523,6 +523,11 @@ crbug.com/903903 [ android qualcomm ] conformance/glsl/bugs/sampler-array-struct-function-arg.html [ Failure ] crbug.com/478572 [ android qualcomm ] conformance/glsl/bugs/sequence-operator-evaluation-order.html [ Failure ] +# Was too difficult to suppress these failures on individual bots. +crbug.com/1165751 [ android-lollipop ] conformance/glsl/bugs/vector-matrix-constructor-scalarization.html [ Failure ] +crbug.com/1165751 [ android-marshmallow ] conformance/glsl/bugs/vector-matrix-constructor-scalarization.html [ Failure ] +crbug.com/1165751 [ android-nougat ] conformance/glsl/bugs/vector-matrix-constructor-scalarization.html [ Failure ] + # The following test is very slow and therefore times out on Android bot. [ android ] conformance/rendering/multisample-corruption.html [ Skip ] crbug.com/679697 [ android qualcomm no-passthrough ] conformance/textures/misc/copytexsubimage2d-large-partial-copy-corruption.html [ Failure ]
diff --git a/content/utility/utility_main.cc b/content/utility/utility_main.cc index 267d1604..b9bcff4 100644 --- a/content/utility/utility_main.cc +++ b/content/utility/utility_main.cc
@@ -175,11 +175,15 @@ // base::RandBytes() will CHECK fail when v8 is initialized. base::RandBytes(&buffer, sizeof(buffer)); - // Network service process needs FWPUCLNT.DLL to be loaded otherwise - // getaddrinfo fails. if (sandbox_type == sandbox::policy::SandboxType::kNetwork) { + // Network service process needs FWPUCLNT.DLL to be loaded before sandbox + // lockdown otherwise getaddrinfo fails. HMODULE fwpuclnt_pin = ::LoadLibrary(L"FWPUCLNT.DLL"); UNREFERENCED_PARAMETER(fwpuclnt_pin); + // Network service process needs urlmon.dll to be loaded before sandbox + // lockdown otherwise CoInternetCreateSecurityManager fails. + HMODULE urlmon_pin = ::LoadLibrary(L"urlmon.dll"); + UNREFERENCED_PARAMETER(urlmon_pin); } g_utility_target_services->LowerToken(); }
diff --git a/docs/speed/benchmark/harnesses/webrtc_perf.md b/docs/speed/benchmark/harnesses/webrtc_perf.md index 07523bfc..59498c9 100644 --- a/docs/speed/benchmark/harnesses/webrtc_perf.md +++ b/docs/speed/benchmark/harnesses/webrtc_perf.md
@@ -44,7 +44,10 @@ ./tools/perf/run_benchmark webrtc --browser-executable=out/Release/chrome --story-tag-filter=stress ``` - +Or you can run the single story directly: +``` +./tools/perf/run_benchmark webrtc --story multiple-peerconnections --browser-executable=out/Release/chrome +``` ## Adding Telemetry Tests for WebRTC
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn index 81dbdfe..05bf58c0 100644 --- a/extensions/browser/BUILD.gn +++ b/extensions/browser/BUILD.gn
@@ -18,7 +18,10 @@ # Includes all API implementations and the ExtensionsApiClient # interface. Moving an API from src/chrome to src/extensions implies # it can be cleanly disabled with enable_extensions=false. - public_deps += [ "//extensions/browser/api" ] + public_deps += [ + "//extensions/browser/api", + "//extensions/browser/api:api_implementations", + ] } # Isolate the instantiation of BrowserContextKeyedServiceFactories.
diff --git a/extensions/browser/api/BUILD.gn b/extensions/browser/api/BUILD.gn index 8d5579ea..5ba77f9 100644 --- a/extensions/browser/api/BUILD.gn +++ b/extensions/browser/api/BUILD.gn
@@ -43,41 +43,6 @@ "//ipc", ] - # TODO(crbug/1158984): remove these deps. The core API system should not - # include specific API implementations; these should instead be moved to - # api_implementations below (and only included in the final Chrome target). - public_deps += [ - "//extensions/browser/api/activity_log", - "//extensions/browser/api/alarms", - "//extensions/browser/api/app_current_window_internal", - "//extensions/browser/api/app_runtime", - "//extensions/browser/api/app_window", - "//extensions/browser/api/audio", - "//extensions/browser/api/automation_internal", - "//extensions/browser/api/bluetooth", - "//extensions/browser/api/bluetooth_low_energy", - "//extensions/browser/api/bluetooth_socket", - "//extensions/browser/api/cast_channel", - "//extensions/browser/api/declarative", - "//extensions/browser/api/declarative_content", - "//extensions/browser/api/declarative_net_request", - "//extensions/browser/api/declarative_webrequest", - "//extensions/browser/api/dns", - "//extensions/browser/api/feedback_private", - "//extensions/browser/api/file_handlers", - "//extensions/browser/api/file_system", - "//extensions/browser/api/hid", - "//extensions/browser/api/idle", - "//extensions/browser/api/mime_handler_private", - "//extensions/browser/api/power", - "//extensions/browser/api/printer_provider", - "//extensions/browser/api/runtime", - "//extensions/browser/api/test", - "//extensions/browser/api/usb", - "//extensions/browser/api/virtual_keyboard_private:virtual_keyboard_delegate", - "//extensions/browser/api/web_request", - ] - deps = [ "//base:i18n", "//build:chromeos_buildflags",
diff --git a/extensions/browser/api/alarms/BUILD.gn b/extensions/browser/api/alarms/BUILD.gn index 190d1a2..af06a5f 100644 --- a/extensions/browser/api/alarms/BUILD.gn +++ b/extensions/browser/api/alarms/BUILD.gn
@@ -19,6 +19,7 @@ deps = [ "//base/util/values:values_util", + "//extensions/common", "//extensions/common/api", ]
diff --git a/extensions/browser/api/app_current_window_internal/BUILD.gn b/extensions/browser/api/app_current_window_internal/BUILD.gn index c6896e2..ab3c57cf 100644 --- a/extensions/browser/api/app_current_window_internal/BUILD.gn +++ b/extensions/browser/api/app_current_window_internal/BUILD.gn
@@ -15,6 +15,7 @@ deps = [ "//content/public/browser", + "//extensions/common", "//extensions/common/api", ]
diff --git a/extensions/browser/api/app_runtime/BUILD.gn b/extensions/browser/api/app_runtime/BUILD.gn index b2e292ac..df4e550 100644 --- a/extensions/browser/api/app_runtime/BUILD.gn +++ b/extensions/browser/api/app_runtime/BUILD.gn
@@ -13,7 +13,10 @@ "app_runtime_api.h", ] - deps = [ "//extensions/common/api" ] + deps = [ + "//extensions/common", + "//extensions/common/api", + ] public_deps = [ "//extensions/browser:browser_sources" ] }
diff --git a/extensions/browser/api/app_window/BUILD.gn b/extensions/browser/api/app_window/BUILD.gn index 385bbab..175dd3a 100644 --- a/extensions/browser/api/app_window/BUILD.gn +++ b/extensions/browser/api/app_window/BUILD.gn
@@ -16,6 +16,7 @@ deps = [ "//build:chromeos_buildflags", "//content/public/browser", + "//extensions/common", "//extensions/common/api", ]
diff --git a/extensions/browser/api/automation_internal/BUILD.gn b/extensions/browser/api/automation_internal/BUILD.gn index 21daa13e..520d2af 100644 --- a/extensions/browser/api/automation_internal/BUILD.gn +++ b/extensions/browser/api/automation_internal/BUILD.gn
@@ -23,6 +23,8 @@ deps = [ "//build:chromeos_buildflags", "//components/prefs", + "//extensions/browser/api", + "//extensions/common", "//extensions/common/api", ] }
diff --git a/extensions/browser/api/bluetooth/BUILD.gn b/extensions/browser/api/bluetooth/BUILD.gn index b913480..80fccb2 100644 --- a/extensions/browser/api/bluetooth/BUILD.gn +++ b/extensions/browser/api/bluetooth/BUILD.gn
@@ -27,6 +27,7 @@ "//build:chromeos_buildflags", "//components/device_event_log", "//content/public/browser", + "//extensions/common", "//extensions/common/api", ]
diff --git a/extensions/browser/api/bluetooth_low_energy/BUILD.gn b/extensions/browser/api/bluetooth_low_energy/BUILD.gn index c7767b07..55522609 100644 --- a/extensions/browser/api/bluetooth_low_energy/BUILD.gn +++ b/extensions/browser/api/bluetooth_low_energy/BUILD.gn
@@ -31,6 +31,8 @@ deps = [ "//device/bluetooth", "//device/bluetooth/public/cpp", + "//extensions/browser/api", + "//extensions/common", "//extensions/common/api", ]
diff --git a/extensions/browser/api/bluetooth_socket/BUILD.gn b/extensions/browser/api/bluetooth_socket/BUILD.gn index 953002f..a18c453 100644 --- a/extensions/browser/api/bluetooth_socket/BUILD.gn +++ b/extensions/browser/api/bluetooth_socket/BUILD.gn
@@ -22,7 +22,11 @@ "//build/config/compiler:no_size_t_to_int_warning", ] - deps = [ "//extensions/common/api" ] + deps = [ + "//extensions/browser/api", + "//extensions/common", + "//extensions/common/api", + ] public_deps = [ "//extensions/browser:browser_sources" ] }
diff --git a/extensions/browser/api/cast_channel/BUILD.gn b/extensions/browser/api/cast_channel/BUILD.gn index 1227f29..7251e1ac 100644 --- a/extensions/browser/api/cast_channel/BUILD.gn +++ b/extensions/browser/api/cast_channel/BUILD.gn
@@ -20,6 +20,8 @@ deps = [ "//base", "//components/cast_channel", + "//extensions/browser/api", + "//extensions/common", "//extensions/common/api", "//net", "//third_party/openscreen/src/cast/common/channel/proto:channel_proto",
diff --git a/extensions/browser/api/clipboard/BUILD.gn b/extensions/browser/api/clipboard/BUILD.gn index 145361c0..9b4ea1e 100644 --- a/extensions/browser/api/clipboard/BUILD.gn +++ b/extensions/browser/api/clipboard/BUILD.gn
@@ -15,6 +15,7 @@ deps = [ "//extensions/browser/api", + "//extensions/common", "//extensions/common/api", "//ui/base/clipboard", ]
diff --git a/extensions/browser/api/diagnostics/BUILD.gn b/extensions/browser/api/diagnostics/BUILD.gn index ed8bb69..df1bcd5 100644 --- a/extensions/browser/api/diagnostics/BUILD.gn +++ b/extensions/browser/api/diagnostics/BUILD.gn
@@ -19,6 +19,7 @@ deps = [ "//chromeos/dbus", "//chromeos/dbus/debug_daemon", + "//extensions/common", "//extensions/common/api", ]
diff --git a/extensions/browser/api/dns/BUILD.gn b/extensions/browser/api/dns/BUILD.gn index 71de8de..be80b442 100644 --- a/extensions/browser/api/dns/BUILD.gn +++ b/extensions/browser/api/dns/BUILD.gn
@@ -13,7 +13,11 @@ "dns_api.h", ] - deps = [ "//extensions/common/api" ] + deps = [ + "//content/public/browser", + "//extensions/common", + "//extensions/common/api", + ] public_deps = [ "//extensions/browser:browser_sources" ] }
diff --git a/extensions/browser/api/feedback_private/BUILD.gn b/extensions/browser/api/feedback_private/BUILD.gn index 66675f9d..9eef7c4 100644 --- a/extensions/browser/api/feedback_private/BUILD.gn +++ b/extensions/browser/api/feedback_private/BUILD.gn
@@ -23,8 +23,10 @@ "//components/feedback", "//content/public/browser", "//extensions/browser:browser_sources", + "//extensions/browser/api", "//extensions/common", "//extensions/common/api", + "//google_apis", "//net", ] @@ -40,6 +42,7 @@ deps += [ "//ash/public/cpp", + "//chromeos/services/assistant/public/cpp", "//chromeos/services/assistant/public/mojom", ] }
diff --git a/extensions/browser/api/file_handlers/BUILD.gn b/extensions/browser/api/file_handlers/BUILD.gn index 810e340..d8bf4a4 100644 --- a/extensions/browser/api/file_handlers/BUILD.gn +++ b/extensions/browser/api/file_handlers/BUILD.gn
@@ -27,6 +27,7 @@ "//build:chromeos_buildflags", "//content/public/browser", "//content/public/common", + "//extensions/browser/api", "//extensions/common", "//extensions/common/api", "//net",
diff --git a/extensions/browser/api/file_system/BUILD.gn b/extensions/browser/api/file_system/BUILD.gn index b73b09e2..7654195 100644 --- a/extensions/browser/api/file_system/BUILD.gn +++ b/extensions/browser/api/file_system/BUILD.gn
@@ -22,6 +22,7 @@ "//base/util/values:values_util", "//build:chromeos_buildflags", "//content/public/browser", + "//extensions/browser/api", "//extensions/browser/api/file_handlers", "//extensions/common", "//extensions/common/api",
diff --git a/extensions/browser/api/hid/BUILD.gn b/extensions/browser/api/hid/BUILD.gn index d6506b22..b77876c 100644 --- a/extensions/browser/api/hid/BUILD.gn +++ b/extensions/browser/api/hid/BUILD.gn
@@ -25,7 +25,10 @@ deps = [ "//content/public/browser", "//content/public/common", + "//extensions/browser/api", + "//extensions/common", "//extensions/common/api", + "//services/device/public/cpp/hid", ] public_deps = [ "//extensions/browser:browser_sources" ]
diff --git a/extensions/browser/api/idle/BUILD.gn b/extensions/browser/api/idle/BUILD.gn index cbfba7e..43ca608 100644 --- a/extensions/browser/api/idle/BUILD.gn +++ b/extensions/browser/api/idle/BUILD.gn
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromeos/ui_mode.gni") import("//extensions/buildflags/buildflags.gni") assert(enable_extensions, @@ -21,9 +22,16 @@ deps = [ "//build:chromeos_buildflags", + "//components/keyed_service/content", + "//content/public/browser", + "//extensions/common", "//extensions/common/api", "//ui/base/idle", ] + if (is_chromeos_ash) { + deps += [ "//chromeos/dbus/power" ] + } + public_deps = [ "//extensions/browser:browser_sources" ] }
diff --git a/extensions/browser/api/test/BUILD.gn b/extensions/browser/api/test/BUILD.gn index c1eeb8f1..41db5ed 100644 --- a/extensions/browser/api/test/BUILD.gn +++ b/extensions/browser/api/test/BUILD.gn
@@ -14,7 +14,9 @@ ] deps = [ + "//content/public/browser", "//content/public/common", + "//extensions/common", "//extensions/common/api", ]
diff --git a/extensions/browser/api/usb/BUILD.gn b/extensions/browser/api/usb/BUILD.gn index a69c0f50..7c4391d5 100644 --- a/extensions/browser/api/usb/BUILD.gn +++ b/extensions/browser/api/usb/BUILD.gn
@@ -26,6 +26,8 @@ "//build:chromeos_buildflags", "//content/public/browser", "//content/public/common", + "//extensions/browser/api", + "//extensions/common", "//extensions/common/api", "//services/device/public/cpp/usb", "//services/device/public/mojom:usb",
diff --git a/extensions/browser/api/virtual_keyboard/BUILD.gn b/extensions/browser/api/virtual_keyboard/BUILD.gn index c66ebcf..ca38b9a 100644 --- a/extensions/browser/api/virtual_keyboard/BUILD.gn +++ b/extensions/browser/api/virtual_keyboard/BUILD.gn
@@ -16,6 +16,7 @@ deps = [ "//build:chromeos_buildflags", "//extensions/browser/api/virtual_keyboard_private", + "//extensions/common", "//extensions/common/api", "//ui/base/ime/chromeos", ]
diff --git a/extensions/browser/api/vpn_provider/BUILD.gn b/extensions/browser/api/vpn_provider/BUILD.gn index 222e86b2..3e3c25a 100644 --- a/extensions/browser/api/vpn_provider/BUILD.gn +++ b/extensions/browser/api/vpn_provider/BUILD.gn
@@ -27,6 +27,7 @@ "//chromeos/network", "//components/keyed_service/content", "//content/public/browser", + "//extensions/common", "//extensions/common/api", ]
diff --git a/extensions/browser/api/webcam_private/BUILD.gn b/extensions/browser/api/webcam_private/BUILD.gn index fb187db..fefa5991 100644 --- a/extensions/browser/api/webcam_private/BUILD.gn +++ b/extensions/browser/api/webcam_private/BUILD.gn
@@ -27,6 +27,7 @@ "//chromeos/dbus/ip_peripheral", "//extensions/browser/api", "//extensions/browser/api/serial", + "//extensions/common", "//extensions/common/api", "//mojo/public/cpp/bindings", "//services/device/public/mojom",
diff --git a/extensions/browser/extension_util.cc b/extensions/browser/extension_util.cc index aaf9438..7faa2e4 100644 --- a/extensions/browser/extension_util.cc +++ b/extensions/browser/extension_util.cc
@@ -13,6 +13,7 @@ #include "extensions/browser/extension_registry.h" #include "extensions/browser/extensions_browser_client.h" #include "extensions/browser/ui_util.h" +#include "extensions/common/cors_util.h" #include "extensions/common/extension.h" #include "extensions/common/features/behavior_feature.h" #include "extensions/common/features/feature.h" @@ -40,6 +41,37 @@ } #endif +void SetCorsOriginAccessListForExtensionHelper( + content::BrowserContext* browser_context, + const Extension& extension, + base::Optional<content::BrowserContext::TargetBrowserContexts> target_mode, + std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, + std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, + base::OnceClosure closure) { + // SetCorsOriginAccessListForExtensionHelper should only affect an incognito + // profile if the extension is actually allowed to run in an incognito profile + // (not just by the extension manifest, but also by user preferences). + if (browser_context->IsOffTheRecord()) { + // TODO(lukasza): Change to util::IsIncognitoEnabled if possible. This + // fails today in All/IncognitoCommandsApiTest.IncognitoMode/0 apparently + // because ExtensionPrefs::IsIncognitoEnabled return `false` and + // ExtensionPrefs::SetIsIncognitoEnabled(..., true) is never called. + DCHECK(IncognitoInfo::IsIncognitoAllowed(&extension)); + } + + if (!target_mode.has_value()) { + target_mode = + IncognitoInfo::IsSplitMode(&extension) + ? content::BrowserContext::TargetBrowserContexts::kSingleContext + : content::BrowserContext::TargetBrowserContexts:: + kAllRelatedContexts; + } + + browser_context->SetCorsOriginAccessListForOrigin( + *target_mode, extension.origin(), std::move(allow_patterns), + std::move(block_patterns), std::move(closure)); +} + } // namespace bool CanBeIncognitoEnabled(const Extension* extension) { @@ -209,5 +241,24 @@ return iter->second; } +void SetCorsOriginAccessListForExtension( + content::BrowserContext* browser_context, + const Extension& extension, + base::Optional<content::BrowserContext::TargetBrowserContexts> target_mode, + base::OnceClosure closure) { + SetCorsOriginAccessListForExtensionHelper( + browser_context, extension, target_mode, + CreateCorsOriginAccessAllowList(extension), + CreateCorsOriginAccessBlockList(extension), std::move(closure)); +} + +void ResetCorsOriginAccessListForExtension( + content::BrowserContext* browser_context, + const Extension& extension, + content::BrowserContext::TargetBrowserContexts target_mode) { + SetCorsOriginAccessListForExtensionHelper( + browser_context, extension, target_mode, {}, {}, base::DoNothing::Once()); +} + } // namespace util } // namespace extensions
diff --git a/extensions/browser/extension_util.h b/extensions/browser/extension_util.h index d439c59..07ef11d 100644 --- a/extensions/browser/extension_util.h +++ b/extensions/browser/extension_util.h
@@ -7,6 +7,9 @@ #include <string> +#include "base/callback.h" +#include "base/optional.h" +#include "content/public/browser/browser_context.h" #include "extensions/common/manifest.h" #include "url/gurl.h" @@ -79,6 +82,27 @@ // Returns a unique int id for each context. int GetBrowserContextId(content::BrowserContext* context); +// Calculates the allowlist and blocklist for |extension| and forwards the +// request to |browser_context| (and possibly also for related incognito +// contexts depending on |target_mode|). +// +// If the optional |target_mode| is not specified, then |target_mode| is +// calculated based on whether |extension| operates in "split" or "spanning" +// incognito mode. +void SetCorsOriginAccessListForExtension( + content::BrowserContext* browser_context, + const Extension& extension, + base::Optional<content::BrowserContext::TargetBrowserContexts> target_mode, + base::OnceClosure closure); + +// Resets the allowlist and blocklist for |extension| to empty lists for +// |browser_context| (and possibly also for related incognito contexts depending +// on |target_mode|). +void ResetCorsOriginAccessListForExtension( + content::BrowserContext* browser_context, + const Extension& extension, + content::BrowserContext::TargetBrowserContexts target_mode); + } // namespace util } // namespace extensions
diff --git a/extensions/browser/extensions_test.cc b/extensions/browser/extensions_test.cc index 8687277..f01cf75 100644 --- a/extensions/browser/extensions_test.cc +++ b/extensions/browser/extensions_test.cc
@@ -30,6 +30,7 @@ class ExtensionTestBrowserContext : public content::TestBrowserContext { private: void SetCorsOriginAccessListForOrigin( + TargetBrowserContexts target_mode, const url::Origin& source_origin, std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
diff --git a/extensions/browser/renderer_startup_helper.cc b/extensions/browser/renderer_startup_helper.cc index ef71952..e50ed7c 100644 --- a/extensions/browser/renderer_startup_helper.cc +++ b/extensions/browser/renderer_startup_helper.cc
@@ -250,11 +250,11 @@ return; // Registers the initial origin access lists to the BrowserContext - // asynchronously. - url::Origin extension_origin = url::Origin::Create(extension.url()); - browser_context_->SetCorsOriginAccessListForOrigin( - extension_origin, CreateCorsOriginAccessAllowList(extension), - CreateCorsOriginAccessBlockList(extension), base::DoNothing::Once()); + // (and all related incognito contexts) asynchronously. + util::SetCorsOriginAccessListForExtension( + browser_context_, extension, + content::BrowserContext::TargetBrowserContexts::kSingleContext, + base::DoNothing::Once()); // We don't need to include tab permisisons here, since the extension // was just loaded. @@ -289,11 +289,10 @@ } // Resets registered origin access lists in the BrowserContext asynchronously. - url::Origin extension_origin = url::Origin::Create(extension.url()); - browser_context_->SetCorsOriginAccessListForOrigin( - extension_origin, std::vector<network::mojom::CorsOriginPatternPtr>(), - std::vector<network::mojom::CorsOriginPatternPtr>(), - base::DoNothing::Once()); + util::ResetCorsOriginAccessListForExtension( + browser_context_, extension, + + content::BrowserContext::TargetBrowserContexts::kSingleContext); for (auto& process_extensions_pair : pending_active_extensions_) process_extensions_pair.second.erase(extension.id());
diff --git a/extensions/renderer/user_script_injector.cc b/extensions/renderer/user_script_injector.cc index 9edc42a..e72761e 100644 --- a/extensions/renderer/user_script_injector.cc +++ b/extensions/renderer/user_script_injector.cc
@@ -141,7 +141,7 @@ } CSSOrigin UserScriptInjector::GetCssOrigin() const { - return CSS_ORIGIN_USER; + return CSS_ORIGIN_AUTHOR; } bool UserScriptInjector::IsRemovingCSS() const {
diff --git a/extensions/shell/browser/shell_browser_context.cc b/extensions/shell/browser/shell_browser_context.cc index 528705c1..98d02e6f 100644 --- a/extensions/shell/browser/shell_browser_context.cc +++ b/extensions/shell/browser/shell_browser_context.cc
@@ -34,6 +34,7 @@ } void ShellBrowserContext::SetCorsOriginAccessListForOrigin( + TargetBrowserContexts target_mode, const url::Origin& source_origin, std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
diff --git a/extensions/shell/browser/shell_browser_context.h b/extensions/shell/browser/shell_browser_context.h index fa686ed..0e5c943 100644 --- a/extensions/shell/browser/shell_browser_context.h +++ b/extensions/shell/browser/shell_browser_context.h
@@ -23,6 +23,7 @@ content::BrowserPluginGuestManager* GetGuestManager() override; storage::SpecialStoragePolicy* GetSpecialStoragePolicy() override; void SetCorsOriginAccessListForOrigin( + TargetBrowserContexts target_mode, const url::Origin& source_origin, std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
diff --git a/gpu/command_buffer/client/webgpu_implementation.cc b/gpu/command_buffer/client/webgpu_implementation.cc index 136958e..579c3c19 100644 --- a/gpu/command_buffer/client/webgpu_implementation.cc +++ b/gpu/command_buffer/client/webgpu_implementation.cc
@@ -200,8 +200,6 @@ ImplementationBase::VerifySyncTokens(sync_tokens, count); } void WebGPUImplementation::WaitSyncTokenCHROMIUM(const GLbyte* sync_token) { - // Flush any commands before this, so we don't block more than necessary. - FlushCommands(); ImplementationBase::WaitSyncToken(sync_token); }
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json index 0bb6948..1c8ee2d 100644 --- a/gpu/config/gpu_driver_bug_list.json +++ b/gpu/config/gpu_driver_bug_list.json
@@ -480,8 +480,15 @@ }, { "id": 88, - "description": "Always rewrite vec/mat constructors to be consistent", - "cr_bugs": [398694], + "description": "Rewrite vec/mat constructors on older GLSL ES drivers, Android O and earlier", + "cr_bugs": [398694, 1165751], + "os": { + "type": "android", + "version": { + "op": "<=", + "value": "8.0" + } + }, "features": [ "scalarize_vec_and_mat_constructor_args" ]
diff --git a/headless/lib/headless_crash_reporter_client.cc b/headless/lib/headless_crash_reporter_client.cc index b0563371..22741f9 100644 --- a/headless/lib/headless_crash_reporter_client.cc +++ b/headless/lib/headless_crash_reporter_client.cc
@@ -53,18 +53,18 @@ bool HeadlessCrashReporterClient::GetCrashDumpLocation( #if defined(OS_WIN) - base::string16* crash_dir + std::wstring* crash_dir #else base::FilePath* crash_dir #endif - ) { +) { base::FilePath crash_directory = crash_dumps_dir_; if (crash_directory.empty() && !base::PathService::Get(base::DIR_MODULE, &crash_directory)) { return false; } #if defined(OS_WIN) - *crash_dir = crash_directory.AsUTF16Unsafe(); + *crash_dir = crash_directory.value(); #else *crash_dir = std::move(crash_directory); #endif
diff --git a/headless/lib/headless_crash_reporter_client.h b/headless/lib/headless_crash_reporter_client.h index 1b8579e..9f14b3b 100644 --- a/headless/lib/headless_crash_reporter_client.h +++ b/headless/lib/headless_crash_reporter_client.h
@@ -37,7 +37,7 @@ #endif // defined(OS_POSIX) && !defined(OS_MAC) #if defined(OS_WIN) - bool GetCrashDumpLocation(base::string16* crash_dir) override; + bool GetCrashDumpLocation(std::wstring* crash_dir) override; #else bool GetCrashDumpLocation(base::FilePath* crash_dir) override; #endif
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb index c3d383d..6726835 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb
@@ -63,7 +63,7 @@ <translation id="725427773388857052">Datuen isilpekotasunaren urratzeen, seguruak ez diren webguneen eta abarren aurrean babes zaitzake Chromium-ek.</translation> <translation id="7269362888766543920">Gehigarri batzuek huts eginarazten diote Chromium-i. Desinstala itzazu.</translation> <translation id="7337881442233988129">Chromium</translation> -<translation id="7357211569052832586">Kendu dira hautatutako datuak Chromium-etik eta sinkronizatutako gailuetatik. Baliteke Google-ko kontuak arakatze-historiako bestelako datu batzuk (adibidez, bilaketak eta beste Google-ren zerbitzu batzuetako jarduerak) edukitzea history.google.com webgunean.</translation> +<translation id="7357211569052832586">Kendu dira hautatutako datuak Chromium-etik eta sinkronizatutako gailuetatik. Baliteke Google-ko kontuak arakatze-historiako bestelako datu batzuk (adibidez, bilaketak eta Google-ren beste zerbitzu batzuetako jarduerak) edukitzea history.google.com webgunean.</translation> <translation id="7400689562045506105">Erabili Chromium edonon</translation> <translation id="766897673682622022">Pasahitza arriskuan jarri da, datuen isilpekotasuna urratu delako. Pasahitza berehala aldatzea gomendatzen du Chromium-ek.</translation> <translation id="7674213385180944843">Ireki Ezarpenak > Pribatutasuna > Kamera > Chromium, eta aktibatu kamera.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_eu.xtb index e8572242..0d9957c 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_eu.xtb
@@ -6,7 +6,7 @@ <translation id="1504372625950710826">Chrome-k ezin izan ditu bilatu eguneratzeak. Egiaztatu Internetera konektatuta zaudela.</translation> <translation id="1682483655351012182">Sinkronizatu Chrome-ko datuak</translation> <translation id="1759842336958782510">Chrome</translation> -<translation id="1917964099031477364">Kontu hau eta gorde gabeko datuak kendu egingo dira Chromium-etik eta gailuko beste Google-ren aplikazio batzuetatik.</translation> +<translation id="1917964099031477364">Kontu hau eta gorde gabeko datuak kendu egingo dira Chromium-etik eta gailuko Google-ren beste aplikazio batzuetatik.</translation> <translation id="2009224836393115614">Chrome-k ezin izan ditu egiaztatu pasahitzak. Egiaztatu Internetera konektatuta zaudela.</translation> <translation id="2147651015520127414">Webgunearen ziurtagiria <ph name="ISSUER" /> hornitzaileak jaulki duela egiaztatu du Chrome-k.</translation> <translation id="2199719347983604670">Chrome-ren sinkronizazioaren datuak</translation> @@ -79,7 +79,7 @@ <translation id="8160472928944011082">Ezin da eguneratu Chrome</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Eskubide guztiak erreserbatuta.</translation> <translation id="840168496893712993">Gehigarri batzuek Chrome huts egitea eragiten dute. Saiatu horiek desinstalatzen.</translation> -<translation id="8459495907675268833">Kendu dira hautatutako datuak Chrome-tik eta sinkronizatutako gailuetatik. Baliteke Google-ko kontuak arakatze-historiako bestelako datu batzuk (adibidez, bilaketak eta beste Google-ren zerbitzu batzuetako jarduerak) edukitzea history.google.com webgunean.</translation> +<translation id="8459495907675268833">Kendu dira hautatutako datuak Chrome-tik eta sinkronizatutako gailuetatik. Baliteke Google-ko kontuak arakatze-historiako bestelako datu batzuk (adibidez, bilaketak eta Google-ren beste zerbitzu batzuetako jarduerak) edukitzea history.google.com webgunean.</translation> <translation id="850555388806794946">Chrome arakatzaile lehenetsi bihurtzeko: 1. Ireki Ezarpenak. 2. Sakatu Arakatzaile lehenetsia.
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index 45e9c979..7937359f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -118,7 +118,7 @@ <translation id="2139867232736819575">Bilatu kopiatu duzun testua</translation> <translation id="2149973817440762519">Editatu laster-marka</translation> <translation id="2175927920773552910">QR kodea</translation> -<translation id="2198757192731523470">Baliteke Google-k historia erabiltzea Bilaketa, iragarkiak eta beste Google-ren zerbitzu batzuk pertsonalizatzeko.</translation> +<translation id="2198757192731523470">Baliteke Google-k historia erabiltzea Bilaketa, iragarkiak eta Google-ren beste zerbitzu batzuk pertsonalizatzeko.</translation> <translation id="2218443599109088993">Txikitu</translation> <translation id="2230173723195178503">Kargatu da webgunea</translation> <translation id="2239626343334228536">Arakatze-datuak garbitzen…</translation>
diff --git a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.h b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.h index 99558a0..1703997 100644 --- a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.h +++ b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.h
@@ -57,6 +57,7 @@ std::vector<base::string16> GetBuiltinsToProvideAsUserTypes() override; component_updater::ComponentUpdateService* GetComponentUpdateService() override; + signin::IdentityManager* GetIdentityManager() const override; bool IsOffTheRecord() const override; bool SearchSuggestEnabled() const override; bool IsPersonalizedUrlDataCollectionActive() const override;
diff --git a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.mm b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.mm index 303eeff..e9cc505b 100644 --- a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.mm +++ b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.mm
@@ -185,6 +185,11 @@ return GetApplicationContext()->GetComponentUpdateService(); } +signin::IdentityManager* AutocompleteProviderClientImpl::GetIdentityManager() + const { + return IdentityManagerFactory::GetForBrowserState(browser_state_); +} + bool AutocompleteProviderClientImpl::IsOffTheRecord() const { return browser_state_->IsOffTheRecord(); }
diff --git a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm index bc0d3658..60fd751 100644 --- a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm +++ b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm
@@ -40,6 +40,7 @@ #import "ios/chrome/browser/policy/policy_features.h" #include "ios/chrome/browser/policy_url_blocking/policy_url_blocking_service.h" #include "ios/chrome/browser/reading_list/reading_list_model_factory.h" +#import "ios/chrome/browser/safe_browsing/chrome_password_protection_service_factory.h" #import "ios/chrome/browser/safe_browsing/real_time_url_lookup_service_factory.h" #import "ios/chrome/browser/safe_browsing/verdict_cache_manager_factory.h" #include "ios/chrome/browser/screen_time/screen_time_buildflags.h" @@ -113,6 +114,7 @@ BreadcrumbManagerKeyedServiceFactory::GetInstance(); BrowserDownloadServiceFactory::GetInstance(); BrowsingDataRemoverFactory::GetInstance(); + ChromePasswordProtectionServiceFactory::GetInstance(); ConsentAuditorFactory::GetInstance(); DeviceSharingManagerFactory::GetInstance(); DiscoverFeedServiceFactory::GetInstance();
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client_unittest.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client_unittest.mm index ad35bc10..461d90a8 100644 --- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client_unittest.mm +++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client_unittest.mm
@@ -4,6 +4,8 @@ #import "ios/chrome/browser/metrics/ios_chrome_metrics_service_client.h" +#include <string> + #include "base/metrics/persistent_histogram_allocator.h" #include "base/test/scoped_feature_list.h" #include "components/metrics/client_info.h" @@ -39,7 +41,7 @@ PlatformTest::SetUp(); metrics::MetricsService::RegisterPrefs(prefs_.registry()); metrics_state_manager_ = metrics::MetricsStateManager::Create( - &prefs_, &enabled_state_provider_, base::string16(), + &prefs_, &enabled_state_provider_, std::wstring(), base::BindRepeating( &IOSChromeMetricsServiceClientTest::FakeStoreClientInfoBackup, base::Unretained(this)),
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.mm index 46fec601..39d753c3 100644 --- a/ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.mm +++ b/ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.mm
@@ -4,6 +4,8 @@ #include "ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.h" +#include <string> + #include "base/bind.h" #include "base/check.h" #include "base/command_line.h" @@ -89,7 +91,7 @@ DCHECK(thread_checker_.CalledOnValidThread()); if (!metrics_state_manager_) { metrics_state_manager_ = metrics::MetricsStateManager::Create( - local_state_, enabled_state_provider_.get(), base::string16(), + local_state_, enabled_state_provider_.get(), std::wstring(), base::BindRepeating(&PostStoreMetricsClientInfo), base::BindRepeating(&LoadMetricsClientInfo)); }
diff --git a/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider_unittest.mm b/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider_unittest.mm index f12a252..83d59c4 100644 --- a/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider_unittest.mm +++ b/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider_unittest.mm
@@ -5,6 +5,7 @@ #include "ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.h" #include <memory> +#include <string> #import <Foundation/Foundation.h> @@ -151,7 +152,7 @@ was_last_shutdown_clean); metrics_state_ = metrics::MetricsStateManager::Create( &local_state_, new metrics::TestEnabledStateProvider(false, false), - base::string16(), metrics::MetricsStateManager::StoreClientInfoCallback(), + std::wstring(), metrics::MetricsStateManager::StoreClientInfoCallback(), metrics::MetricsStateManager::LoadClientInfoCallback()); metrics_service_.reset(new metrics::MetricsService( metrics_state_.get(), &metrics_client_, &local_state_)); @@ -188,7 +189,7 @@ local_state_.SetBoolean(metrics::prefs::kStabilityExitedCleanly, true); metrics_state_ = metrics::MetricsStateManager::Create( &local_state_, new metrics::TestEnabledStateProvider(false, false), - base::string16(), metrics::MetricsStateManager::StoreClientInfoCallback(), + std::wstring(), metrics::MetricsStateManager::StoreClientInfoCallback(), metrics::MetricsStateManager::LoadClientInfoCallback()); metrics_service_.reset(new metrics::MetricsService( metrics_state_.get(), &metrics_client_, &local_state_)); @@ -224,7 +225,7 @@ local_state_.SetBoolean(metrics::prefs::kStabilityExitedCleanly, false); metrics_state_ = metrics::MetricsStateManager::Create( &local_state_, new metrics::TestEnabledStateProvider(false, false), - base::string16(), metrics::MetricsStateManager::StoreClientInfoCallback(), + std::wstring(), metrics::MetricsStateManager::StoreClientInfoCallback(), metrics::MetricsStateManager::LoadClientInfoCallback()); metrics_service_.reset(new metrics::MetricsService( metrics_state_.get(), &metrics_client_, &local_state_)); @@ -260,7 +261,7 @@ local_state_.SetBoolean(metrics::prefs::kStabilityExitedCleanly, false); metrics_state_ = metrics::MetricsStateManager::Create( &local_state_, new metrics::TestEnabledStateProvider(false, false), - base::string16(), metrics::MetricsStateManager::StoreClientInfoCallback(), + std::wstring(), metrics::MetricsStateManager::StoreClientInfoCallback(), metrics::MetricsStateManager::LoadClientInfoCallback()); metrics_service_.reset(new metrics::MetricsService( metrics_state_.get(), &metrics_client_, &local_state_)); @@ -298,7 +299,7 @@ local_state_.SetBoolean(metrics::prefs::kStabilityExitedCleanly, false); metrics_state_ = metrics::MetricsStateManager::Create( &local_state_, new metrics::TestEnabledStateProvider(false, false), - base::string16(), metrics::MetricsStateManager::StoreClientInfoCallback(), + std::wstring(), metrics::MetricsStateManager::StoreClientInfoCallback(), metrics::MetricsStateManager::LoadClientInfoCallback()); metrics_service_.reset(new metrics::MetricsService( metrics_state_.get(), &metrics_client_, &local_state_)); @@ -338,7 +339,7 @@ local_state_.SetBoolean(metrics::prefs::kStabilityExitedCleanly, false); metrics_state_ = metrics::MetricsStateManager::Create( &local_state_, new metrics::TestEnabledStateProvider(false, false), - base::string16(), metrics::MetricsStateManager::StoreClientInfoCallback(), + std::wstring(), metrics::MetricsStateManager::StoreClientInfoCallback(), metrics::MetricsStateManager::LoadClientInfoCallback()); metrics_service_.reset(new metrics::MetricsService( metrics_state_.get(), &metrics_client_, &local_state_));
diff --git a/ios/chrome/browser/safe_browsing/BUILD.gn b/ios/chrome/browser/safe_browsing/BUILD.gn index 03fa7606..508929b 100644 --- a/ios/chrome/browser/safe_browsing/BUILD.gn +++ b/ios/chrome/browser/safe_browsing/BUILD.gn
@@ -9,6 +9,8 @@ sources = [ "chrome_password_protection_service.h", "chrome_password_protection_service.mm", + "chrome_password_protection_service_factory.h", + "chrome_password_protection_service_factory.mm", "pending_unsafe_resource_storage.h", "pending_unsafe_resource_storage.mm", "real_time_url_lookup_service_factory.h",
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h index 4622354..8309182 100644 --- a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h +++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h
@@ -8,6 +8,7 @@ #include <vector> #include "base/strings/string16.h" +#include "components/keyed_service/core/keyed_service.h" #include "components/password_manager/core/browser/password_reuse_detector.h" #include "components/safe_browsing/core/proto/csd.pb.h" #import "components/safe_browsing/ios/password_protection/password_protection_service.h" @@ -27,7 +28,8 @@ namespace safe_browsing { -class ChromePasswordProtectionService : public PasswordProtectionService { +class ChromePasswordProtectionService : public PasswordProtectionService, + public KeyedService { public: explicit ChromePasswordProtectionService(ChromeBrowserState* browser_state); ~ChromePasswordProtectionService() override;
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service_factory.h b/ios/chrome/browser/safe_browsing/chrome_password_protection_service_factory.h new file mode 100644 index 0000000..3f6a752 --- /dev/null +++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service_factory.h
@@ -0,0 +1,50 @@ +// Copyright 2021 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 IOS_CHROME_BROWSER_SAFE_BROWSING_CHROME_PASSWORD_PROTECTION_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_SAFE_BROWSING_CHROME_PASSWORD_PROTECTION_SERVICE_FACTORY_H_ + +#include <memory> + +#include "base/no_destructor.h" +#include "components/keyed_service/ios/browser_state_keyed_service_factory.h" + +class KeyedService; + +namespace safe_browsing { +class ChromePasswordProtectionService; +} + +namespace web { +class BrowserState; +} + +// Singleton that owns ChromePasswordProtectionService objects, one for each +// active BrowserState. +class ChromePasswordProtectionServiceFactory + : public BrowserStateKeyedServiceFactory { + public: + // Returns the instance of ChromePasswordProtectionService associated with + // this browser state, creating one if none exists. + static safe_browsing::ChromePasswordProtectionService* GetForBrowserState( + web::BrowserState* browser_state); + + // Returns the singleton instance of ChromePasswordProtectionServiceFactory. + static ChromePasswordProtectionServiceFactory* GetInstance(); + + private: + friend class base::NoDestructor<ChromePasswordProtectionServiceFactory>; + + ChromePasswordProtectionServiceFactory(); + ~ChromePasswordProtectionServiceFactory() override = default; + + // BrowserStateKeyedServiceFactory: + std::unique_ptr<KeyedService> BuildServiceInstanceFor( + web::BrowserState* browser_state) const override; + bool ServiceIsCreatedWithBrowserState() const override; + web::BrowserState* GetBrowserStateToUse(web::BrowserState*) const override; + bool ServiceIsNULLWhileTesting() const override; +}; + +#endif // IOS_CHROME_BROWSER_SAFE_BROWSING_CHROME_PASSWORD_PROTECTION_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service_factory.mm b/ios/chrome/browser/safe_browsing/chrome_password_protection_service_factory.mm new file mode 100644 index 0000000..c348c3d --- /dev/null +++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service_factory.mm
@@ -0,0 +1,62 @@ +// Copyright 2021 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 "ios/chrome/browser/safe_browsing/chrome_password_protection_service_factory.h" + +#include "components/keyed_service/ios/browser_state_dependency_manager.h" +#include "ios/chrome/browser/browser_state/browser_state_otr_helper.h" +#import "ios/chrome/browser/browser_state/chrome_browser_state.h" +#include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" +#import "ios/chrome/browser/safe_browsing/chrome_password_protection_service.h" +#include "ios/chrome/browser/sync/ios_user_event_service_factory.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +// static +safe_browsing::ChromePasswordProtectionService* +ChromePasswordProtectionServiceFactory::GetForBrowserState( + web::BrowserState* browser_state) { + return static_cast<safe_browsing::ChromePasswordProtectionService*>( + GetInstance()->GetServiceForBrowserState(browser_state, /*create=*/true)); +} + +// static +ChromePasswordProtectionServiceFactory* +ChromePasswordProtectionServiceFactory::GetInstance() { + static base::NoDestructor<ChromePasswordProtectionServiceFactory> instance; + return instance.get(); +} + +ChromePasswordProtectionServiceFactory::ChromePasswordProtectionServiceFactory() + : BrowserStateKeyedServiceFactory( + "ChromePasswordProtectionService", + BrowserStateDependencyManager::GetInstance()) { + DependsOn(IOSChromePasswordStoreFactory::GetInstance()); + DependsOn(IOSUserEventServiceFactory::GetInstance()); +} + +std::unique_ptr<KeyedService> +ChromePasswordProtectionServiceFactory::BuildServiceInstanceFor( + web::BrowserState* browser_state) const { + ChromeBrowserState* chrome_browser_state = + ChromeBrowserState::FromBrowserState(browser_state); + return std::make_unique<safe_browsing::ChromePasswordProtectionService>( + chrome_browser_state); +} + +bool ChromePasswordProtectionServiceFactory::ServiceIsCreatedWithBrowserState() + const { + return true; +} + +web::BrowserState* ChromePasswordProtectionServiceFactory::GetBrowserStateToUse( + web::BrowserState* context) const { + return GetBrowserStateOwnInstanceInIncognito(context); +} + +bool ChromePasswordProtectionServiceFactory::ServiceIsNULLWhileTesting() const { + return true; +}
diff --git a/ios/chrome/browser/ui/open_in/open_in_toolbar.mm b/ios/chrome/browser/ui/open_in/open_in_toolbar.mm index a260c7d6..c7d9de93 100644 --- a/ios/chrome/browser/ui/open_in/open_in_toolbar.mm +++ b/ios/chrome/browser/ui/open_in/open_in_toolbar.mm
@@ -40,6 +40,9 @@ // The line used as the border at the top of the toolbar. @property(nonatomic, strong, readonly) UIView* topBorder; +// The bottomAnchor constraint of the openButton. +@property(nonatomic, strong) NSLayoutConstraint* openButtonBottomConstraint; + @end @implementation OpenInToolbar @@ -107,9 +110,8 @@ return topBorder; } -#pragma mark UIView - -- (void)didMoveToSuperview { +// Helper to update constraints. +- (void)updateViewConstraints { if (!self.superview) return; NamedGuide* guide = [NamedGuide guideWithName:kSecondaryToolbarGuide @@ -119,14 +121,29 @@ [self.trailingAnchor constraintEqualToAnchor:self.superview.trailingAnchor], [self.bottomAnchor constraintEqualToAnchor:self.superview.bottomAnchor], ]]; + + self.openButtonBottomConstraint.active = NO; if (guide) { - [self.openButton.bottomAnchor constraintEqualToAnchor:guide.topAnchor] - .active = YES; + self.openButtonBottomConstraint = + [self.openButton.bottomAnchor constraintEqualToAnchor:guide.topAnchor]; } else { - [self.openButton.bottomAnchor - constraintEqualToAnchor:self.superview.safeAreaLayoutGuide.bottomAnchor] - .active = YES; + self.openButtonBottomConstraint = [self.openButton.bottomAnchor + constraintEqualToAnchor:self.superview.safeAreaLayoutGuide + .bottomAnchor]; } + self.self.openButtonBottomConstraint.active = YES; +} + +#pragma mark UIView + +- (void)didMoveToSuperview { + [super didMoveToSuperview]; + [self updateViewConstraints]; +} + +- (void)didMoveToWindow { + [super didMoveToWindow]; + [self updateViewConstraints]; } @end
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn index 2f199ec..3ba172b7 100644 --- a/ios/web/BUILD.gn +++ b/ios/web/BUILD.gn
@@ -38,6 +38,7 @@ ":js_resources", ":message_js", ":navigation_resources", + ":plugin_placeholder_js", ":resources", ":threads", "//base", @@ -647,7 +648,6 @@ sources = [ "js_messaging/resources/setup_frame.js", "web_state/js/resources/all_frames_document_end_web_bundle.js", - "web_state/js/resources/plugin_placeholder.js", ] } @@ -661,6 +661,13 @@ ] } +js_compile_bundle("plugin_placeholder_js") { + visibility = [ ":web" ] + closure_entry_point = "__crWeb.pluginPlaceholder" + + sources = [ "web_state/js/resources/plugin_placeholder.js" ] +} + js_compile_bundle("base_js") { visibility = [ ":web" ] closure_entry_point = "__crWeb.base"
diff --git a/ios/web/js_messaging/BUILD.gn b/ios/web/js_messaging/BUILD.gn index b9d75ea..d3e1f89 100644 --- a/ios/web/js_messaging/BUILD.gn +++ b/ios/web/js_messaging/BUILD.gn
@@ -85,6 +85,7 @@ "//base", "//ios/web/js_features/context_menu", "//ios/web/js_features/window_error", + "//ios/web/public", "//ios/web/public/js_messaging", ]
diff --git a/ios/web/js_messaging/java_script_feature.mm b/ios/web/js_messaging/java_script_feature.mm index d2f16585..0c1db3c61 100644 --- a/ios/web/js_messaging/java_script_feature.mm +++ b/ios/web/js_messaging/java_script_feature.mm
@@ -45,20 +45,27 @@ const std::string& filename, InjectionTime injection_time, TargetFrames target_frames, - ReinjectionBehavior reinjection_behavior) { + ReinjectionBehavior reinjection_behavior, + std::map<std::string, NSString*> replacements) { return JavaScriptFeature::FeatureScript(filename, injection_time, - target_frames, reinjection_behavior); + target_frames, reinjection_behavior, + replacements); } JavaScriptFeature::FeatureScript::FeatureScript( const std::string& filename, InjectionTime injection_time, TargetFrames target_frames, - ReinjectionBehavior reinjection_behavior) + ReinjectionBehavior reinjection_behavior, + std::map<std::string, NSString*> replacements) : script_filename_(filename), injection_time_(injection_time), target_frames_(target_frames), - reinjection_behavior_(reinjection_behavior) {} + reinjection_behavior_(reinjection_behavior), + replacements_(replacements) {} + +JavaScriptFeature::FeatureScript::FeatureScript(const FeatureScript& other) = + default; JavaScriptFeature::FeatureScript::~FeatureScript() = default; @@ -66,14 +73,25 @@ NSString* script_filename = base::SysUTF8ToNSString(script_filename_); if (reinjection_behavior_ == ReinjectionBehavior::kReinjectOnDocumentRecreation) { - return GetPageScript(script_filename); + return ReplacePlaceholders(GetPageScript(script_filename)); } // WKUserScript instances will automatically be re-injected by WebKit when the // document is re-created, even though the JavaScript context will not be // re-created. So the script needs to be wrapped in |MakeScriptInjectableOnce| // so that is is not re-injected. - return MakeScriptInjectableOnce(InjectionTokenForScript(script_filename), - GetPageScript(script_filename)); + return MakeScriptInjectableOnce( + InjectionTokenForScript(script_filename), + ReplacePlaceholders(GetPageScript(script_filename))); +} + +NSString* JavaScriptFeature::FeatureScript::ReplacePlaceholders( + NSString* script) const { + for (auto item : replacements_) { + script = [script + stringByReplacingOccurrencesOfString:base::SysUTF8ToNSString(item.first) + withString:item.second]; + } + return script; } #pragma mark - JavaScriptFeature
diff --git a/ios/web/js_messaging/java_script_feature_unittest.mm b/ios/web/js_messaging/java_script_feature_unittest.mm index ce22ea2..e450cf2 100644 --- a/ios/web/js_messaging/java_script_feature_unittest.mm +++ b/ios/web/js_messaging/java_script_feature_unittest.mm
@@ -6,6 +6,8 @@ #import <WebKit/WebKit.h> +#import "base/strings/sys_string_conversions.h" +#import "ios/web/js_messaging/page_script_util.h" #import "ios/web/public/test/js_test_util.h" #import "testing/gtest_mac.h" #import "testing/platform_test.h" @@ -149,6 +151,46 @@ feature_scripts[0].GetScriptString()); } +// Tests creating a JavaScriptFeature with replacements map. +TEST_F(JavaScriptFeatureTest, CreateFeatureWithPlaceholder) { + auto document_end_injection_time = + web::JavaScriptFeature::FeatureScript::InjectionTime::kDocumentEnd; + auto target_frames_all = + web::JavaScriptFeature::FeatureScript::TargetFrames::kAllFrames; + std::map<std::string, NSString*> replacements{ + {"$(PLUGIN_NOT_SUPPORTED_TEXT)", @"TEST_PLACEHOLDER_VALUE"}}; + + const web::JavaScriptFeature::FeatureScript feature_script = + web::JavaScriptFeature::FeatureScript::CreateWithFilename( + "plugin_placeholder_js", document_end_injection_time, + target_frames_all, + web::JavaScriptFeature::FeatureScript::ReinjectionBehavior:: + kReinjectOnDocumentRecreation, + replacements); + + auto any_content_world = + web::JavaScriptFeature::ContentWorld::kAnyContentWorld; + web::JavaScriptFeature feature(any_content_world, {feature_script}); + + EXPECT_EQ(any_content_world, feature.GetSupportedContentWorld()); + EXPECT_EQ(0ul, feature.GetDependentFeatures().size()); + auto feature_scripts = feature.GetScripts(); + ASSERT_EQ(1ul, feature_scripts.size()); + NSString* original_script = web::GetPageScript(@"plugin_placeholder_js"); + NSString* final_script = feature_scripts[0].GetScriptString(); + NSString* placeholder = base::SysUTF8ToNSString(replacements.begin()->first); + NSString* replacement = replacements.begin()->second; + + EXPECT_NSEQ(feature_script.GetScriptString(), final_script); + NSRange placeholder_range = [original_script rangeOfString:placeholder + options:NSLiteralSearch]; + EXPECT_TRUE(placeholder_range.location != NSNotFound); + EXPECT_FALSE([final_script containsString:placeholder]); + NSRange replacement_range = [final_script rangeOfString:replacement + options:NSLiteralSearch]; + EXPECT_EQ(placeholder_range.location, replacement_range.location); +} + // Tests creating a JavaScriptFeature which relies on a dependent feature. TEST_F(JavaScriptFeatureTest, CreateFeatureWithDependentFeature) { auto document_start_injection_time =
diff --git a/ios/web/js_messaging/java_script_feature_util_impl.mm b/ios/web/js_messaging/java_script_feature_util_impl.mm index 76d4846..c44eafc 100644 --- a/ios/web/js_messaging/java_script_feature_util_impl.mm +++ b/ios/web/js_messaging/java_script_feature_util_impl.mm
@@ -11,6 +11,7 @@ #include "ios/web/js_features/context_menu/context_menu_java_script_feature.h" #import "ios/web/js_features/window_error/window_error_java_script_feature.h" #include "ios/web/public/js_messaging/java_script_feature.h" +#import "ios/web/public/web_client.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -20,10 +21,21 @@ const char kBaseScriptName[] = "base_js"; const char kCommonScriptName[] = "common_js"; const char kMessageScriptName[] = "message_js"; +const char kPluginPlaceholderScriptName[] = "plugin_placeholder_js"; const char kMainFrameDescription[] = "Main frame"; const char kIframeDescription[] = "Iframe"; +// Returns a string with \ and ' escaped. +// This is used instead of GetQuotedJSONString because that will convert +// UTF-16 to UTF-8, which can cause problems when injecting scripts depending +// on the page encoding (see crbug.com/302741). +NSString* EscapedQuotedString(NSString* string) { + string = [string stringByReplacingOccurrencesOfString:@"\\" + withString:@"\\\\"]; + return [string stringByReplacingOccurrencesOfString:@"'" withString:@"\\'"]; +} + web::WindowErrorJavaScriptFeature* GetWindowErrorJavaScriptFeature() { // Static storage is ok for |window_error_feature| as it holds no state. static std::unique_ptr<web::WindowErrorJavaScriptFeature> @@ -53,6 +65,32 @@ return window_error_feature.get(); } +web::JavaScriptFeature* GetPluginPlaceholderJavaScriptFeature() { + // Static storage is ok for |plugin_placeholder_feature| as it holds no state. + static std::unique_ptr<web::JavaScriptFeature> plugin_placeholder_feature = + nullptr; + static dispatch_once_t once; + dispatch_once(&once, ^{ + std::map<std::string, NSString*> replacement_map{ + {"$(PLUGIN_NOT_SUPPORTED_TEXT)", + EscapedQuotedString(base::SysUTF16ToNSString( + web::GetWebClient()->GetPluginNotSupportedText()))}}; + std::vector<const web::JavaScriptFeature::FeatureScript> feature_scripts = { + web::JavaScriptFeature::FeatureScript::CreateWithFilename( + kPluginPlaceholderScriptName, + web::JavaScriptFeature::FeatureScript::InjectionTime::kDocumentEnd, + web::JavaScriptFeature::FeatureScript::TargetFrames::kAllFrames, + web::JavaScriptFeature::FeatureScript::ReinjectionBehavior:: + kReinjectOnDocumentRecreation, + replacement_map)}; + + plugin_placeholder_feature = std::make_unique<web::JavaScriptFeature>( + web::JavaScriptFeature::ContentWorld::kAnyContentWorld, + feature_scripts); + }); + return plugin_placeholder_feature.get(); +} + } // namespace namespace web { @@ -61,6 +99,7 @@ std::vector<JavaScriptFeature*> GetBuiltInJavaScriptFeatures( BrowserState* browser_state) { return {ContextMenuJavaScriptFeature::FromBrowserState(browser_state), + GetPluginPlaceholderJavaScriptFeature(), GetWindowErrorJavaScriptFeature()}; }
diff --git a/ios/web/js_messaging/page_script_util.mm b/ios/web/js_messaging/page_script_util.mm index 921ea59..5008291 100644 --- a/ios/web/js_messaging/page_script_util.mm +++ b/ios/web/js_messaging/page_script_util.mm
@@ -16,20 +16,6 @@ #error "This file requires ARC support." #endif -namespace { - -// Returns a string with \ and ' escaped. -// This is used instead of GetQuotedJSONString because that will convert -// UTF-16 to UTF-8, which can cause problems when injecting scripts depending -// on the page encoding (see crbug.com/302741). -NSString* EscapedQuotedString(NSString* string) { - string = [string stringByReplacingOccurrencesOfString:@"\\" - withString:@"\\\\"]; - return [string stringByReplacingOccurrencesOfString:@"'" withString:@"\\'"]; -} - -} // namespace - namespace web { NSString* GetPageScript(NSString* script_file_name) { @@ -107,15 +93,8 @@ } NSString* GetDocumentEndScriptForAllFrames(BrowserState* browser_state) { - NSString* plugin_not_supported_text = - base::SysUTF16ToNSString(GetWebClient()->GetPluginNotSupportedText()); - - NSString* script = [GetPageScript(@"all_frames_document_end_web_bundle") - stringByReplacingOccurrencesOfString:@"$(PLUGIN_NOT_SUPPORTED_TEXT)" - withString:EscapedQuotedString( - plugin_not_supported_text)]; - - return MakeScriptInjectableOnce(@"end_all_frames", script); + return MakeScriptInjectableOnce( + @"end_all_frames", GetPageScript(@"all_frames_document_end_web_bundle")); } } // namespace web
diff --git a/ios/web/public/js_messaging/java_script_feature.h b/ios/web/public/js_messaging/java_script_feature.h index 784188f..74f900b 100644 --- a/ios/web/public/js_messaging/java_script_feature.h +++ b/ios/web/public/js_messaging/java_script_feature.h
@@ -76,13 +76,18 @@ // Creates a FeatureScript with the script file from the application bundle // with |filename| to be injected at |injection_time| into |target_frames| - // using |reinjection_behavior|. + // using |reinjection_behavior|. If |replacements| is provided, it will be + // used to replace placeholder with the corresponding string values. static FeatureScript CreateWithFilename( const std::string& filename, InjectionTime injection_time, TargetFrames target_frames, ReinjectionBehavior reinjection_behavior = - ReinjectionBehavior::kInjectOncePerWindow); + ReinjectionBehavior::kInjectOncePerWindow, + std::map<std::string, NSString*> replacements = + std::map<std::string, NSString*>()); + + FeatureScript(const FeatureScript& other); // Returns the JavaScript string of the script with |script_filename_|. NSString* GetScriptString() const; @@ -96,12 +101,18 @@ FeatureScript(const std::string& filename, InjectionTime injection_time, TargetFrames target_frames, - ReinjectionBehavior reinjection_behavior); + ReinjectionBehavior reinjection_behavior, + std::map<std::string, NSString*> replacements); + + // Returns the given |script| string after swapping the placeholders from + // |replacements_| with their values. + NSString* ReplacePlaceholders(NSString* script) const; std::string script_filename_; InjectionTime injection_time_; TargetFrames target_frames_; ReinjectionBehavior reinjection_behavior_; + std::map<std::string, NSString*> replacements_; }; JavaScriptFeature(ContentWorld supported_world,
diff --git a/ios/web/web_state/js/resources/all_frames_document_end_web_bundle.js b/ios/web/web_state/js/resources/all_frames_document_end_web_bundle.js index 3e11f329..6702a9f 100644 --- a/ios/web/web_state/js/resources/all_frames_document_end_web_bundle.js +++ b/ios/web/web_state/js/resources/all_frames_document_end_web_bundle.js
@@ -5,5 +5,4 @@ // Set of scripts injected into WKWebView at Document End. goog.provide('__crWeb.allFramesDocumentEndWebBundle'); -goog.require('__crWeb.pluginPlaceholder'); goog.require('__crWeb.setupFrame');
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index bf944a5..4fb87bad9 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -3619,8 +3619,8 @@ } else if (is_background_status_change_cancelled_) { // Only trigger updates when we don't have one already scheduled. update_background_status_cb_.Reset( - base::Bind(&WebMediaPlayerImpl::DisableVideoTrackIfNeeded, - base::Unretained(this))); + base::BindOnce(&WebMediaPlayerImpl::DisableVideoTrackIfNeeded, + base::Unretained(this))); is_background_status_change_cancelled_ = false; // Defer disable track until we're sure the clip will be backgrounded for
diff --git a/media/gpu/av1_decoder.cc b/media/gpu/av1_decoder.cc index e0471ca..bae7137 100644 --- a/media/gpu/av1_decoder.cc +++ b/media/gpu/av1_decoder.cc
@@ -227,12 +227,6 @@ return kDecodeError; } #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) - if (current_sequence_header_->film_grain_params_present) { - // TODO(b/176927551): Decode film grain streams on ChromeOS once the - // issue is fixed. - DVLOG(1) << "Film grain streams are not supported"; - return kDecodeError; - } if (new_bit_depth != 8u) { // TODO(b/174722425): Decode 10 bits streams once it is fixed. DVLOG(1) << "10 and 12 bits streams are not supported"; @@ -497,9 +491,10 @@ size_t AV1Decoder::GetRequiredNumOfPictures() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // TODO(hiroh): Double this value in the case of film grain sequence. constexpr size_t kPicsInPipeline = limits::kMaxVideoFrames + 1; - return kPicsInPipeline + GetNumReferenceFrames(); + DCHECK(current_sequence_header_); + return (kPicsInPipeline + GetNumReferenceFrames()) * + (1 + current_sequence_header_->film_grain_params_present); } size_t AV1Decoder::GetNumReferenceFrames() const {
diff --git a/media/gpu/av1_decoder_unittest.cc b/media/gpu/av1_decoder_unittest.cc index c26a7197..3163cb661 100644 --- a/media/gpu/av1_decoder_unittest.cc +++ b/media/gpu/av1_decoder_unittest.cc
@@ -472,13 +472,6 @@ const std::string kFilmGrainStream("av1-film_grain.ivf"); std::vector<scoped_refptr<DecoderBuffer>> buffers = ReadIVF(kFilmGrainStream); ASSERT_FALSE(buffers.empty()); -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) - std::vector<DecodeResult> expected = {DecodeResult::kDecodeError}; - EXPECT_EQ(Decode(buffers[0]), expected); - // Once AV1Decoder gets into an error state, Decode() returns kDecodeError - // until Reset(). - EXPECT_EQ(Decode(buffers[0]), expected); -#else constexpr size_t kDecodedFrames = 11; constexpr size_t kOutputFrames = 10; constexpr gfx::Size kFrameSize(352, 288); @@ -511,7 +504,6 @@ expected.push_back(DecodeResult::kRanOutOfStreamData); } EXPECT_EQ(results, expected); -#endif } // TODO(b/175895249): Test in isolation each of the conditions that trigger a
diff --git a/media/gpu/test/video_encoder/bitstream_validator.cc b/media/gpu/test/video_encoder/bitstream_validator.cc index 4208a4fd..9f1a7756 100644 --- a/media/gpu/test/video_encoder/bitstream_validator.cc +++ b/media/gpu/test/video_encoder/bitstream_validator.cc
@@ -115,7 +115,8 @@ validator_thread_("BitstreamValidatorThread"), validator_cv_(&validator_lock_), num_buffers_validating_(0), - decode_error_(false) { + decode_error_(false), + waiting_flush_done_(false) { DETACH_FROM_SEQUENCE(validator_sequence_checker_); DETACH_FROM_SEQUENCE(validator_thread_sequence_checker_); } @@ -133,6 +134,9 @@ void BitstreamValidator::ProcessBitstream(scoped_refptr<BitstreamRef> bitstream, size_t frame_index) { DCHECK_CALLED_ON_VALID_SEQUENCE(validator_sequence_checker_); + LOG_ASSERT(frame_index <= last_frame_index_) + << "frame_index is larger than last frame index, frame_index=" + << frame_index << ", last_frame_index_=" << last_frame_index_; base::AutoLock lock(validator_lock_); // If many pending buffers are accumulated in this validator class and the // allocated memory size becomes large, the test process is killed by the @@ -159,6 +163,16 @@ const bool should_decode = !num_vp9_temporal_layers_to_decode_ || (bitstream->metadata.vp9->temporal_idx < *num_vp9_temporal_layers_to_decode_); + const bool should_flush = frame_index == last_frame_index_; + + if (should_flush) { + // |waiting_flush_done_| should be set before calling Decode() as + // VideoDecoder::OutputCB (here, VerifyOutputFrame) might be called + // synchronously. + base::AutoLock lock(validator_lock_); + waiting_flush_done_ = true; + } + if (should_decode) { scoped_refptr<DecoderBuffer> buffer = bitstream->buffer; int64_t timestamp = buffer->timestamp().InMicroseconds(); @@ -176,7 +190,8 @@ num_buffers_validating_--; validator_cv_.Signal(); } - if (frame_index == last_frame_index_) { + + if (should_flush) { // Flush pending buffers. decoder_->Decode(DecoderBuffer::CreateEOSBuffer(), base::BindOnce(&BitstreamValidator::DecodeDone, @@ -195,6 +210,9 @@ } } if (timestamp == kEOSTimeStamp) { + base::AutoLock lock(validator_lock_); + waiting_flush_done_ = false; + validator_cv_.Signal(); return; } @@ -245,7 +263,7 @@ bool BitstreamValidator::WaitUntilDone() { base::AutoLock auto_lock(validator_lock_); - while (num_buffers_validating_ > 0) + while (num_buffers_validating_ > 0 || waiting_flush_done_) validator_cv_.Wait(); bool success = true;
diff --git a/media/gpu/test/video_encoder/bitstream_validator.h b/media/gpu/test/video_encoder/bitstream_validator.h index cd364d1..d63994f 100644 --- a/media/gpu/test/video_encoder/bitstream_validator.h +++ b/media/gpu/test/video_encoder/bitstream_validator.h
@@ -94,6 +94,8 @@ size_t num_buffers_validating_ GUARDED_BY(validator_lock_); // True if |decoder_| detects an error while decoding bitstreams. bool decode_error_ GUARDED_BY(validator_lock_); + // True if a flush is being processed. + bool waiting_flush_done_ GUARDED_BY(validator_lock_); SEQUENCE_CHECKER(validator_sequence_checker_); SEQUENCE_CHECKER(validator_thread_sequence_checker_);
diff --git a/media/gpu/vaapi/vp8_vaapi_video_decoder_delegate.cc b/media/gpu/vaapi/vp8_vaapi_video_decoder_delegate.cc index 6553199..a202817 100644 --- a/media/gpu/vaapi/vp8_vaapi_video_decoder_delegate.cc +++ b/media/gpu/vaapi/vp8_vaapi_video_decoder_delegate.cc
@@ -115,7 +115,8 @@ void VP8VaapiVideoDecoderDelegate::OnVAContextDestructionSoon() { // Destroy the member ScopedVABuffers below since they refer to a VAContextID - // that will be destroyed soon. iq_matrix_.reset(); + // that will be destroyed soon. + iq_matrix_.reset(); prob_buffer_.reset(); picture_params_.reset(); slice_params_.reset();
diff --git a/net/base/port_util.cc b/net/base/port_util.cc index b5614fe..6e4cd988 100644 --- a/net/base/port_util.cc +++ b/net/base/port_util.cc
@@ -7,7 +7,9 @@ #include <limits> #include <set> +#include "base/containers/fixed_flat_map.h" #include "base/lazy_instance.h" +#include "base/metrics/histogram_functions.h" #include "base/notreached.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" @@ -17,6 +19,47 @@ namespace { +// Records ports newly blocked in https://github.com/whatwg/fetch/pull/1148 for +// "NAT Slipstreaming v2.0" vulnerability, plus 10080, to measure the breakage +// from blocking them. Every other port is logged as kOther to provide a +// baseline. See also https://samy.pl/slipstream/. Ports are logged regardless +// of protocol and whether they are blocked or not. +// TODO(ricea): Remove this in April 2021. +void LogSlipstreamRestrictedPort(int port) { + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + enum class SlipstreamPort { + kOther = 0, + k69 = 1, + k137 = 2, + k161 = 3, + k554 = 4, + k1719 = 5, + k1720 = 6, + k1723 = 7, + k6566 = 8, + k10080 = 9, + kMaxValue = k10080, + }; + + constexpr auto kMap = base::MakeFixedFlatMap<int, SlipstreamPort>({ + {69, SlipstreamPort::k69}, + {137, SlipstreamPort::k137}, + {161, SlipstreamPort::k161}, + {554, SlipstreamPort::k554}, + {1719, SlipstreamPort::k1719}, + {1720, SlipstreamPort::k1720}, + {1723, SlipstreamPort::k1723}, + {6566, SlipstreamPort::k6566}, + {10080, SlipstreamPort::k10080}, + }); + + auto* it = kMap.find(port); + SlipstreamPort as_enum = + it == kMap.end() ? SlipstreamPort::kOther : it->second; + base::UmaHistogramEnumeration("Net.Port.SlipstreamRestricted", as_enum); +} + // The general list of blocked ports. Will be blocked unless a specific // protocol overrides it. (Ex: ftp can use port 21) const int kRestrictedPorts[] = { @@ -116,7 +159,9 @@ if (!IsPortValid(port)) return false; - // Allow explitly allowed ports for any scheme. + LogSlipstreamRestrictedPort(port); + + // Allow explicitly allowed ports for any scheme. if (g_explicitly_allowed_ports.Get().count(port) > 0) return true;
diff --git a/net/quic/crypto/proof_verifier_chromium.cc b/net/quic/crypto/proof_verifier_chromium.cc index 1a198cb8..43de092 100644 --- a/net/quic/crypto/proof_verifier_chromium.cc +++ b/net/quic/crypto/proof_verifier_chromium.cc
@@ -225,7 +225,7 @@ return quic::QUIC_FAILURE; } - verify_details_.reset(new ProofVerifyDetailsChromium); + verify_details_ = std::make_unique<ProofVerifyDetailsChromium>(); // Converts |certs| to |cert_|. if (!GetX509Certificate(certs, error_details, verify_details)) @@ -267,7 +267,7 @@ return quic::QUIC_FAILURE; } - verify_details_.reset(new ProofVerifyDetailsChromium); + verify_details_ = std::make_unique<ProofVerifyDetailsChromium>(); // Converts |certs| to |cert_|. if (!GetX509Certificate(certs, error_details, verify_details))
diff --git a/net/quic/mock_crypto_client_stream_factory.cc b/net/quic/mock_crypto_client_stream_factory.cc index 47702de..b2c97a2 100644 --- a/net/quic/mock_crypto_client_stream_factory.cc +++ b/net/quic/mock_crypto_client_stream_factory.cc
@@ -21,7 +21,7 @@ use_mock_crypter_(false) {} void MockCryptoClientStreamFactory::SetConfig(const quic::QuicConfig& config) { - config_.reset(new quic::QuicConfig(config)); + config_ = std::make_unique<quic::QuicConfig>(config); } quic::QuicCryptoClientStream*
diff --git a/net/quic/mock_quic_data.cc b/net/quic/mock_quic_data.cc index d1b5cbc..c6f3af3 100644 --- a/net/quic/mock_quic_data.cc +++ b/net/quic/mock_quic_data.cc
@@ -14,7 +14,7 @@ MockQuicData::~MockQuicData() {} void MockQuicData::AddConnect(IoMode mode, int rv) { - connect_.reset(new MockConnect(mode, rv)); + connect_ = std::make_unique<MockConnect>(mode, rv); } void MockQuicData::AddRead(IoMode mode, @@ -62,7 +62,7 @@ } SequencedSocketData* MockQuicData::InitializeAndGetSequencedSocketData() { - socket_data_.reset(new SequencedSocketData(reads_, writes_)); + socket_data_ = std::make_unique<SequencedSocketData>(reads_, writes_); socket_data_->set_printer(&printer_); if (connect_ != nullptr) socket_data_->set_connect_data(*connect_);
diff --git a/net/quic/platform/impl/quic_linux_socket_utils.h b/net/quic/platform/impl/quic_linux_socket_utils.h index 41ae64f..7f6e7f16 100644 --- a/net/quic/platform/impl/quic_linux_socket_utils.h +++ b/net/quic/platform/impl/quic_linux_socket_utils.h
@@ -98,7 +98,7 @@ return; } - storage_.reset(new char[StorageSize()]); + storage_ = std::make_unique<char[]>(StorageSize()); memset(&storage_[0], 0, StorageSize()); int i = -1;
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc index 72beb4d..4b058920 100644 --- a/net/quic/quic_stream_factory.cc +++ b/net/quic/quic_stream_factory.cc
@@ -1737,12 +1737,13 @@ } if (!helper_.get()) { - helper_.reset(new QuicChromiumConnectionHelper(clock_, random_generator_)); + helper_ = std::make_unique<QuicChromiumConnectionHelper>(clock_, + random_generator_); } if (!alarm_factory_.get()) { - alarm_factory_.reset(new QuicChromiumAlarmFactory( - base::ThreadTaskRunnerHandle::Get().get(), clock_)); + alarm_factory_ = std::make_unique<QuicChromiumAlarmFactory>( + base::ThreadTaskRunnerHandle::Get().get(), clock_); } quic::QuicConnectionId connection_id =
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc index b0e11e2..1b55a8c 100644 --- a/pdf/out_of_process_instance.cc +++ b/pdf/out_of_process_instance.cc
@@ -74,7 +74,6 @@ #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/vector2d.h" -#include "ui/gfx/skia_util.h" #include "url/gurl.h" namespace chrome_pdf { @@ -761,7 +760,7 @@ } else if (type == kJSLoadPreviewPageType) { HandleLoadPreviewPageMessage(dict); } else if (type == kJSStopScrollingType) { - stop_scrolling_ = true; + set_stop_scrolling(true); } else if (type == kJSGetThumbnailType) { HandleGetThumbnailMessage(dict); } else { @@ -835,39 +834,10 @@ } void OutOfProcessInstance::DidChangeView(const pp::View& view) { - gfx::Rect view_rect = RectFromPPRect(view.GetRect()); - float old_device_scale = device_scale(); - float new_device_scale = view.GetDeviceScale(); - gfx::Size view_device_size(view_rect.width() * new_device_scale, - view_rect.height() * new_device_scale); + UpdateGeometryOnViewChanged(RectFromPPRect(view.GetRect()), + view.GetDeviceScale()); - if (view_device_size != plugin_size() || new_device_scale != device_scale() || - view_rect.origin() != plugin_offset()) { - set_device_scale(new_device_scale); - set_plugin_dip_size(view_rect.size()); - set_plugin_size(view_device_size); - set_plugin_offset(view_rect.origin()); - - paint_manager().SetSize(view_device_size, device_scale()); - - const gfx::Size old_image_data_size = - gfx::SkISizeToSize(image_data().dimensions()); - gfx::Size new_image_data_size = - PaintManager::GetNewContextSize(old_image_data_size, plugin_size()); - if (new_image_data_size != old_image_data_size) { - InitImageData(new_image_data_size); - set_first_paint(true); - } - - if (image_data().drawsNothing()) { - DCHECK(plugin_size().IsEmpty()); - return; - } - - OnGeometryChanged(zoom(), old_device_scale); - } - - if (is_print_preview_ && !stop_scrolling_) { + if (is_print_preview_ && !stop_scrolling()) { scroll_position_ = PointFromPPPoint(view.GetScrollOffset()); UpdateScroll(); } @@ -877,7 +847,7 @@ } void OutOfProcessInstance::UpdateScroll() { - DCHECK(!stop_scrolling_); + DCHECK(!stop_scrolling()); gfx::PointF scroll_position_float(scroll_position_.x(), scroll_position_.y()); scroll_position_float = BoundScrollPositionToDocument(scroll_position_float); engine()->ScrolledToXPosition(scroll_position_float.x() * device_scale()); @@ -1773,7 +1743,7 @@ return; } - if (stop_scrolling_) { + if (stop_scrolling()) { return; } @@ -1802,7 +1772,7 @@ return; } set_received_viewport_message(true); - stop_scrolling_ = false; + set_stop_scrolling(false); PinchPhase pinch_phase = static_cast<PinchPhase>(dict.Get(pp::Var(kJSPinchPhase)).AsInt()); double new_zoom = dict.Get(pp::Var(kJSZoom)).AsDouble(); @@ -1812,8 +1782,8 @@ dict.Get(pp::Var(kJSYOffset)).AsDouble()); if (pinch_phase == PINCH_START) { - scroll_position_at_last_raster_ = scroll_position; - last_bitmap_smaller_ = false; + set_scroll_position_at_last_raster(scroll_position); + set_last_bitmap_smaller(false); set_needs_reraster(false); return; } @@ -1853,11 +1823,11 @@ paint_offset = gfx::Vector2d(0, (1 - zoom_ratio) * pinch_center.y()); scroll_delta = gfx::Vector2d(0, (scroll_position.y() - - scroll_position_at_last_raster_.y() * zoom_ratio)); + scroll_position_at_last_raster().y() * zoom_ratio)); pinch_vector = gfx::Vector2d(); - last_bitmap_smaller_ = true; - } else if (last_bitmap_smaller_) { + set_last_bitmap_smaller(true); + } else if (last_bitmap_smaller()) { pinch_center = pp::Point((plugin_size().width() / device_scale()) / 2, (plugin_size().height() / device_scale()) / 2); const double zoom_when_doc_covers_plugin_width = @@ -1868,9 +1838,9 @@ pinch_vector = gfx::Vector2d(); scroll_delta = gfx::Vector2d((scroll_position.x() - - scroll_position_at_last_raster_.x() * zoom_ratio), + scroll_position_at_last_raster().x() * zoom_ratio), (scroll_position.y() - - scroll_position_at_last_raster_.y() * zoom_ratio)); + scroll_position_at_last_raster().y() * zoom_ratio)); } paint_manager().SetTransform(zoom_ratio, PointFromPPPoint(pinch_center), @@ -1886,13 +1856,13 @@ // On pinch end the scale is again 1.f and we request a reraster // in the new position. paint_manager().ClearTransform(); - last_bitmap_smaller_ = false; + set_last_bitmap_smaller(false); set_needs_reraster(true); - // If we're rerastering due to zooming out, we need to update - // |scroll_position_at_last_raster_|, in case the user continues the - // gesture by zooming in. - scroll_position_at_last_raster_ = scroll_position; + // If we're rerastering due to zooming out, we need to update the scroll + // position for the last raster, in case the user continues the gesture by + // zooming in. + set_scroll_position_at_last_raster(scroll_position); } // Bound the input parameters.
diff --git a/pdf/out_of_process_instance.h b/pdf/out_of_process_instance.h index 324c70c..11ae2e4b 100644 --- a/pdf/out_of_process_instance.h +++ b/pdf/out_of_process_instance.h
@@ -338,11 +338,6 @@ PINCH_END = 4 }; - // The scroll position for the last raster, before any transformations are - // applied. - gfx::PointF scroll_position_at_last_raster_; - // True if last bitmap was smaller than screen. - bool last_bitmap_smaller_ = false; // True if the plugin is full-page. bool full_ = false; @@ -436,11 +431,6 @@ // document finishes loading. bool did_call_start_loading_ = false; - // If this is true, then don't scroll the plugin in response to DidChangeView - // messages. This will be true when the extension page is in the process of - // zooming the plugin so that flickering doesn't occur while zooming. - bool stop_scrolling_ = false; - bool edit_mode_ = false; // The current state of accessibility: either off, enabled but waiting
diff --git a/pdf/pdf_view_plugin_base.cc b/pdf/pdf_view_plugin_base.cc index fa0d00c..512bb69 100644 --- a/pdf/pdf_view_plugin_base.cc +++ b/pdf/pdf_view_plugin_base.cc
@@ -33,6 +33,7 @@ #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/size.h" #include "ui/gfx/skia_util.h" namespace chrome_pdf { @@ -155,6 +156,43 @@ 0); } +void PdfViewPluginBase::UpdateGeometryOnViewChanged( + const gfx::Rect& new_view_rect, + float new_device_scale) { + const gfx::Size view_device_size(new_view_rect.width() * new_device_scale, + new_view_rect.height() * new_device_scale); + + if (view_device_size == plugin_size_ && new_device_scale == device_scale_ && + new_view_rect.origin() == plugin_offset_) { + return; + } + + const float old_device_scale = device_scale_; + device_scale_ = new_device_scale; + plugin_dip_size_ = new_view_rect.size(); + plugin_size_ = view_device_size; + plugin_offset_ = new_view_rect.origin(); + + paint_manager().SetSize(plugin_size_, device_scale_); + + // Initialize the image data buffer if the context size changes. + const gfx::Size old_image_size = gfx::SkISizeToSize(image_data_.dimensions()); + const gfx::Size new_image_size = + PaintManager::GetNewContextSize(old_image_size, plugin_size_); + if (new_image_size != old_image_size) { + InitImageData(new_image_size); + first_paint_ = true; + } + + // Skip updating the geometry if the new image data buffer is empty. + if (image_data_.drawsNothing()) { + DCHECK(plugin_size_.IsEmpty()); + return; + } + + OnGeometryChanged(zoom_, old_device_scale); +} + Image PdfViewPluginBase::GetPluginImageData() const { return Image(image_data_); }
diff --git a/pdf/pdf_view_plugin_base.h b/pdf/pdf_view_plugin_base.h index 23366b95..07b3ad1f 100644 --- a/pdf/pdf_view_plugin_base.h +++ b/pdf/pdf_view_plugin_base.h
@@ -110,6 +110,11 @@ // Returns the plugin-specific image data buffer. virtual Image GetPluginImageData() const; + // Updates the geometry of the plugin and its image data if the view's + // size or scale has changed. + void UpdateGeometryOnViewChanged(const gfx::Rect& new_view_rect, + float new_device_scale); + // A helper of OnGeometryChanged() which updates the available area and // the background parts, and notifies the PDF engine of geometry changes. void RecalculateAreas(double old_zoom, float old_device_scale); @@ -132,13 +137,10 @@ void set_document_size(const gfx::Size& size) { document_size_ = size; } const gfx::Size& plugin_size() const { return plugin_size_; } - void set_plugin_size(const gfx::Size& size) { plugin_size_ = size; } const gfx::Size& plugin_dip_size() const { return plugin_dip_size_; } - void set_plugin_dip_size(const gfx::Size& size) { plugin_dip_size_ = size; } const gfx::Point& plugin_offset() const { return plugin_offset_; } - void set_plugin_offset(const gfx::Point& offset) { plugin_offset_ = offset; } void SetBackgroundColor(SkColor background_color) { background_color_ = background_color; @@ -150,14 +152,28 @@ double zoom() const { return zoom_; } float device_scale() const { return device_scale_; } - void set_device_scale(float device_scale) { device_scale_ = device_scale; } - void set_first_paint(bool first_paint) { first_paint_ = first_paint; } + bool last_bitmap_smaller() const { return last_bitmap_smaller_; } + void set_last_bitmap_smaller(bool last_bitmap_smaller) { + last_bitmap_smaller_ = last_bitmap_smaller; + } void set_needs_reraster(bool needs_reraster) { needs_reraster_ = needs_reraster; } + const gfx::PointF& scroll_position_at_last_raster() const { + return scroll_position_at_last_raster_; + } + void set_scroll_position_at_last_raster(const gfx::PointF& scroll_position) { + scroll_position_at_last_raster_ = scroll_position; + } + + bool stop_scrolling() const { return stop_scrolling_; } + void set_stop_scrolling(bool stop_scrolling) { + stop_scrolling_ = stop_scrolling; + } + void set_received_viewport_message(bool received) { received_viewport_message_ = received; } @@ -232,9 +248,22 @@ // Whether OnPaint() is in progress or not. bool in_paint_ = false; + // True if last bitmap was smaller than the screen. + bool last_bitmap_smaller_ = false; + // True if we request a new bitmap rendering. bool needs_reraster_ = true; + // The scroll position for the last raster, before any transformations are + // applied. + gfx::PointF scroll_position_at_last_raster_; + + // If this is true, then don't scroll the plugin in response to the messages + // from DidChangeView() or HandleUpdateScrollMessage(). This will be true when + // the extension page is in the process of zooming the plugin so that + // flickering doesn't occur while zooming. + bool stop_scrolling_ = false; + // Whether the plugin has received a viewport changed message. Nothing should // be painted until this is received. bool received_viewport_message_ = false;
diff --git a/pdf/pdf_view_web_plugin.cc b/pdf/pdf_view_web_plugin.cc index 0f3cd12f..2e6961dc 100644 --- a/pdf/pdf_view_web_plugin.cc +++ b/pdf/pdf_view_web_plugin.cc
@@ -416,4 +416,12 @@ // accessibility information in the viewport. } +void PdfViewWebPlugin::OnViewportChanged(gfx::Rect view_rect, + float new_device_scale) { + UpdateGeometryOnViewChanged(view_rect, new_device_scale); + + // TODO(http://crbug.com/1099020): Update scroll position for painting the + // print preview plugin. +} + } // namespace chrome_pdf
diff --git a/pdf/pdf_view_web_plugin.h b/pdf/pdf_view_web_plugin.h index 2310a74..9516af7 100644 --- a/pdf/pdf_view_web_plugin.h +++ b/pdf/pdf_view_web_plugin.h
@@ -144,6 +144,8 @@ // Call `Destroy()` instead. ~PdfViewWebPlugin() override; + void OnViewportChanged(gfx::Rect view_rect, float new_device_scale); + blink::WebPluginParams initial_params_; blink::WebPluginContainer* container_ = nullptr;
diff --git a/printing/backend/cups_helper.cc b/printing/backend/cups_helper.cc index 8b261a61..215146a 100644 --- a/printing/backend/cups_helper.cc +++ b/printing/backend/cups_helper.cc
@@ -602,6 +602,8 @@ return false; } + if (fflush(ppd_file.handle())) + return false; if (fseek(ppd_file.handle(), 0, SEEK_SET) != 0) return false;
diff --git a/sandbox/policy/win/sandbox_win.cc b/sandbox/policy/win/sandbox_win.cc index 5bbd4042..8cecfab 100644 --- a/sandbox/policy/win/sandbox_win.cc +++ b/sandbox/policy/win/sandbox_win.cc
@@ -976,7 +976,7 @@ // CET is enabled with the CETCOMPAT bit on chrome.exe so must be // disabled for processes we know are not compatible. if (!delegate->CetCompatible()) - mitigations |= sandbox::MITIGATION_CET_DISABLED; + mitigations |= MITIGATION_CET_DISABLED; ResultCode result = policy->SetProcessMitigations(mitigations); if (result != SBOX_ALL_OK)
diff --git a/services/network/public/mojom/client_security_state.mojom b/services/network/public/mojom/client_security_state.mojom index 283446a..38c70be 100644 --- a/services/network/public/mojom/client_security_state.mojom +++ b/services/network/public/mojom/client_security_state.mojom
@@ -20,6 +20,10 @@ // Forbid requests to more-private address spaces than that of the initiator, // when the initiator is not in a secure context. kBlockFromInsecureToMorePrivate, + + // Warn about requests to more-private address spaces than that of the + // initiator when the initiator is not in a secure context. + kWarnFromInsecureToMorePrivate, }; struct ClientSecurityState {
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom index 001b134..b33b713b 100644 --- a/services/network/public/mojom/network_service.mojom +++ b/services/network/public/mojom/network_service.mojom
@@ -83,6 +83,21 @@ string? raw_response_headers, IPAddressSpace resource_address_space); + // Called to send information about a private network request that was blocked + // (then |is_warning| is false), or will be blocked in the future (then + // |is_warning| is true). It is possible to share sensitive information with + // DevTools as this is handled in the browser process. Called even when + // |devtool_request_id| is not available to the URLLoader to ensure the + // information can be recorded even when DevTools is closed. + OnPrivateNetworkRequest( + int32 process_id, + int32 routing_id, + string? devtool_request_id, + url.mojom.Url url, + bool is_warning, + IPAddressSpace resource_address_space, + ClientSecurityState client_security_state); + // Called to send the CORS preflight request information. Only called when // |devtool_request_id| is available on the original request. OnCorsPreflightRequest(
diff --git a/services/network/test/test_network_service_client.cc b/services/network/test/test_network_service_client.cc index 74f21d2..582b0cb 100644 --- a/services/network/test/test_network_service_client.cc +++ b/services/network/test/test_network_service_client.cc
@@ -46,6 +46,15 @@ const base::Optional<std::string>& raw_response_headers, network::mojom::IPAddressSpace resource_address_space) {} +void TestNetworkServiceClient::OnPrivateNetworkRequest( + int32_t process_id, + int32_t routing_id, + const base::Optional<std::string>& devtools_request_id, + const GURL& url, + bool is_warning, + network::mojom::IPAddressSpace resource_address_space, + network::mojom::ClientSecurityStatePtr client_security_state) {} + void TestNetworkServiceClient::OnCorsPreflightRequest( int32_t process_id, int32_t routing_id,
diff --git a/services/network/test/test_network_service_client.h b/services/network/test/test_network_service_client.h index 26983b7..bd01f45 100644 --- a/services/network/test/test_network_service_client.h +++ b/services/network/test/test_network_service_client.h
@@ -47,6 +47,14 @@ std::vector<network::mojom::HttpRawHeaderPairPtr> headers, const base::Optional<std::string>& raw_response_headers, network::mojom::IPAddressSpace resource_address_space) override; + void OnPrivateNetworkRequest( + int32_t process_id, + int32_t routing_id, + const base::Optional<std::string>& devtools_request_id, + const GURL& url, + bool is_warning, + network::mojom::IPAddressSpace resource_address_space, + network::mojom::ClientSecurityStatePtr client_security_state) override; void OnCorsPreflightRequest( int32_t process_id, int32_t routing_id,
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc index 350a57c5..a6ea05b 100644 --- a/services/network/url_loader.cc +++ b/services/network/url_loader.cc
@@ -1043,23 +1043,35 @@ << ", private_network_request_policy: " << security_state->private_network_request_policy << " }."; + bool is_warning = false; // We use a switch statement to force this code to be amended when values are // added to the PrivateNetworkRequestPolicy enum. switch (security_state->private_network_request_policy) { case mojom::PrivateNetworkRequestPolicy::kAllow: + DVLOG(1) << "CORS-RFC1918 check: unconditionally allowed."; + return true; + case mojom::PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate: + is_warning = true; break; case mojom::PrivateNetworkRequestPolicy::kBlockFromInsecureToMorePrivate: - // We block requests from insecure contexts to resources in IP address - // spaces more private than that of the initiator. This prevents malicious - // insecure public websites from making requests to someone's printer, for - // example. - if (!security_state->is_web_secure_context && - IsLessPublicAddressSpace(resource_address_space, - security_state->ip_address_space)) { - DVLOG(1) << "CORS-RFC1918 check: " - "failed, blocking insecure private network request."; - return false; - } + is_warning = false; + break; + } + + if (!security_state->is_web_secure_context && + IsLessPublicAddressSpace(resource_address_space, + security_state->ip_address_space)) { + DVLOG(1) << "CORS-RFC1918 check: failed," + << (is_warning ? "but not enforcing blocking of insecure private " + "network request." + : "blocking insecure private network request."); + if (network_service_client_) { + network_service_client_->OnPrivateNetworkRequest( + factory_params_->process_id, render_frame_id_, devtools_request_id(), + url_request_->url(), is_warning, resource_address_space, + security_state->Clone()); + } + return is_warning; } DVLOG(1) << "CORS-RFC1918 check: success.";
diff --git a/services/network/url_loader_factory.cc b/services/network/url_loader_factory.cc index 6cda209..e72645de 100644 --- a/services/network/url_loader_factory.cc +++ b/services/network/url_loader_factory.cc
@@ -135,20 +135,9 @@ url_request.destination != network::mojom::RequestDestination::kWebBundle) { // Load a subresource from a WebBundle. - base::WeakPtr<WebBundleURLLoaderFactory> web_bundle_url_loader_factory = - context_->GetWebBundleManager().GetWebBundleURLLoaderFactory( - *url_request.web_bundle_token_params, params_->process_id); - if (web_bundle_url_loader_factory) { - web_bundle_url_loader_factory->CreateLoaderAndStart( - std::move(receiver), routing_id, request_id, options, url_request, - std::move(client), traffic_annotation); - return; - } - // A request for subresource arrives earlier than a request for a webbundle. - context_->GetWebBundleManager().AddPendingSubresouceRequest( - url_request.web_bundle_token_params->token, params_->process_id, - std::move(receiver), routing_id, request_id, options, url_request, - std::move(client), traffic_annotation); + context_->GetWebBundleManager().StartSubresourceRequest( + std::move(receiver), url_request, std::move(client), + params_->process_id); return; } @@ -287,7 +276,8 @@ DCHECK(url_request.web_bundle_token_params.has_value()); base::WeakPtr<WebBundleURLLoaderFactory> web_bundle_url_loader_factory = context_->GetWebBundleManager().CreateWebBundleURLLoaderFactory( - url_request.url, *url_request.web_bundle_token_params, params_); + url_request.url, *url_request.web_bundle_token_params, + params_->process_id, params_->request_initiator_origin_lock); client = web_bundle_url_loader_factory->WrapURLLoaderClient(std::move(client)); }
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc index 9981e01..cb6d0ff 100644 --- a/services/network/url_loader_unittest.cc +++ b/services/network/url_loader_unittest.cc
@@ -85,6 +85,7 @@ #include "services/network/public/mojom/ip_address_space.mojom-shared.h" #include "services/network/public/mojom/ip_address_space.mojom.h" #include "services/network/public/mojom/network_context.mojom.h" +#include "services/network/public/mojom/network_service.mojom.h" #include "services/network/public/mojom/origin_policy_manager.mojom.h" #include "services/network/public/mojom/trust_tokens.mojom-shared.h" #include "services/network/public/mojom/url_loader.mojom.h" @@ -627,8 +628,7 @@ net::IsolationInfo::CreateForInternalRequest(origin); params.is_trusted = true; url_loader = std::make_unique<URLLoader>( - context(), nullptr /* network_service_client */, - network_context_client.get(), + context(), network_service_client_, network_context_client.get(), DeleteLoaderCallback(&delete_run_loop, &url_loader), loader.BindNewPipeAndPassReceiver(), options, request, client_.CreateRemote(), /*reponse_body_use_tracker=*/base::nullopt, @@ -644,6 +644,7 @@ : mojo::NullRemote() /* auth_cert_observer */); ran_ = true; + network_service_client_ = nullptr; if (expect_redirect_) { client_.RunUntilRedirectReceived(); @@ -810,6 +811,10 @@ void set_request_client_security_state(mojom::ClientSecurityStatePtr state) { request_client_security_state_ = std::move(state); } + void set_network_service_client_for_next_request( + mojom::NetworkServiceClient* client) { + network_service_client_ = client; + } void set_request_body(scoped_refptr<ResourceRequestBody> request_body) { request_body_ = request_body; } @@ -939,6 +944,7 @@ bool expect_redirect_ = false; mojom::ClientSecurityStatePtr factory_client_security_state_; mojom::ClientSecurityStatePtr request_client_security_state_; + mojom::NetworkServiceClient* network_service_client_ = nullptr; scoped_refptr<ResourceRequestBody> request_body_; bool corb_enabled_ = false; @@ -1022,6 +1028,17 @@ EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); } +TEST_F(URLLoaderTest, SecureUnknownToLocalIsOkPolicyIsWarn) { + auto client_security_state = NewSecurityState(); + client_security_state->is_web_secure_context = true; + client_security_state->ip_address_space = mojom::IPAddressSpace::kUnknown; + client_security_state->private_network_request_policy = + mojom::PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate; + set_factory_client_security_state(std::move(client_security_state)); + + EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); +} + TEST_F(URLLoaderTest, SecurePublicToLocalIsOk) { auto client_security_state = NewSecurityState(); client_security_state->is_web_secure_context = true; @@ -1031,6 +1048,17 @@ EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); } +TEST_F(URLLoaderTest, SecurePublicToLocalIsOkPolicyIsWarn) { + auto client_security_state = NewSecurityState(); + client_security_state->is_web_secure_context = true; + client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic; + client_security_state->private_network_request_policy = + mojom::PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate; + set_factory_client_security_state(std::move(client_security_state)); + + EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); +} + TEST_F(URLLoaderTest, SecurePrivateToLocalIsBlocked) { auto client_security_state = NewSecurityState(); client_security_state->is_web_secure_context = true; @@ -1040,6 +1068,17 @@ EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); } +TEST_F(URLLoaderTest, SecurePrivateToLocalIsBlockedPolicyIsWarn) { + auto client_security_state = NewSecurityState(); + client_security_state->is_web_secure_context = true; + client_security_state->ip_address_space = mojom::IPAddressSpace::kPrivate; + client_security_state->private_network_request_policy = + mojom::PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate; + set_factory_client_security_state(std::move(client_security_state)); + + EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); +} + TEST_F(URLLoaderTest, SecureLocalToLocalIsOk) { auto client_security_state = NewSecurityState(); client_security_state->is_web_secure_context = true; @@ -1049,6 +1088,17 @@ EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); } +TEST_F(URLLoaderTest, SecureLocalToLocalIsOkPolicyIsWarn) { + auto client_security_state = NewSecurityState(); + client_security_state->is_web_secure_context = true; + client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal; + client_security_state->private_network_request_policy = + mojom::PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate; + set_factory_client_security_state(std::move(client_security_state)); + + EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); +} + // These tests verify that requests from any page to an IP in the "local" // address space are never blocked when the request policy is kAllow. @@ -1062,6 +1112,16 @@ EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); } +TEST_F(URLLoaderTest, PolicyIsWarnUnknownToLocalIsOk) { + auto client_security_state = NewSecurityState(); + client_security_state->private_network_request_policy = + mojom::PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate; + client_security_state->ip_address_space = mojom::IPAddressSpace::kUnknown; + set_factory_client_security_state(std::move(client_security_state)); + + EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); +} + TEST_F(URLLoaderTest, PolicyIsAllowPublicToLocalIsOk) { auto client_security_state = NewSecurityState(); client_security_state->private_network_request_policy = @@ -1072,6 +1132,16 @@ EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); } +TEST_F(URLLoaderTest, PolicyIsWarnPublicToLocalIsOk) { + auto client_security_state = NewSecurityState(); + client_security_state->private_network_request_policy = + mojom::PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate; + client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic; + set_factory_client_security_state(std::move(client_security_state)); + + EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); +} + TEST_F(URLLoaderTest, PolicyIsAllowPrivateToLocalIsBlocked) { auto client_security_state = NewSecurityState(); client_security_state->private_network_request_policy = @@ -1082,6 +1152,16 @@ EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); } +TEST_F(URLLoaderTest, PolicyIsWarnPrivateToLocalIsBlocked) { + auto client_security_state = NewSecurityState(); + client_security_state->private_network_request_policy = + mojom::PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate; + client_security_state->ip_address_space = mojom::IPAddressSpace::kPrivate; + set_factory_client_security_state(std::move(client_security_state)); + + EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); +} + TEST_F(URLLoaderTest, PolicyIsAllowLocalToLocalIsOk) { auto client_security_state = NewSecurityState(); client_security_state->private_network_request_policy = @@ -1092,6 +1172,16 @@ EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); } +TEST_F(URLLoaderTest, PolicyIsWarnLocalToLocalIsOk) { + auto client_security_state = NewSecurityState(); + client_security_state->private_network_request_policy = + mojom::PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate; + client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal; + set_factory_client_security_state(std::move(client_security_state)); + + EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); +} + // These tests verify that requests from an insecure page to an IP in the // "local" address space are blocked unless the page came from the same address // space. In practice, the local address space contains only localhost. @@ -1147,6 +1237,17 @@ EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); } +TEST_F(URLLoaderTest, InsecureLocalToLocalIsOkPolicyIsWarn) { + auto client_security_state = NewSecurityState(); + client_security_state->is_web_secure_context = false; + client_security_state->ip_address_space = mojom::IPAddressSpace::kLocal; + client_security_state->private_network_request_policy = + mojom::PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate; + set_factory_client_security_state(std::move(client_security_state)); + + EXPECT_THAT(Load(test_server()->GetURL("/empty.html")), IsOk()); +} + // This test verifies that if the request's TrustedParams field carries a client // security state indicating that the request initiator is not a secure context // and came from the public IP address space, requests to local IP addresses @@ -3356,6 +3457,21 @@ } } + void OnPrivateNetworkRequest( + int32_t proess_id, + int32_t routing_id, + const base::Optional<std::string>& devtools_request_id, + const GURL& url, + bool is_warning, + network::mojom::IPAddressSpace resource_address_space, + network::mojom::ClientSecurityStatePtr client_security_state) override { + OnPrivateNetworkRequestParams params = {devtools_request_id, url, + is_warning, resource_address_space, + std::move(client_security_state)}; + params_of_private_network_request_.emplace(std::move(params)); + wait_for_private_network_request_.Quit(); + } + void WaitUntilRawResponse(size_t goal) { if (raw_response_cookies_.size() < goal || !got_raw_response_) { wait_for_raw_response_goal_ = goal; @@ -3376,6 +3492,10 @@ EXPECT_EQ(goal, raw_request_cookies_.size()); } + void WaitUntilPrivateNetworkRequest() { + wait_for_private_network_request_.Run(); + } + const net::CookieAndLineAccessResultList& raw_response_cookies() const { return raw_response_cookies_; } @@ -3398,6 +3518,19 @@ return resource_address_space_; } + struct OnPrivateNetworkRequestParams { + base::Optional<std::string> devtools_request_id; + GURL url; + bool is_warning; + network::mojom::IPAddressSpace resource_address_space; + network::mojom::ClientSecurityStatePtr client_security_state; + }; + + const base::Optional<OnPrivateNetworkRequestParams>& + private_network_request_params() const { + return params_of_private_network_request_; + } + private: net::CookieAndLineAccessResultList raw_response_cookies_; base::OnceClosure wait_for_raw_response_; @@ -3413,6 +3546,10 @@ size_t wait_for_raw_request_goal_ = 0u; network::mojom::ClientSecurityStatePtr client_security_state_; + base::RunLoop wait_for_private_network_request_; + base::Optional<OnPrivateNetworkRequestParams> + params_of_private_network_request_; + DISALLOW_COPY_AND_ASSIGN(MockNetworkServiceClient); }; @@ -6638,4 +6775,109 @@ testing::ElementsAre(kHostnameWithoutAliases)); } +TEST_F(URLLoaderTest, + PrivateNetworkRequestPolicyReportsOnPrivateNetworkRequestWarn) { + url::Origin initiator = + url::Origin::Create(GURL("http://other-origin.test/")); + + ResourceRequest request = + CreateResourceRequest("GET", test_server()->GetURL("/simple_page.html")); + request.mode = mojom::RequestMode::kNoCors; + request.request_initiator = initiator; + request.devtools_request_id = "fake-id"; + + auto client_security_state = NewSecurityState(); + client_security_state->is_web_secure_context = false; + client_security_state->private_network_request_policy = + mojom::PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate; + client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic; + set_factory_client_security_state(std::move(client_security_state)); + + MockNetworkServiceClient network_service_client; + set_network_service_client_for_next_request(&network_service_client); + + EXPECT_EQ(net::OK, LoadRequest(request)); + + network_service_client.WaitUntilPrivateNetworkRequest(); + ASSERT_TRUE(network_service_client.private_network_request_params()); + auto& params = *network_service_client.private_network_request_params(); + ASSERT_TRUE(params.client_security_state); + auto& state = params.client_security_state; + EXPECT_EQ(state->private_network_request_policy, + mojom::PrivateNetworkRequestPolicy::kWarnFromInsecureToMorePrivate); + EXPECT_EQ(state->is_web_secure_context, false); + EXPECT_EQ(state->ip_address_space, mojom::IPAddressSpace::kPublic); + EXPECT_EQ(params.resource_address_space, mojom::IPAddressSpace::kLocal); + EXPECT_EQ(params.devtools_request_id, "fake-id"); + EXPECT_TRUE(params.is_warning); + EXPECT_THAT(params.url.spec(), testing::HasSubstr("simple_page.html")); +} + +TEST_F(URLLoaderTest, + PrivateNetworkRequestPolicyReportsOnPrivateNetworkRequestBlock) { + url::Origin initiator = + url::Origin::Create(GURL("http://other-origin.test/")); + + ResourceRequest request = + CreateResourceRequest("GET", test_server()->GetURL("/simple_page.html")); + request.mode = mojom::RequestMode::kNoCors; + request.request_initiator = initiator; + request.devtools_request_id = "fake-id"; + + auto client_security_state = NewSecurityState(); + client_security_state->is_web_secure_context = false; + client_security_state->private_network_request_policy = + mojom::PrivateNetworkRequestPolicy::kBlockFromInsecureToMorePrivate; + client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic; + set_factory_client_security_state(std::move(client_security_state)); + + MockNetworkServiceClient network_service_client; + set_network_service_client_for_next_request(&network_service_client); + + EXPECT_EQ(net::ERR_FAILED, LoadRequest(request)); + + network_service_client.WaitUntilPrivateNetworkRequest(); + ASSERT_TRUE(network_service_client.private_network_request_params()); + auto& params = *network_service_client.private_network_request_params(); + ASSERT_TRUE(params.client_security_state); + auto& state = params.client_security_state; + EXPECT_EQ( + state->private_network_request_policy, + mojom::PrivateNetworkRequestPolicy::kBlockFromInsecureToMorePrivate); + EXPECT_EQ(state->is_web_secure_context, false); + EXPECT_EQ(state->ip_address_space, mojom::IPAddressSpace::kPublic); + EXPECT_EQ(params.resource_address_space, mojom::IPAddressSpace::kLocal); + EXPECT_EQ(params.devtools_request_id, "fake-id"); + EXPECT_FALSE(params.is_warning); + EXPECT_THAT(params.url.spec(), testing::HasSubstr("simple_page.html")); +} + +TEST_F(URLLoaderTest, + PrivateNetworkRequestPolicyReportsOnPrivateNetworkRequestAllow) { + url::Origin initiator = + url::Origin::Create(GURL("http://other-origin.test/")); + + ResourceRequest request = + CreateResourceRequest("GET", test_server()->GetURL("/simple_page.html")); + request.mode = mojom::RequestMode::kNoCors; + request.request_initiator = initiator; + request.devtools_request_id = "fake-id"; + + auto client_security_state = NewSecurityState(); + client_security_state->is_web_secure_context = false; + client_security_state->private_network_request_policy = + mojom::PrivateNetworkRequestPolicy::kAllow; + client_security_state->ip_address_space = mojom::IPAddressSpace::kPublic; + set_factory_client_security_state(std::move(client_security_state)); + + MockNetworkServiceClient network_service_client; + set_network_service_client_for_next_request(&network_service_client); + + EXPECT_EQ(net::OK, LoadRequest(request)); + + // Check that OnPrivateNetworkRequest wasn't triggered. + network_service_client.WaitUntilRawResponse(0); + EXPECT_FALSE(network_service_client.private_network_request_params()); +} + } // namespace network
diff --git a/services/network/web_bundle_manager.cc b/services/network/web_bundle_manager.cc index 4a5f808..017b3e9 100644 --- a/services/network/web_bundle_manager.cc +++ b/services/network/web_bundle_manager.cc
@@ -30,19 +30,11 @@ struct WebBundlePendingSubresourceRequest { WebBundlePendingSubresourceRequest( mojo::PendingReceiver<mojom::URLLoader> receiver, - int32_t routing_id, - int32_t request_id, - uint32_t options, const ResourceRequest& url_request, - mojo::PendingRemote<mojom::URLLoaderClient> client, - const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) + mojo::PendingRemote<mojom::URLLoaderClient> client) : receiver(std::move(receiver)), - routing_id(routing_id), - request_id(request_id), - options(options), url_request(url_request), - client(std::move(client)), - traffic_annotation(traffic_annotation) {} + client(std::move(client)) {} ~WebBundlePendingSubresourceRequest() = default; WebBundlePendingSubresourceRequest( @@ -51,12 +43,8 @@ const WebBundlePendingSubresourceRequest&) = delete; mojo::PendingReceiver<mojom::URLLoader> receiver; - int32_t routing_id; - int32_t request_id; - uint32_t options; const ResourceRequest url_request; mojo::PendingRemote<mojom::URLLoaderClient> client; - const net::MutableNetworkTrafficAnnotationTag traffic_annotation; }; class WebBundleManager::MemoryQuotaConsumer @@ -98,9 +86,10 @@ WebBundleManager::CreateWebBundleURLLoaderFactory( const GURL& bundle_url, const ResourceRequest::WebBundleTokenParams& web_bundle_token_params, - const mojom::URLLoaderFactoryParamsPtr& factory_params) { - DCHECK(factories_.find({factory_params->process_id, - web_bundle_token_params.token}) == factories_.end()); + int32_t process_id, + const base::Optional<url::Origin>& request_initiator_origin_lock) { + DCHECK(factories_.find({process_id, web_bundle_token_params.token}) == + factories_.end()); mojo::Remote<mojom::WebBundleHandle> remote( web_bundle_token_params.CloneHandle()); @@ -108,36 +97,30 @@ // Set a disconnect handler to remove a WebBundleURLLoaderFactory from this // WebBundleManager when the corresponding endpoint in the renderer is // removed. - remote.set_disconnect_handler( - base::BindOnce(&WebBundleManager::DisconnectHandler, - // |this| outlives |remote|. - base::Unretained(this), web_bundle_token_params.token, - factory_params->process_id)); + remote.set_disconnect_handler(base::BindOnce( + &WebBundleManager::DisconnectHandler, + // |this| outlives |remote|. + base::Unretained(this), web_bundle_token_params.token, process_id)); auto factory = std::make_unique<WebBundleURLLoaderFactory>( - bundle_url, std::move(remote), - factory_params->request_initiator_origin_lock, + bundle_url, std::move(remote), request_initiator_origin_lock, std::make_unique<MemoryQuotaConsumer>(weak_ptr_factory_.GetWeakPtr(), - factory_params->process_id)); + process_id)); // Process pending subresource requests if there are. // These subresource requests arrived earlier than the request for the bundle. - auto it = pending_requests_.find( - {factory_params->process_id, web_bundle_token_params.token}); + auto it = pending_requests_.find({process_id, web_bundle_token_params.token}); if (it != pending_requests_.end()) { for (auto& pending_request : it->second) { - factory->CreateLoaderAndStart( - std::move(pending_request->receiver), pending_request->routing_id, - pending_request->request_id, pending_request->options, - pending_request->url_request, std::move(pending_request->client), - pending_request->traffic_annotation); + factory->StartSubresourceRequest(std::move(pending_request->receiver), + pending_request->url_request, + std::move(pending_request->client)); } pending_requests_.erase(it); } auto weak_factory = factory->GetWeakPtr(); - factories_.insert({std::make_pair(factory_params->process_id, - web_bundle_token_params.token), + factories_.insert({std::make_pair(process_id, web_bundle_token_params.token), std::move(factory)}); return weak_factory; @@ -159,20 +142,24 @@ return it->second->GetWeakPtr(); } -void WebBundleManager::AddPendingSubresouceRequest( - base::UnguessableToken token, - int32_t process_id, +void WebBundleManager::StartSubresourceRequest( mojo::PendingReceiver<mojom::URLLoader> receiver, - int32_t routing_id, - int32_t request_id, - uint32_t options, const ResourceRequest& url_request, mojo::PendingRemote<mojom::URLLoaderClient> client, - const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) { - pending_requests_[{process_id, token}].push_back( - std::make_unique<WebBundlePendingSubresourceRequest>( - std::move(receiver), routing_id, request_id, options, url_request, - std::move(client), traffic_annotation)); + int32_t process_id) { + DCHECK(url_request.web_bundle_token_params.has_value()); + base::WeakPtr<WebBundleURLLoaderFactory> web_bundle_url_loader_factory = + GetWebBundleURLLoaderFactory(*url_request.web_bundle_token_params, + process_id); + if (web_bundle_url_loader_factory) { + web_bundle_url_loader_factory->StartSubresourceRequest( + std::move(receiver), url_request, std::move(client)); + return; + } + // A request for subresource arrives earlier than a request for a webbundle. + pending_requests_[{process_id, url_request.web_bundle_token_params->token}] + .push_back(std::make_unique<WebBundlePendingSubresourceRequest>( + std::move(receiver), url_request, std::move(client))); } void WebBundleManager::DisconnectHandler(
diff --git a/services/network/web_bundle_manager.h b/services/network/web_bundle_manager.h index 49a7d74..f92d9e6 100644 --- a/services/network/web_bundle_manager.h +++ b/services/network/web_bundle_manager.h
@@ -35,22 +35,14 @@ base::WeakPtr<WebBundleURLLoaderFactory> CreateWebBundleURLLoaderFactory( const GURL& bundle_url, const ResourceRequest::WebBundleTokenParams& params, - const mojom::URLLoaderFactoryParamsPtr& factory_params); - - base::WeakPtr<WebBundleURLLoaderFactory> GetWebBundleURLLoaderFactory( - const ResourceRequest::WebBundleTokenParams& params, - int32_t process_id); - - void AddPendingSubresouceRequest( - base::UnguessableToken token, int32_t process_id, + const base::Optional<url::Origin>& request_initiator_origin_lock); + + void StartSubresourceRequest( mojo::PendingReceiver<mojom::URLLoader> receiver, - int32_t routing_id, - int32_t request_id, - uint32_t options, const ResourceRequest& url_request, mojo::PendingRemote<mojom::URLLoaderClient> client, - const net::MutableNetworkTrafficAnnotationTag& traffic_annotation); + int32_t process_id); private: friend class WebBundleManagerTest; @@ -60,6 +52,10 @@ // Key is a tuple of (Process id, WebBundle token) using Key = std::pair<int32_t, base::UnguessableToken>; + base::WeakPtr<WebBundleURLLoaderFactory> GetWebBundleURLLoaderFactory( + const ResourceRequest::WebBundleTokenParams& params, + int32_t process_id); + void DisconnectHandler(base::UnguessableToken token, int32_t process_id); bool AllocateMemoryForProcess(int32_t process_id, uint64_t num_bytes);
diff --git a/services/network/web_bundle_manager_unittest.cc b/services/network/web_bundle_manager_unittest.cc index 6a168a5..137546a 100644 --- a/services/network/web_bundle_manager_unittest.cc +++ b/services/network/web_bundle_manager_unittest.cc
@@ -87,8 +87,6 @@ std::unique_ptr<TestWebBundleHandle>> CreateWebBundleLoaderFactory(WebBundleManager& manager, int32_t process_id) { base::UnguessableToken token = base::UnguessableToken::Create(); - auto factory_params = mojom::URLLoaderFactoryParams::New(); - factory_params->process_id = process_id; mojo::PendingRemote<mojom::WebBundleHandle> remote_handle; std::unique_ptr<TestWebBundleHandle> handle = std::make_unique<TestWebBundleHandle>( @@ -96,8 +94,9 @@ ResourceRequest::WebBundleTokenParams create_params(token, std::move(remote_handle)); base::WeakPtr<WebBundleURLLoaderFactory> factory = - manager.CreateWebBundleURLLoaderFactory(GURL(kBundleUrl), create_params, - factory_params); + manager.CreateWebBundleURLLoaderFactory( + GURL(kBundleUrl), create_params, process_id, + /*request_initiator_origin_lock=*/base::nullopt); return std::forward_as_tuple(std::move(factory), std::move(handle)); } @@ -120,10 +119,8 @@ request.url = GURL(kResourceUrl); request.method = "GET"; request.request_initiator = url::Origin::Create(GURL(kInitiatorUrl)); - factory.CreateLoaderAndStart( - loader.BindNewPipeAndPassReceiver(), 0 /* routing_id */, - 0 /* request_id */, 0 /* options */, request, client->CreateRemote(), - net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); + factory.StartSubresourceRequest(loader.BindNewPipeAndPassReceiver(), request, + client->CreateRemote()); return std::forward_as_tuple(std::move(loader), std::move(client)); } @@ -140,6 +137,13 @@ manager.set_max_memory_per_process_for_testing(max_memory_per_process); } + base::WeakPtr<WebBundleURLLoaderFactory> GetWebBundleURLLoaderFactory( + WebBundleManager& manager, + const ResourceRequest::WebBundleTokenParams& params, + int32_t process_id) { + return manager.GetWebBundleURLLoaderFactory(params, process_id); + } + private: base::test::TaskEnvironment task_environment_; }; @@ -147,45 +151,43 @@ TEST_F(WebBundleManagerTest, NoFactoryExistsForDifferentProcessId) { WebBundleManager manager; base::UnguessableToken token = base::UnguessableToken::Create(); - auto factory_params = mojom::URLLoaderFactoryParams::New(); - factory_params->process_id = process_id1; mojo::PendingRemote<network::mojom::WebBundleHandle> handle; mojo::PendingReceiver<network::mojom::WebBundleHandle> receiver = handle.InitWithNewPipeAndPassReceiver(); ResourceRequest::WebBundleTokenParams create_params(token, std::move(handle)); auto factory = manager.CreateWebBundleURLLoaderFactory( - GURL(kBundleUrl), create_params, factory_params); + GURL(kBundleUrl), create_params, process_id1, + /*request_initiator_origin_lock=*/base::nullopt); ASSERT_TRUE(factory); ResourceRequest::WebBundleTokenParams find_params(token, mojom::kInvalidProcessId); - ASSERT_TRUE(manager.GetWebBundleURLLoaderFactory(find_params, - factory_params->process_id)); - ASSERT_FALSE(manager.GetWebBundleURLLoaderFactory(find_params, process_id2)); + ASSERT_TRUE(GetWebBundleURLLoaderFactory(manager, find_params, process_id1)); + ASSERT_FALSE(GetWebBundleURLLoaderFactory(manager, find_params, process_id2)); } TEST_F(WebBundleManagerTest, UseProcesIdInTokenParamsForRequestsFromBrowser) { WebBundleManager manager; base::UnguessableToken token = base::UnguessableToken::Create(); - auto factory_params = mojom::URLLoaderFactoryParams::New(); - factory_params->process_id = process_id1; mojo::PendingRemote<network::mojom::WebBundleHandle> handle; mojo::PendingReceiver<network::mojom::WebBundleHandle> receiver = handle.InitWithNewPipeAndPassReceiver(); ResourceRequest::WebBundleTokenParams create_params(token, std::move(handle)); auto factory = manager.CreateWebBundleURLLoaderFactory( - GURL(kBundleUrl), create_params, factory_params); + GURL(kBundleUrl), create_params, process_id1, + /*request_initiator_origin_lock=*/base::nullopt); ASSERT_TRUE(factory); ResourceRequest::WebBundleTokenParams find_params1(token, process_id1); - ASSERT_TRUE(manager.GetWebBundleURLLoaderFactory(find_params1, - mojom::kBrowserProcessId)); - ASSERT_FALSE(manager.GetWebBundleURLLoaderFactory(find_params1, process_id2)); + ASSERT_TRUE(GetWebBundleURLLoaderFactory(manager, find_params1, + mojom::kBrowserProcessId)); + ASSERT_FALSE( + GetWebBundleURLLoaderFactory(manager, find_params1, process_id2)); ResourceRequest::WebBundleTokenParams find_params2(token, process_id2); - ASSERT_FALSE(manager.GetWebBundleURLLoaderFactory(find_params2, - mojom::kBrowserProcessId)); + ASSERT_FALSE(GetWebBundleURLLoaderFactory(manager, find_params2, + mojom::kBrowserProcessId)); } TEST_F(WebBundleManagerTest, RemoveFactoryWhenDisconnected) { @@ -193,8 +195,6 @@ base::UnguessableToken token = base::UnguessableToken::Create(); ResourceRequest::WebBundleTokenParams find_params(token, mojom::kInvalidProcessId); - auto factory_params = mojom::URLLoaderFactoryParams::New(); - factory_params->process_id = 123; { mojo::PendingRemote<network::mojom::WebBundleHandle> handle; mojo::PendingReceiver<network::mojom::WebBundleHandle> receiver = @@ -203,15 +203,15 @@ std::move(handle)); auto factory = manager.CreateWebBundleURLLoaderFactory( - GURL(kBundleUrl), create_params, factory_params); + GURL(kBundleUrl), create_params, process_id1, + /*request_initiator_origin_lock=*/base::nullopt); ASSERT_TRUE(factory); - ASSERT_TRUE(manager.GetWebBundleURLLoaderFactory( - find_params, factory_params->process_id)); + ASSERT_TRUE( + GetWebBundleURLLoaderFactory(manager, find_params, process_id1)); // Getting out of scope to delete |receiver|. } base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(manager.GetWebBundleURLLoaderFactory(find_params, - factory_params->process_id)) + EXPECT_FALSE(GetWebBundleURLLoaderFactory(manager, find_params, process_id1)) << "The manager should remove a factory when the handle is disconnected."; } @@ -247,21 +247,20 @@ WebBundleManager manager; // Simulate that a subresource request arrives at first, - // calling WebBundleManager::AddPendingSubresouceRequest. + // calling WebBundleManager::StartSubresourceRequest. base::UnguessableToken token = base::UnguessableToken::Create(); network::ResourceRequest request; request.url = GURL(kResourceUrl); request.method = "GET"; request.request_initiator = url::Origin::Create(GURL(kInitiatorUrl)); + request.web_bundle_token_params = ResourceRequest::WebBundleTokenParams(); + request.web_bundle_token_params->token = token; mojo::Remote<network::mojom::URLLoader> loader; auto client = std::make_unique<network::TestURLLoaderClient>(); - manager.AddPendingSubresouceRequest( - token, 123 /* process id */, loader.BindNewPipeAndPassReceiver(), - 0 /* routing_id */, 0 /* request_id */, 0 /* options */, request, - client->CreateRemote(), - net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); + manager.StartSubresourceRequest(loader.BindNewPipeAndPassReceiver(), request, + client->CreateRemote(), process_id1); // Simulate that a webbundle request arrives, calling // WebBundleManager::CreateWebBundleURLLoaderFactory. @@ -271,11 +270,9 @@ mojo::PendingReceiver<network::mojom::WebBundleHandle> receiver = token_params.handle.InitWithNewPipeAndPassReceiver(); - auto factory_params = mojom::URLLoaderFactoryParams::New(); - factory_params->process_id = 123; - auto factory = manager.CreateWebBundleURLLoaderFactory( - GURL(kBundleUrl), token_params, factory_params); + GURL(kBundleUrl), token_params, process_id1, + /*request_initiator_origin_lock=*/base::nullopt); // Then, simulate that the bundle is loaded from the network, calling // SetBundleStream manually.
diff --git a/services/network/web_bundle_url_loader_factory.cc b/services/network/web_bundle_url_loader_factory.cc index bacec69..2c38387 100644 --- a/services/network/web_bundle_url_loader_factory.cc +++ b/services/network/web_bundle_url_loader_factory.cc
@@ -429,15 +429,11 @@ return client; } -void WebBundleURLLoaderFactory::CreateLoaderAndStart( +void WebBundleURLLoaderFactory::StartSubresourceRequest( mojo::PendingReceiver<mojom::URLLoader> receiver, - int32_t routing_id, - int32_t request_id, - uint32_t options, const ResourceRequest& url_request, - mojo::PendingRemote<mojom::URLLoaderClient> client, - const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) { - TRACE_EVENT0("loading", "WebBundleURLLoaderFactory::CreateLoaderAndStart"); + mojo::PendingRemote<mojom::URLLoaderClient> client) { + TRACE_EVENT0("loading", "WebBundleURLLoaderFactory::StartSubresourceRequest"); URLLoader* loader = new URLLoader(std::move(receiver), url_request, std::move(client), request_initiator_origin_lock_); @@ -456,11 +452,6 @@ StartLoad(loader); } -void WebBundleURLLoaderFactory::Clone( - mojo::PendingReceiver<mojom::URLLoaderFactory> receiver) { - NOTREACHED(); -} - void WebBundleURLLoaderFactory::StartLoad(URLLoader* loader) { DCHECK(metadata_); if (!loader)
diff --git a/services/network/web_bundle_url_loader_factory.h b/services/network/web_bundle_url_loader_factory.h index a3c63c4..c1d0375 100644 --- a/services/network/web_bundle_url_loader_factory.h +++ b/services/network/web_bundle_url_loader_factory.h
@@ -17,8 +17,7 @@ class WebBundleMemoryQuotaConsumer; -class COMPONENT_EXPORT(NETWORK_SERVICE) WebBundleURLLoaderFactory - : public mojom::URLLoaderFactory { +class COMPONENT_EXPORT(NETWORK_SERVICE) WebBundleURLLoaderFactory { public: WebBundleURLLoaderFactory( const GURL& bundle_url, @@ -26,7 +25,7 @@ const base::Optional<url::Origin>& request_initiator_origin_lock, std::unique_ptr<WebBundleMemoryQuotaConsumer> web_bundle_memory_quota_consumer); - ~WebBundleURLLoaderFactory() override; + ~WebBundleURLLoaderFactory(); WebBundleURLLoaderFactory(const WebBundleURLLoaderFactory&) = delete; WebBundleURLLoaderFactory& operator=(const WebBundleURLLoaderFactory&) = delete; @@ -37,17 +36,10 @@ mojo::PendingRemote<mojom::URLLoaderClient> WrapURLLoaderClient( mojo::PendingRemote<mojom::URLLoaderClient> wrapped); - // mojom::URLLoaderFactory implementation. - void CreateLoaderAndStart(mojo::PendingReceiver<mojom::URLLoader> receiver, - int32_t routing_id, - int32_t request_id, - uint32_t options, - const ResourceRequest& url_request, - mojo::PendingRemote<mojom::URLLoaderClient> client, - const net::MutableNetworkTrafficAnnotationTag& - traffic_annotation) override; - - void Clone(mojo::PendingReceiver<mojom::URLLoaderFactory> receiver) override; + void StartSubresourceRequest( + mojo::PendingReceiver<mojom::URLLoader> receiver, + const ResourceRequest& url_request, + mojo::PendingRemote<mojom::URLLoaderClient> client); private: class BundleDataSource;
diff --git a/services/network/web_bundle_url_loader_factory_unittest.cc b/services/network/web_bundle_url_loader_factory_unittest.cc index 73a5066..58270e9 100644 --- a/services/network/web_bundle_url_loader_factory_unittest.cc +++ b/services/network/web_bundle_url_loader_factory_unittest.cc
@@ -151,11 +151,9 @@ StartRequestResult result; result.client = std::make_unique<network::TestURLLoaderClient>(); - factory_->CreateLoaderAndStart( - result.loader.BindNewPipeAndPassReceiver(), 0 /* routing_id */, - 0 /* request_id */, 0 /* options */, request, - result.client->CreateRemote(), - net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); + factory_->StartSubresourceRequest( + result.loader.BindNewPipeAndPassReceiver(), request, + result.client->CreateRemote()); return result; }
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc index 4e9c840e..578e17d 100644 --- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc +++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
@@ -38,6 +38,7 @@ #include <dlfcn.h> #include "base/android/reached_code_profiler.h" +#include "base/debug/elf_reader.h" #if ANDROID_ARM64_UNWINDING_SUPPORTED #include "services/tracing/public/cpp/stack_sampling/stack_unwinder_arm64_android.h" @@ -224,6 +225,104 @@ TracingSamplerProfiler::LoaderLockSampler* g_test_loader_lock_sampler = nullptr; #endif +// Stores information about the StackFrame, to emit to the trace. +struct FrameDetails { + std::string frame_name; + std::string module_name; + std::string module_id; + uintptr_t module_base_address = 0; + uintptr_t rel_pc = 0; + + // True if the module of the stack frame will be considered valid by the trace + // processor. + bool has_valid_module() const { + return !module_name.empty() && !module_id.empty() && + module_base_address > 0; + } + + bool has_valid_frame() const { + // Valid only if |rel_pc|, since filtering mode does not record frame names. + return rel_pc > 0; + } + + // Gets module from the frame's module cache. + void SetModule(const base::ModuleCache::Module& module) { + module_base_address = module.GetBaseAddress(); + module_id = module.GetId(); + if (module_name.empty()) { + module_name = module.GetDebugBasename().MaybeAsASCII(); + } + } + + // Leaves the valid fields as is and fills in dummy values for invalid fields. + // Useful to observe errors in traces. + void FillWithDummyFields(uintptr_t frame_ip) { + if (rel_pc == 0) { + // Record the |frame_ip| as |rel_pc| if available, might be useful to + // debug. + rel_pc = frame_ip > 0 ? frame_ip : 1; + } + if (module_base_address == 0) { + module_base_address = 1; + } + if (module_id.empty()) { + module_id = "missing"; + } + if (module_name.empty()) { + module_name = "missing"; + } + DCHECK(has_valid_frame()); + DCHECK(has_valid_module()); + } + +#if ANDROID_ARM64_UNWINDING_SUPPORTED || ANDROID_CFI_UNWINDING_SUPPORTED + // Sets Chrome's module info for the frame. + void SetChromeModuleInfo() { + module_base_address = executable_start_addr(); + static const base::Optional<base::StringPiece> library_name = + base::debug::ReadElfLibraryName( + reinterpret_cast<void*>(executable_start_addr())); + static const base::NoDestructor<std::string> chrome_debug_id([] { + base::debug::ElfBuildIdBuffer build_id; + size_t build_id_length = base::debug::ReadElfBuildId( + reinterpret_cast<void*>(executable_start_addr()), true, build_id); + return std::string(build_id, build_id_length); + }()); + if (library_name) { + module_name = library_name->as_string(); + } + module_id = *chrome_debug_id; + } + + // Sets system library module info for the frame. + void SetSystemModuleInfo(uintptr_t frame_ip) { + Dl_info info = {}; + // For addresses in framework libraries, symbolize and write the function + // name. + if (dladdr(reinterpret_cast<void*>(frame_ip), &info) == 0) { + return; + } + if (info.dli_sname) { + frame_name = info.dli_sname; + } + if (info.dli_fname) { + module_name = info.dli_fname; + } + module_base_address = reinterpret_cast<uintptr_t>(info.dli_fbase); + rel_pc = frame_ip - module_base_address; + // We have already symbolized these frames, so module ID is not necessary. + // Reading the real ID can cause crashes and we can't symbolize these + // server-side anyways. + // TODO(ssid): Remove this once perfetto can keep the frames without module + // ID. + module_id = "system"; + + DCHECK(has_valid_frame()); + DCHECK(has_valid_module()); + } +#endif +}; + } // namespace #if BUILDFLAG(ENABLE_LOADER_LOCK_SAMPLING) @@ -381,109 +480,89 @@ std::vector<InterningID> frame_ids; for (const auto& frame : frames) { - std::string frame_name; - std::string module_name; - std::string module_id; - uintptr_t rel_pc = 0; + FrameDetails frame_details; + if (frame.module) { + frame_details.SetModule(*frame.module); + frame_details.rel_pc = + frame.instruction_pointer - frame_details.module_base_address; + } #if ANDROID_ARM64_UNWINDING_SUPPORTED || ANDROID_CFI_UNWINDING_SUPPORTED - Dl_info info = {}; - // For chrome address we do not have symbols on the binary. So, just write - // the offset address. For addresses on framework libraries, symbolize - // and write the function name. - if (frame.instruction_pointer == 0) { - frame_name = "Scanned"; - } else if (is_chrome_address(frame.instruction_pointer)) { - rel_pc = frame.instruction_pointer - executable_start_addr(); - } else if (dladdr(reinterpret_cast<void*>(frame.instruction_pointer), - &info) != 0) { - // TODO(ssid): Add offset and module debug id if symbol was not resolved - // in case this might be useful to send report to vendors. - if (info.dli_sname) - frame_name = info.dli_sname; - if (info.dli_fname) - module_name = info.dli_fname; - } - - if (frame.module) { - module_id = frame.module->GetId(); - if (module_name.empty()) - module_name = frame.module->GetDebugBasename().MaybeAsASCII(); - } - - // If no module is available, then name it unknown. Adding PC would be - // useless anyway. - if (module_name.empty() && !is_chrome_address(frame.instruction_pointer)) { - frame_name = "Unknown"; - rel_pc = 0; - } -#else // ANDROID_ARM64_UNWINDING_SUPPORTED || ANDROID_CFI_UNWINDING_SUPPORTED - if (frame.module) { - module_name = frame.module->GetDebugBasename().MaybeAsASCII(); - module_id = frame.module->GetId(); - rel_pc = frame.instruction_pointer - frame.module->GetBaseAddress(); - } else { - module_name = module_id = ""; - frame_name = "Unknown"; + if (is_chrome_address(frame.instruction_pointer)) { + frame_details.rel_pc = + frame.instruction_pointer - executable_start_addr(); + if (!frame_details.has_valid_module()) { + frame_details.SetChromeModuleInfo(); + } + } else if (frame.instruction_pointer == 0) { + // TODO(ssid): This frame is currently skipped from inserting. Find a way + // to specify that this frame is scanned in the trace. + frame_details.frame_name = "Scanned"; + } else if (!frame_details.has_valid_module()) { + frame_details.SetSystemModuleInfo(frame.instruction_pointer); } #endif // !(ANDROID_ARM64_UNWINDING_SUPPORTED || // ANDROID_CFI_UNWINDING_SUPPORTED) - MangleModuleIDIfNeeded(&module_id); + // If we do not have a valid module and a valid frame, add a frame with + // dummy details. Adding invalid frame would make trace processor invalidate + // the whole sample. + if (!frame_details.has_valid_module() || !frame_details.has_valid_frame()) { + frame_details.FillWithDummyFields(frame.instruction_pointer); + } + + MangleModuleIDIfNeeded(&frame_details.module_id); // We never emit frame names in privacy filtered mode. bool should_emit_frame_names = - !frame_name.empty() && !should_enable_filtering_; - - if (should_enable_filtering_ && !rel_pc && frame.module) { - rel_pc = frame.instruction_pointer - frame.module->GetBaseAddress(); - } + !frame_details.frame_name.empty() && !should_enable_filtering_; InterningIndexEntry interned_frame; if (should_emit_frame_names) { - interned_frame = - interned_frames_.LookupOrAdd(std::make_pair(frame_name, module_id)); + interned_frame = interned_frames_.LookupOrAdd( + std::make_pair(frame_details.frame_name, frame_details.module_id)); } else { - interned_frame = - interned_frames_.LookupOrAdd(std::make_pair(rel_pc, module_id)); + interned_frame = interned_frames_.LookupOrAdd( + std::make_pair(frame_details.rel_pc, frame_details.module_id)); } if (!interned_frame.was_emitted) { InterningIndexEntry interned_frame_name; if (should_emit_frame_names) { - interned_frame_name = interned_frame_names_.LookupOrAdd(frame_name); + interned_frame_name = + interned_frame_names_.LookupOrAdd(frame_details.frame_name); if (!interned_frame_name.was_emitted) { auto* frame_name_entry = interned_data->add_function_names(); frame_name_entry->set_iid(interned_frame_name.id); frame_name_entry->set_str( - reinterpret_cast<const uint8_t*>(frame_name.data()), - frame_name.length()); + reinterpret_cast<const uint8_t*>(frame_details.frame_name.data()), + frame_details.frame_name.length()); } } InterningIndexEntry interned_module; - if (frame.module) { + if (frame_details.has_valid_module()) { interned_module = - interned_modules_.LookupOrAdd(frame.module->GetBaseAddress()); + interned_modules_.LookupOrAdd(frame_details.module_base_address); if (!interned_module.was_emitted) { InterningIndexEntry interned_module_id = - interned_module_ids_.LookupOrAdd(module_id); + interned_module_ids_.LookupOrAdd(frame_details.module_id); if (!interned_module_id.was_emitted) { auto* module_id_entry = interned_data->add_build_ids(); module_id_entry->set_iid(interned_module_id.id); - module_id_entry->set_str( - reinterpret_cast<const uint8_t*>(module_id.data()), - module_id.length()); + module_id_entry->set_str(reinterpret_cast<const uint8_t*>( + frame_details.module_id.data()), + frame_details.module_id.length()); } InterningIndexEntry interned_module_name = - interned_module_names_.LookupOrAdd(module_name); + interned_module_names_.LookupOrAdd(frame_details.module_name); if (!interned_module_name.was_emitted) { auto* module_name_entry = interned_data->add_mapping_paths(); module_name_entry->set_iid(interned_module_name.id); - module_name_entry->set_str( - reinterpret_cast<const uint8_t*>(module_name.data()), - module_name.length()); + module_name_entry->set_str(reinterpret_cast<const uint8_t*>( + frame_details.module_name.data()), + frame_details.module_name.length()); } auto* module_entry = interned_data->add_mappings(); module_entry->set_iid(interned_module.id); @@ -497,9 +576,9 @@ if (should_emit_frame_names) { frame_entry->set_function_name_id(interned_frame_name.id); } else { - frame_entry->set_rel_pc(rel_pc); + frame_entry->set_rel_pc(frame_details.rel_pc); } - if (frame.module) { + if (frame_details.has_valid_module()) { frame_entry->set_mapping_id(interned_module.id); } }
diff --git a/storage/browser/quota/storage_policy_observer.cc b/storage/browser/quota/storage_policy_observer.cc index 7b3e774..5fe45ed 100644 --- a/storage/browser/quota/storage_policy_observer.cc +++ b/storage/browser/quota/storage_policy_observer.cc
@@ -77,6 +77,19 @@ OnPolicyChanged(); } +void StoragePolicyObserver::StartTrackingOrigins( + const std::vector<url::Origin>& origins) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + for (const auto& origin : origins) { + // If the origin exists, emplace fails, and its state is unchanged. + GURL origin_url = GURL(origin.Serialize()); + origin_state_.emplace(std::move(origin_url), OriginState()); + } + + OnPolicyChanged(); +} + void StoragePolicyObserver::StopTrackingOrigin(const url::Origin& origin) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); const GURL origin_url = GURL(origin.Serialize());
diff --git a/storage/browser/quota/storage_policy_observer.h b/storage/browser/quota/storage_policy_observer.h index bb04ed8..01990226 100644 --- a/storage/browser/quota/storage_policy_observer.h +++ b/storage/browser/quota/storage_policy_observer.h
@@ -48,6 +48,7 @@ // tracked and stopping tracking an origin that is not being tracked // are noops. void StartTrackingOrigin(const url::Origin& origin); + void StartTrackingOrigins(const std::vector<url::Origin>& origins); void StopTrackingOrigin(const url::Origin& origin); // Called by StoragePolicyObserverIOThread.
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 93308c94..e8d01d5 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -17013,6 +17013,298 @@ }, { "args": [ + "context_lost", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_context_lost_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + }, + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "depth_capture", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_depth_capture_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + }, + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "gpu_process", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_gpu_process_launch_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + }, + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "hardware_accelerated_feature", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_hardware_accelerated_feature_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + }, + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "maps", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test", + "--test-machine-name", + "${buildername}", + "--git-revision=${got_revision}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_maps_pixel_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + }, + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "pixel", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test", + "--test-machine-name", + "${buildername}", + "--git-revision=${got_revision}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_pixel_skia_gold_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + }, + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "screenshot_sync", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_screenshot_sync_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + }, + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ "gpu_process", "--show-stdout", "--browser=release", @@ -17985,6 +18277,256 @@ }, { "args": [ + "context_lost", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_context_lost_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:3e9b", + "os": "Mac-10.15.7" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "depth_capture", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_depth_capture_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:3e9b", + "os": "Mac-10.15.7" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "gpu_process", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_gpu_process_launch_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:3e9b", + "os": "Mac-10.15.7" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "hardware_accelerated_feature", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_hardware_accelerated_feature_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:3e9b", + "os": "Mac-10.15.7" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "maps", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test", + "--test-machine-name", + "${buildername}", + "--git-revision=${got_revision}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_maps_pixel_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:3e9b", + "os": "Mac-10.15.7" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "pixel", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test", + "--test-machine-name", + "${buildername}", + "--git-revision=${got_revision}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_pixel_skia_gold_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:3e9b", + "os": "Mac-10.15.7" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "screenshot_sync", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_screenshot_sync_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:3e9b", + "os": "Mac-10.15.7" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ "gpu_process", "--show-stdout", "--browser=release", @@ -18926,6 +19468,256 @@ }, { "args": [ + "context_lost", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_context_lost_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "depth_capture", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_depth_capture_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "gpu_process", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_gpu_process_launch_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "hardware_accelerated_feature", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_hardware_accelerated_feature_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "maps", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test", + "--test-machine-name", + "${buildername}", + "--git-revision=${got_revision}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_maps_pixel_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "pixel", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test", + "--test-machine-name", + "${buildername}", + "--git-revision=${got_revision}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_pixel_skia_gold_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "screenshot_sync", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_screenshot_sync_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ "gpu_process", "--show-stdout", "--browser=release", @@ -21060,6 +21852,270 @@ }, { "args": [ + "context_lost", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_context_lost_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "depth_capture", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_depth_capture_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "gpu_process", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_gpu_process_launch_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "hardware_accelerated_feature", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_hardware_accelerated_feature_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "maps", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test", + "--test-machine-name", + "${buildername}", + "--git-revision=${got_revision}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_maps_pixel_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "pixel", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test", + "--test-machine-name", + "${buildername}", + "--git-revision=${got_revision}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_pixel_skia_gold_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "screenshot_sync", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_screenshot_sync_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "1002:6821", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ "gpu_process", "--show-stdout", "--browser=release", @@ -22061,6 +23117,270 @@ }, { "args": [ + "context_lost", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_context_lost_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "10de:0fe9", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "depth_capture", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_depth_capture_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "10de:0fe9", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "gpu_process", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_gpu_process_launch_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "10de:0fe9", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "hardware_accelerated_feature", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_hardware_accelerated_feature_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "10de:0fe9", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "maps", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test", + "--test-machine-name", + "${buildername}", + "--git-revision=${got_revision}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_maps_pixel_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "10de:0fe9", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "pixel", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test", + "--test-machine-name", + "${buildername}", + "--git-revision=${got_revision}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_pixel_skia_gold_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "10de:0fe9", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "screenshot_sync", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_screenshot_sync_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "10de:0fe9", + "hidpi": "1", + "os": "Mac-10.14.6", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ "gpu_process", "--show-stdout", "--browser=release", @@ -22948,6 +24268,263 @@ }, { "args": [ + "context_lost", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_context_lost_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-11.0", + "pool": "chromium.tests.mac-arm64" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "depth_capture", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_depth_capture_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-11.0", + "pool": "chromium.tests.mac-arm64" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "gpu_process", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_gpu_process_launch_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-11.0", + "pool": "chromium.tests.mac-arm64" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "hardware_accelerated_feature", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_hardware_accelerated_feature_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-11.0", + "pool": "chromium.tests.mac-arm64" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "maps", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test", + "--test-machine-name", + "${buildername}", + "--git-revision=${got_revision}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_maps_pixel_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-11.0", + "pool": "chromium.tests.mac-arm64" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "pixel", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test", + "--test-machine-name", + "${buildername}", + "--git-revision=${got_revision}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_pixel_skia_gold_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-11.0", + "pool": "chromium.tests.mac-arm64" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "screenshot_sync", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --disable-features=UseSkiaRenderer", + "--dont-restore-color-profile-after-test" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gl_renderer_screenshot_sync_tests", + "resultdb": { + "enable": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-11.0", + "pool": "chromium.tests.mac-arm64" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ "gpu_process", "--show-stdout", "--browser=release",
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json index 3ec3292..3377cb3 100644 --- a/testing/buildbot/chromium.mac.json +++ b/testing/buildbot/chromium.mac.json
@@ -5218,7 +5218,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5235,7 +5235,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5255,7 +5255,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5273,7 +5273,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5290,7 +5290,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5307,7 +5307,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5324,7 +5324,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5341,7 +5341,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5358,7 +5358,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5375,7 +5375,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5393,7 +5393,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5410,7 +5410,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5427,7 +5427,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5444,7 +5444,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -5465,7 +5465,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5482,7 +5482,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5499,7 +5499,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5516,7 +5516,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5533,7 +5533,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5550,7 +5550,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5567,7 +5567,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5584,7 +5584,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -5602,7 +5602,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5619,7 +5619,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5636,7 +5636,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5653,7 +5653,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5670,7 +5670,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5687,7 +5687,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5704,7 +5704,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5721,7 +5721,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5738,7 +5738,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5755,7 +5755,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5772,7 +5772,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5789,7 +5789,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5806,7 +5806,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5823,7 +5823,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5840,7 +5840,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5857,7 +5857,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5874,7 +5874,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5891,7 +5891,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5908,7 +5908,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5925,7 +5925,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5942,7 +5942,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -5960,7 +5960,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5977,7 +5977,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5994,7 +5994,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6011,7 +6011,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6028,7 +6028,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6045,7 +6045,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6062,7 +6062,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6079,7 +6079,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6096,7 +6096,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6113,7 +6113,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6130,7 +6130,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6147,7 +6147,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6164,7 +6164,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6181,7 +6181,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6198,7 +6198,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6215,7 +6215,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6232,7 +6232,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6249,7 +6249,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6266,7 +6266,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6283,7 +6283,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6300,7 +6300,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6317,7 +6317,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6334,7 +6334,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6351,7 +6351,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6368,7 +6368,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6385,7 +6385,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6402,7 +6402,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6419,7 +6419,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6436,7 +6436,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6453,7 +6453,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6470,7 +6470,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6487,7 +6487,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6504,7 +6504,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6521,7 +6521,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6538,7 +6538,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6555,7 +6555,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6573,7 +6573,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6590,7 +6590,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6614,7 +6614,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6642,7 +6642,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -6665,7 +6665,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6687,7 +6687,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6708,7 +6708,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6729,7 +6729,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6754,7 +6754,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "hard_timeout": 960, @@ -6777,7 +6777,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "idempotent": false, @@ -6803,7 +6803,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "idempotent": false, @@ -6828,7 +6828,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.15" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.updater.json b/testing/buildbot/chromium.updater.json index 7c89535f..450418ac 100644 --- a/testing/buildbot/chromium.updater.json +++ b/testing/buildbot/chromium.updater.json
@@ -57,7 +57,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.11" + "os": "Mac-10.11", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -78,7 +79,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.11" + "os": "Mac-10.11", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98,8 +100,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:0a2e", - "os": "Mac-10.12.6" + "os": "Mac-10.12", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -120,8 +122,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "8086:0a2e", - "os": "Mac-10.12.6" + "os": "Mac-10.12", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -141,7 +143,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.13", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -162,7 +165,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.13", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -182,7 +186,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.13", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -203,7 +208,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.13.6" + "os": "Mac-10.13", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -223,7 +229,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.14", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -244,7 +251,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.14", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -264,7 +272,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.15" + "os": "Mac-10.15", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -285,7 +294,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-10.15" + "os": "Mac-10.15", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -305,7 +315,9 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-11.0|Mac-10.16" + "cpu": "x86-64", + "os": "Mac-11", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -326,7 +338,9 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Mac-11.0|Mac-10.16" + "cpu": "x86-64", + "os": "Mac-11", + "pool": "chromium.updater.mac" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 5ca82fd..3685a5a 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -2805,6 +2805,84 @@ }, }, + # TODO(crbug.com/894929): remove it when SkiaRenderer is shipped on macOS. + 'gpu_gl_renderer_full_telemetry_tests': { + 'gl_renderer_context_lost_tests': { + 'telemetry_test_name': 'context_lost', + 'args': [ + '--extra-browser-args=--disable-features=UseSkiaRenderer', + ], + 'mixins': [ + 'enable_resultdb', + ], + }, + 'gl_renderer_depth_capture_tests': { + 'telemetry_test_name': 'depth_capture', + 'args': [ + '--extra-browser-args=--disable-features=UseSkiaRenderer', + ], + 'mixins': [ + 'enable_resultdb', + ], + }, + 'gl_renderer_gpu_process_launch_tests': { + 'telemetry_test_name': 'gpu_process', + 'args': [ + '--extra-browser-args=--disable-features=UseSkiaRenderer', + ], + 'mixins': [ + 'enable_resultdb', + ], + }, + 'gl_renderer_hardware_accelerated_feature_tests': { + 'telemetry_test_name': 'hardware_accelerated_feature', + 'args': [ + '--extra-browser-args=--disable-features=UseSkiaRenderer', + ], + 'mixins': [ + 'enable_resultdb', + ], + }, + 'gl_renderer_maps_pixel_tests': { + 'telemetry_test_name': 'maps', + 'args': [ + '--dont-restore-color-profile-after-test', + '--test-machine-name', + '${buildername}', + '--extra-browser-args=--disable-features=UseSkiaRenderer', + ], + 'mixins': [ + 'chrome-gpu-gold-service-account', + 'enable_resultdb', + 'skia_gold_test', + ], + }, + 'gl_renderer_pixel_skia_gold_tests': { + 'telemetry_test_name': 'pixel', + 'args': [ + '--dont-restore-color-profile-after-test', + '--test-machine-name', + '${buildername}', + '--extra-browser-args=--disable-features=UseSkiaRenderer', + ], + 'mixins': [ + 'chrome-gpu-gold-service-account', + 'enable_resultdb', + 'skia_gold_test', + ], + }, + 'gl_renderer_screenshot_sync_tests': { + 'telemetry_test_name': 'screenshot_sync', + 'args': [ + '--dont-restore-color-profile-after-test', + '--extra-browser-args=--disable-features=UseSkiaRenderer', + ], + 'mixins': [ + 'enable_resultdb', + ], + }, + }, + # Very small set of test that exercise GLRenderer and produce pixels for CQ. # For use where SkiaRenderer is enabled by field trial or default. 'gpu_gl_renderer_small_telemetry_tests': { @@ -6154,6 +6232,8 @@ 'gpu_webgl_conformance_metal_passthrough_telemetry_tests', 'gpu_webgl_conformance_validating_telemetry_tests', 'gpu_webgl_conformance_swangle_passthrough_representative_telemetry_tests', + # TODO(crbug.com/894929): remove it when SkiaRenderer is shipped on mac. + 'gpu_gl_renderer_full_telemetry_tests', ], 'gpu_fyi_optional_linux_telemetry_tests': [
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 793a156..a4b958e 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -5109,7 +5109,7 @@ }, 'Mac10.13 Tests (dbg)': { 'mixins': [ - 'mac_10.13', + 'mac_10.15', ], 'test_suites': { 'gtest_tests': 'chromium_mac_gtests', @@ -5596,6 +5596,8 @@ 'name': 'chromium.updater', 'mixins': ['chromium-tester-service-account'], 'machines': { + # TODO(crbug.com/1120821): switch to new pool + # when arm64 device is configured. 'mac-arm64-updater-tester-rel': { 'mixins': [ 'mac_arm64_apple_dtk_experimental', @@ -5606,67 +5608,103 @@ }, }, 'mac10.11-updater-tester-rel': { - 'mixins': [ - 'mac_10.11', - ], 'test_suites': { 'gtest_tests': 'updater_gtests', 'isolated_scripts': 'updater_isolated_scripts', }, + 'swarming': { + 'dimension_sets': [ + { + 'pool': 'chromium.updater.mac', + 'os': 'Mac-10.11', + } + ] + }, }, 'mac10.12-updater-tester-rel': { - 'mixins': [ - 'mac_mini_10.12', - ], 'test_suites': { 'gtest_tests': 'updater_gtests', 'isolated_scripts': 'updater_isolated_scripts', }, + 'swarming': { + 'dimension_sets': [ + { + 'pool': 'chromium.updater.mac', + 'os': 'Mac-10.12', + } + ] + }, }, 'mac10.13-updater-tester-dbg': { - 'mixins': [ - 'mac_10.13', - ], 'test_suites': { 'gtest_tests': 'updater_gtests', 'isolated_scripts': 'updater_isolated_scripts', }, + 'swarming': { + 'dimension_sets': [ + { + 'pool': 'chromium.updater.mac', + 'os': 'Mac-10.13', + } + ] + }, }, 'mac10.13-updater-tester-rel': { - 'mixins': [ - 'mac_10.13', - ], 'test_suites': { 'gtest_tests': 'updater_gtests', 'isolated_scripts': 'updater_isolated_scripts', }, + 'swarming': { + 'dimension_sets': [ + { + 'pool': 'chromium.updater.mac', + 'os': 'Mac-10.13', + } + ] + }, }, 'mac10.14-updater-tester-rel': { - 'mixins': [ - 'mac_10.14', - ], 'test_suites': { 'gtest_tests': 'updater_gtests', 'isolated_scripts': 'updater_isolated_scripts', }, + 'swarming': { + 'dimension_sets': [ + { + 'pool': 'chromium.updater.mac', + 'os': 'Mac-10.14', + } + ] + }, }, 'mac10.15-updater-tester-rel': { - 'mixins': [ - 'mac_10.15', - ], 'test_suites': { 'gtest_tests': 'updater_gtests', 'isolated_scripts': 'updater_isolated_scripts', }, + 'swarming': { + 'dimension_sets': [ + { + 'pool': 'chromium.updater.mac', + 'os': 'Mac-10.15', + } + ] + }, }, 'mac11.0-updater-tester-rel': { - 'mixins': [ - 'mac_11.0_beta', - ], 'test_suites': { 'gtest_tests': 'updater_gtests', 'isolated_scripts': 'updater_isolated_scripts', }, + 'swarming': { + 'dimension_sets': [ + { + 'pool': 'chromium.updater.mac', + 'os': 'Mac-11', + 'cpu': 'x86-64', + } + ] + }, }, 'win10-updater-tester-dbg': { 'mixins': [
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 83ff3b1..7f22e352 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -7123,6 +7123,7 @@ "android", "android_weblayer", "linux", + "mac", "windows" ], "experiments": [
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium index dbba8cf..d6eacc0 100644 --- a/third_party/abseil-cpp/README.chromium +++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@ License: Apache 2.0 License File: LICENSE Version: 0 -Revision: 58a9c6d53f93078101c2c0bd98d2951e74328a55 +Revision: 2aa00ab2f22cf4e0e85e622c3254d483b2ddfb30 Security Critical: yes Description:
diff --git a/third_party/abseil-cpp/absl/base/BUILD.bazel b/third_party/abseil-cpp/absl/base/BUILD.bazel index 5d67a50..7d2ff308 100644 --- a/third_party/abseil-cpp/absl/base/BUILD.bazel +++ b/third_party/abseil-cpp/absl/base/BUILD.bazel
@@ -479,6 +479,7 @@ copts = ABSL_DEFAULT_COPTS, linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ + ":base", ":config", ":core_headers", ],
diff --git a/third_party/abseil-cpp/absl/base/BUILD.gn b/third_party/abseil-cpp/absl/base/BUILD.gn index 97e1391..9d9dfca 100644 --- a/third_party/abseil-cpp/absl/base/BUILD.gn +++ b/third_party/abseil-cpp/absl/base/BUILD.gn
@@ -225,6 +225,7 @@ "internal/unaligned_access.h", ] public_deps = [ + ":base", ":config", ":core_headers", ]
diff --git a/third_party/abseil-cpp/absl/base/CMakeLists.txt b/third_party/abseil-cpp/absl/base/CMakeLists.txt index 3d930b8..981b8cc0 100644 --- a/third_party/abseil-cpp/absl/base/CMakeLists.txt +++ b/third_party/abseil-cpp/absl/base/CMakeLists.txt
@@ -418,6 +418,7 @@ COPTS ${ABSL_DEFAULT_COPTS} DEPS + absl::base absl::config absl::core_headers PUBLIC
diff --git a/third_party/abseil-cpp/absl/base/internal/endian.h b/third_party/abseil-cpp/absl/base/internal/endian.h index 9677530..dad0e9a 100644 --- a/third_party/abseil-cpp/absl/base/internal/endian.h +++ b/third_party/abseil-cpp/absl/base/internal/endian.h
@@ -26,6 +26,7 @@ #endif #include <cstdint> +#include "absl/base/casts.h" #include "absl/base/config.h" #include "absl/base/internal/unaligned_access.h" #include "absl/base/port.h" @@ -173,6 +174,36 @@ #endif /* ENDIAN */ +inline uint8_t FromHost(uint8_t x) { return x; } +inline uint16_t FromHost(uint16_t x) { return FromHost16(x); } +inline uint32_t FromHost(uint32_t x) { return FromHost32(x); } +inline uint64_t FromHost(uint64_t x) { return FromHost64(x); } +inline uint8_t ToHost(uint8_t x) { return x; } +inline uint16_t ToHost(uint16_t x) { return ToHost16(x); } +inline uint32_t ToHost(uint32_t x) { return ToHost32(x); } +inline uint64_t ToHost(uint64_t x) { return ToHost64(x); } + +inline int8_t FromHost(int8_t x) { return x; } +inline int16_t FromHost(int16_t x) { + return bit_cast<int16_t>(FromHost16(bit_cast<uint16_t>(x))); +} +inline int32_t FromHost(int32_t x) { + return bit_cast<int32_t>(FromHost32(bit_cast<uint32_t>(x))); +} +inline int64_t FromHost(int64_t x) { + return bit_cast<int64_t>(FromHost64(bit_cast<uint64_t>(x))); +} +inline int8_t ToHost(int8_t x) { return x; } +inline int16_t ToHost(int16_t x) { + return bit_cast<int16_t>(ToHost16(bit_cast<uint16_t>(x))); +} +inline int32_t ToHost(int32_t x) { + return bit_cast<int32_t>(ToHost32(bit_cast<uint32_t>(x))); +} +inline int64_t ToHost(int64_t x) { + return bit_cast<int64_t>(ToHost64(bit_cast<uint64_t>(x))); +} + // Functions to do unaligned loads and stores in little-endian order. inline uint16_t Load16(const void *p) { return ToHost16(ABSL_INTERNAL_UNALIGNED_LOAD16(p)); @@ -233,6 +264,36 @@ #endif /* ENDIAN */ +inline uint8_t FromHost(uint8_t x) { return x; } +inline uint16_t FromHost(uint16_t x) { return FromHost16(x); } +inline uint32_t FromHost(uint32_t x) { return FromHost32(x); } +inline uint64_t FromHost(uint64_t x) { return FromHost64(x); } +inline uint8_t ToHost(uint8_t x) { return x; } +inline uint16_t ToHost(uint16_t x) { return ToHost16(x); } +inline uint32_t ToHost(uint32_t x) { return ToHost32(x); } +inline uint64_t ToHost(uint64_t x) { return ToHost64(x); } + +inline int8_t FromHost(int8_t x) { return x; } +inline int16_t FromHost(int16_t x) { + return bit_cast<int16_t>(FromHost16(bit_cast<uint16_t>(x))); +} +inline int32_t FromHost(int32_t x) { + return bit_cast<int32_t>(FromHost32(bit_cast<uint32_t>(x))); +} +inline int64_t FromHost(int64_t x) { + return bit_cast<int64_t>(FromHost64(bit_cast<uint64_t>(x))); +} +inline int8_t ToHost(int8_t x) { return x; } +inline int16_t ToHost(int16_t x) { + return bit_cast<int16_t>(ToHost16(bit_cast<uint16_t>(x))); +} +inline int32_t ToHost(int32_t x) { + return bit_cast<int32_t>(ToHost32(bit_cast<uint32_t>(x))); +} +inline int64_t ToHost(int64_t x) { + return bit_cast<int64_t>(ToHost64(bit_cast<uint64_t>(x))); +} + // Functions to do unaligned loads and stores in big-endian order. inline uint16_t Load16(const void *p) { return ToHost16(ABSL_INTERNAL_UNALIGNED_LOAD16(p));
diff --git a/third_party/abseil-cpp/absl/cleanup/cleanup.h b/third_party/abseil-cpp/absl/cleanup/cleanup.h index 5a4bc54..8ebf1e9b 100644 --- a/third_party/abseil-cpp/absl/cleanup/cleanup.h +++ b/third_party/abseil-cpp/absl/cleanup/cleanup.h
@@ -41,7 +41,7 @@ // // Data data; // while (ReadData(source_file, &data)) { -// if (data.IsBad()) { +// if (!data.IsGood()) { // absl::Status result = absl::FailedPreconditionError("Read bad data"); // return result; // Both cleanups execute // } @@ -87,7 +87,7 @@ public: Cleanup(Callback callback) // NOLINT - : storage_(std::move(callback), /*engaged=*/true) {} + : storage_(std::move(callback), /* is_callback_engaged = */ true) {} Cleanup(Cleanup&& other) = default;
diff --git a/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h b/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h index b68e3dd..b4c4073 100644 --- a/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +++ b/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h
@@ -45,12 +45,14 @@ public: Storage() = delete; - Storage(Callback callback, bool engaged) - : callback_(std::move(callback)), engaged_(engaged) {} + Storage(Callback callback, bool is_callback_engaged) + : callback_(std::move(callback)), + is_callback_engaged_(is_callback_engaged) {} Storage(Storage&& other) : callback_(std::move(other.callback_)), - engaged_(absl::exchange(other.engaged_, false)) {} + is_callback_engaged_( + absl::exchange(other.is_callback_engaged_, false)) {} Storage(const Storage& other) = delete; @@ -58,9 +60,9 @@ Storage& operator=(const Storage& other) = delete; - bool IsCallbackEngaged() const { return engaged_; } + bool IsCallbackEngaged() const { return is_callback_engaged_; } - void DisengageCallback() { engaged_ = false; } + void DisengageCallback() { is_callback_engaged_ = false; } void InvokeCallback() ABSL_NO_THREAD_SAFETY_ANALYSIS { std::move(callback_)(); @@ -68,7 +70,7 @@ private: Callback callback_; - bool engaged_; + bool is_callback_engaged_; }; } // namespace cleanup_internal
diff --git a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc index e4484fb..7024e54 100644 --- a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +++ b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc
@@ -72,6 +72,7 @@ total_probe_length.store(0, std::memory_order_relaxed); hashes_bitwise_or.store(0, std::memory_order_relaxed); hashes_bitwise_and.store(~size_t{}, std::memory_order_relaxed); + hashes_bitwise_xor.store(0, std::memory_order_relaxed); create_time = absl::Now(); // The inliner makes hardcoded skip_count difficult (especially when combined @@ -235,6 +236,7 @@ info->hashes_bitwise_and.fetch_and(hash, std::memory_order_relaxed); info->hashes_bitwise_or.fetch_or(hash, std::memory_order_relaxed); + info->hashes_bitwise_xor.fetch_xor(hash, std::memory_order_relaxed); info->max_probe_length.store( std::max(info->max_probe_length.load(std::memory_order_relaxed), probe_length),
diff --git a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h index 394348da..65d3fb5 100644 --- a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +++ b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h
@@ -78,6 +78,7 @@ std::atomic<size_t> total_probe_length; std::atomic<size_t> hashes_bitwise_or; std::atomic<size_t> hashes_bitwise_and; + std::atomic<size_t> hashes_bitwise_xor; // `HashtablezSampler` maintains intrusive linked lists for all samples. See // comments on `HashtablezSampler::all_` for details on these. `init_mu`
diff --git a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc index 8d10a1e..5f4c83b7 100644 --- a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +++ b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc
@@ -89,6 +89,7 @@ EXPECT_EQ(info.total_probe_length.load(), 0); EXPECT_EQ(info.hashes_bitwise_or.load(), 0); EXPECT_EQ(info.hashes_bitwise_and.load(), ~size_t{}); + EXPECT_EQ(info.hashes_bitwise_xor.load(), 0); EXPECT_GE(info.create_time, test_start); info.capacity.store(1, std::memory_order_relaxed); @@ -98,6 +99,7 @@ info.total_probe_length.store(1, std::memory_order_relaxed); info.hashes_bitwise_or.store(1, std::memory_order_relaxed); info.hashes_bitwise_and.store(1, std::memory_order_relaxed); + info.hashes_bitwise_xor.store(1, std::memory_order_relaxed); info.create_time = test_start - absl::Hours(20); info.PrepareForSampling(); @@ -109,6 +111,7 @@ EXPECT_EQ(info.total_probe_length.load(), 0); EXPECT_EQ(info.hashes_bitwise_or.load(), 0); EXPECT_EQ(info.hashes_bitwise_and.load(), ~size_t{}); + EXPECT_EQ(info.hashes_bitwise_xor.load(), 0); EXPECT_GE(info.create_time, test_start); } @@ -133,14 +136,17 @@ EXPECT_EQ(info.max_probe_length.load(), 6); EXPECT_EQ(info.hashes_bitwise_and.load(), 0x0000FF00); EXPECT_EQ(info.hashes_bitwise_or.load(), 0x0000FF00); + EXPECT_EQ(info.hashes_bitwise_xor.load(), 0x0000FF00); RecordInsertSlow(&info, 0x000FF000, 4 * kProbeLength); EXPECT_EQ(info.max_probe_length.load(), 6); EXPECT_EQ(info.hashes_bitwise_and.load(), 0x0000F000); EXPECT_EQ(info.hashes_bitwise_or.load(), 0x000FFF00); + EXPECT_EQ(info.hashes_bitwise_xor.load(), 0x000F0F00); RecordInsertSlow(&info, 0x00FF0000, 12 * kProbeLength); EXPECT_EQ(info.max_probe_length.load(), 12); EXPECT_EQ(info.hashes_bitwise_and.load(), 0x00000000); EXPECT_EQ(info.hashes_bitwise_or.load(), 0x00FFFF00); + EXPECT_EQ(info.hashes_bitwise_xor.load(), 0x00F00F00); } TEST(HashtablezInfoTest, RecordErase) {
diff --git a/third_party/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h b/third_party/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h index 76ee95e6..3f90ad7 100644 --- a/third_party/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h +++ b/third_party/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h
@@ -16,6 +16,7 @@ #define ABSL_CONTAINER_INTERNAL_UNORDERED_MAP_CONSTRUCTOR_TEST_H_ #include <algorithm> +#include <unordered_map> #include <vector> #include "gmock/gmock.h"
diff --git a/third_party/abseil-cpp/absl/hash/BUILD.bazel b/third_party/abseil-cpp/absl/hash/BUILD.bazel index 90c6c8a..4b2c220f 100644 --- a/third_party/abseil-cpp/absl/hash/BUILD.bazel +++ b/third_party/abseil-cpp/absl/hash/BUILD.bazel
@@ -38,6 +38,7 @@ deps = [ ":city", ":wyhash", + "//absl/base:config", "//absl/base:core_headers", "//absl/base:endian", "//absl/container:fixed_array",
diff --git a/third_party/abseil-cpp/absl/hash/BUILD.gn b/third_party/abseil-cpp/absl/hash/BUILD.gn index 7a69e67..3e239b4c 100644 --- a/third_party/abseil-cpp/absl/hash/BUILD.gn +++ b/third_party/abseil-cpp/absl/hash/BUILD.gn
@@ -14,6 +14,7 @@ deps = [ ":city", ":wyhash", + "//third_party/abseil-cpp/absl/base:config", "//third_party/abseil-cpp/absl/base:core_headers", "//third_party/abseil-cpp/absl/base:endian", "//third_party/abseil-cpp/absl/container:fixed_array",
diff --git a/third_party/abseil-cpp/absl/hash/CMakeLists.txt b/third_party/abseil-cpp/absl/hash/CMakeLists.txt index 6d19877..b43bfa5 100644 --- a/third_party/abseil-cpp/absl/hash/CMakeLists.txt +++ b/third_party/abseil-cpp/absl/hash/CMakeLists.txt
@@ -26,6 +26,7 @@ ${ABSL_DEFAULT_COPTS} DEPS absl::city + absl::config absl::core_headers absl::endian absl::fixed_array
diff --git a/third_party/abseil-cpp/absl/hash/internal/hash.h b/third_party/abseil-cpp/absl/hash/internal/hash.h index eb3471d..7fb0af0 100644 --- a/third_party/abseil-cpp/absl/hash/internal/hash.h +++ b/third_party/abseil-cpp/absl/hash/internal/hash.h
@@ -38,7 +38,8 @@ #include <utility> #include <vector> -#include "absl/base/internal/endian.h" +#include "absl/base/config.h" +#include "absl/base/internal/unaligned_access.h" #include "absl/base/port.h" #include "absl/container/fixed_array.h" #include "absl/hash/internal/wyhash.h" @@ -804,26 +805,54 @@ size_t len); // Reads 9 to 16 bytes from p. - // The first 8 bytes are in .first, the rest (zero padded) bytes are in - // .second. + // The least significant 8 bytes are in .first, the rest (zero padded) bytes + // are in .second. static std::pair<uint64_t, uint64_t> Read9To16(const unsigned char* p, size_t len) { - uint64_t high = little_endian::Load64(p + len - 8); - return {little_endian::Load64(p), high >> (128 - len * 8)}; + uint64_t low_mem = absl::base_internal::UnalignedLoad64(p); + uint64_t high_mem = absl::base_internal::UnalignedLoad64(p + len - 8); +#ifdef ABSL_IS_LITTLE_ENDIAN + uint64_t most_significant = high_mem; + uint64_t least_significant = low_mem; +#else + uint64_t most_significant = low_mem; + uint64_t least_significant = high_mem; +#endif + return {least_significant, most_significant >> (128 - len * 8)}; } // Reads 4 to 8 bytes from p. Zero pads to fill uint64_t. static uint64_t Read4To8(const unsigned char* p, size_t len) { - return (static_cast<uint64_t>(little_endian::Load32(p + len - 4)) - << (len - 4) * 8) | - little_endian::Load32(p); + uint32_t low_mem = absl::base_internal::UnalignedLoad32(p); + uint32_t high_mem = absl::base_internal::UnalignedLoad32(p + len - 4); +#ifdef ABSL_IS_LITTLE_ENDIAN + uint32_t most_significant = high_mem; + uint32_t least_significant = low_mem; +#else + uint32_t most_significant = low_mem; + uint32_t least_significant = high_mem; +#endif + return (static_cast<uint64_t>(most_significant) << (len - 4) * 8) | + least_significant; } // Reads 1 to 3 bytes from p. Zero pads to fill uint32_t. static uint32_t Read1To3(const unsigned char* p, size_t len) { - return static_cast<uint32_t>((p[0]) | // - (p[len / 2] << (len / 2 * 8)) | // - (p[len - 1] << ((len - 1) * 8))); + unsigned char mem0 = p[0]; + unsigned char mem1 = p[len / 2]; + unsigned char mem2 = p[len - 1]; +#ifdef ABSL_IS_LITTLE_ENDIAN + unsigned char significant2 = mem2; + unsigned char significant1 = mem1; + unsigned char significant0 = mem0; +#else + unsigned char significant2 = mem0; + unsigned char significant1 = mem1; + unsigned char significant0 = mem2; +#endif + return static_cast<uint32_t>(significant0 | // + (significant1 << (len / 2 * 8)) | // + (significant2 << ((len - 1) * 8))); } ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t Mix(uint64_t state, uint64_t v) {
diff --git a/third_party/abseil-cpp/absl/random/CMakeLists.txt b/third_party/abseil-cpp/absl/random/CMakeLists.txt index 7d7bec8..13093d6 100644 --- a/third_party/abseil-cpp/absl/random/CMakeLists.txt +++ b/third_party/abseil-cpp/absl/random/CMakeLists.txt
@@ -611,6 +611,7 @@ ${ABSL_DEFAULT_LINKOPTS} DEPS absl::config + absl::endian TESTONLY ) @@ -758,6 +759,7 @@ LINKOPTS ${ABSL_DEFAULT_LINKOPTS} DEPS + absl::endian absl::random_internal_iostream_state_saver absl::random_internal_randen absl::raw_logging_internal @@ -1119,6 +1121,7 @@ LINKOPTS ${ABSL_DEFAULT_LINKOPTS} DEPS + absl::endian absl::random_internal_randen_slow gtest_main )
diff --git a/third_party/abseil-cpp/absl/random/internal/BUILD.bazel b/third_party/abseil-cpp/absl/random/internal/BUILD.bazel index 2c1a5f4..4e778ae 100644 --- a/third_party/abseil-cpp/absl/random/internal/BUILD.bazel +++ b/third_party/abseil-cpp/absl/random/internal/BUILD.bazel
@@ -124,7 +124,10 @@ ], copts = ABSL_DEFAULT_COPTS, linkopts = ABSL_DEFAULT_LINKOPTS, - deps = ["//absl/base:config"], + deps = [ + "//absl/base:config", + "//absl/base:endian", + ], ) cc_library( @@ -242,6 +245,7 @@ deps = [ ":iostream_state_saver", ":randen", + "//absl/base:endian", "//absl/meta:type_traits", ], ) @@ -606,6 +610,7 @@ deps = [ ":platform", ":randen_slow", + "//absl/base:endian", "@com_google_googletest//:gtest_main", ], )
diff --git a/third_party/abseil-cpp/absl/random/internal/BUILD.gn b/third_party/abseil-cpp/absl/random/internal/BUILD.gn index 961f03f..8dbe709 100644 --- a/third_party/abseil-cpp/absl/random/internal/BUILD.gn +++ b/third_party/abseil-cpp/absl/random/internal/BUILD.gn
@@ -63,7 +63,10 @@ absl_source_set("explicit_seed_seq") { testonly = true public = [ "explicit_seed_seq.h" ] - deps = [ "//third_party/abseil-cpp/absl/base:config" ] + deps = [ + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/base:endian", + ] } absl_source_set("sequence_urbg") { @@ -146,6 +149,7 @@ deps = [ ":iostream_state_saver", ":randen", + "//third_party/abseil-cpp/absl/base:endian", "//third_party/abseil-cpp/absl/meta:type_traits", ] }
diff --git a/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq.h b/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq.h index 6a743eaf..e3aa31a1 100644 --- a/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq.h +++ b/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq.h
@@ -23,6 +23,7 @@ #include <vector> #include "absl/base/config.h" +#include "absl/base/internal/endian.h" namespace absl { ABSL_NAMESPACE_BEGIN @@ -73,7 +74,7 @@ template <typename OutIterator> void generate(OutIterator begin, OutIterator end) { for (size_t index = 0; begin != end; begin++) { - *begin = state_.empty() ? 0 : state_[index++]; + *begin = state_.empty() ? 0 : little_endian::FromHost32(state_[index++]); if (index >= state_.size()) { index = 0; }
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_engine.h b/third_party/abseil-cpp/absl/random/internal/randen_engine.h index 6b33731..92bb8905 100644 --- a/third_party/abseil-cpp/absl/random/internal/randen_engine.h +++ b/third_party/abseil-cpp/absl/random/internal/randen_engine.h
@@ -23,6 +23,7 @@ #include <limits> #include <type_traits> +#include "absl/base/internal/endian.h" #include "absl/meta/type_traits.h" #include "absl/random/internal/iostream_state_saver.h" #include "absl/random/internal/randen.h" @@ -76,7 +77,7 @@ impl_.Generate(state_); } - return state_[next_++]; + return little_endian::ToHost(state_[next_++]); } template <class SeedSequence> @@ -181,7 +182,8 @@ // In the case that `elem` is `uint8_t`, it must be cast to something // larger so that it prints as an integer rather than a character. For // simplicity, apply the cast all circumstances. - os << static_cast<numeric_type>(elem) << os.fill(); + os << static_cast<numeric_type>(little_endian::FromHost(elem)) + << os.fill(); } os << engine.next_; return os; @@ -200,7 +202,7 @@ // necessary to read a wider type and then cast it to uint8_t. numeric_type value; is >> value; - elem = static_cast<result_type>(value); + elem = little_endian::ToHost(static_cast<result_type>(value)); } is >> next; if (is.fail()) {
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_slow_test.cc b/third_party/abseil-cpp/absl/random/internal/randen_slow_test.cc index 4a53583..4861ffa 100644 --- a/third_party/abseil-cpp/absl/random/internal/randen_slow_test.cc +++ b/third_party/abseil-cpp/absl/random/internal/randen_slow_test.cc
@@ -17,6 +17,7 @@ #include <cstring> #include "gtest/gtest.h" +#include "absl/base/internal/endian.h" #include "absl/random/internal/randen_traits.h" namespace { @@ -56,7 +57,7 @@ uint64_t* id = d.state; for (const auto& elem : kGolden) { - EXPECT_EQ(elem, *id++); + EXPECT_EQ(absl::little_endian::FromHost64(elem), *id++); } }
diff --git a/third_party/abseil-cpp/absl/strings/cord.cc b/third_party/abseil-cpp/absl/strings/cord.cc index 39191ef..93533757 100644 --- a/third_party/abseil-cpp/absl/strings/cord.cc +++ b/third_party/abseil-cpp/absl/strings/cord.cc
@@ -495,7 +495,9 @@ data_ = src.data_; if (is_tree()) { + data_.set_profiled(false); CordRep::Ref(tree()); + clear_cordz_info(); } } @@ -509,12 +511,6 @@ // -------------------------------------------------------------------- // Constructors and destructors -Cord::Cord(const Cord& src) : contents_(src.contents_) { - if (CordRep* tree = contents_.tree()) { - CordRep::Ref(tree); - } -} - Cord::Cord(absl::string_view src) { const size_t n = src.size(); if (n <= InlineRep::kMaxInline) {
diff --git a/third_party/abseil-cpp/absl/strings/cord.h b/third_party/abseil-cpp/absl/strings/cord.h index aefb5e5..fa9cb91 100644 --- a/third_party/abseil-cpp/absl/strings/cord.h +++ b/third_party/abseil-cpp/absl/strings/cord.h
@@ -25,7 +25,7 @@ // // Because a Cord consists of these chunks, data can be added to or removed from // a Cord during its lifetime. Chunks may also be shared between Cords. Unlike a -// `std::string`, a Cord can therefore accomodate data that changes over its +// `std::string`, a Cord can therefore accommodate data that changes over its // lifetime, though it's not quite "mutable"; it can change only in the // attachment, detachment, or rearrangement of chunks of its constituent data. // @@ -755,6 +755,23 @@ bool is_tree() const { return data_.is_tree(); } + // Returns true if the Cord is being profiled by cordz. + bool is_profiled() const { return data_.is_tree() && data_.is_profiled(); } + + // Returns the profiled CordzInfo, or nullptr if not sampled. + absl::cord_internal::CordzInfo* cordz_info() const { + return data_.cordz_info(); + } + + // Sets the profiled CordzInfo. `cordz_info` must not be null. + void set_cordz_info(cord_internal::CordzInfo* cordz_info) { + assert(cordz_info != nullptr); + data_.set_cordz_info(cordz_info); + } + + // Resets the current cordz_info to null / empty. + void clear_cordz_info() { data_.clear_cordz_info(); } + private: friend class Cord; @@ -921,8 +938,12 @@ constexpr Cord::InlineRep::InlineRep(cord_internal::InlineData data) : data_(data) {} -inline Cord::InlineRep::InlineRep(const Cord::InlineRep& src) { - data_ = src.data_; +inline Cord::InlineRep::InlineRep(const Cord::InlineRep& src) + : data_(src.data_) { + if (is_tree()) { + data_.clear_cordz_info(); + absl::cord_internal::CordRep::Ref(as_tree()); + } } inline Cord::InlineRep::InlineRep(Cord::InlineRep&& src) { @@ -956,7 +977,6 @@ if (rhs == this) { return; } - std::swap(data_, rhs->data_); } @@ -1037,6 +1057,8 @@ return *this; } +inline Cord::Cord(const Cord& src) : contents_(src.contents_) {} + inline Cord::Cord(Cord&& src) noexcept : contents_(std::move(src.contents_)) {} inline void Cord::swap(Cord& other) noexcept {
diff --git a/third_party/abseil-cpp/absl/strings/cord_test.cc b/third_party/abseil-cpp/absl/strings/cord_test.cc index bf7a6820..f9982428 100644 --- a/third_party/abseil-cpp/absl/strings/cord_test.cc +++ b/third_party/abseil-cpp/absl/strings/cord_test.cc
@@ -183,6 +183,10 @@ } static bool IsTree(const Cord& c) { return c.contents_.is_tree(); } + + static cord_internal::CordzInfo* GetCordzInfo(const Cord& c) { + return c.contents_.cordz_info(); + } }; ABSL_NAMESPACE_END
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h index cda00a4..a1ba67f 100644 --- a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +++ b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
@@ -387,6 +387,12 @@ as_tree_.cordz_info = absl::big_endian::FromHost64(info); } + // Resets the current cordz_info to null / empty. + void clear_cordz_info() { + assert(is_tree()); + as_tree_.cordz_info = kNullCordzInfo; + } + // Returns a read only pointer to the character data inside this instance. // Requires the current instance to hold inline data. const char* as_chars() const {
diff --git a/third_party/abseil-cpp/absl/strings/internal/str_format/convert_test.cc b/third_party/abseil-cpp/absl/strings/internal/str_format/convert_test.cc index 375db0a..926283c 100644 --- a/third_party/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +++ b/third_party/abseil-cpp/absl/strings/internal/str_format/convert_test.cc
@@ -554,7 +554,8 @@ } template <typename Floating> -void TestWithMultipleFormatsHelper(const std::vector<Floating> &floats) { +void TestWithMultipleFormatsHelper(const std::vector<Floating> &floats, + const std::set<Floating> &skip_verify) { const NativePrintfTraits &native_traits = VerifyNativeImplementation(); // Reserve the space to ensure we don't allocate memory in the output itself. std::string str_format_result; @@ -602,7 +603,16 @@ AppendPack(&str_format_result, format, absl::MakeSpan(args)); } - if (string_printf_result != str_format_result) { +#ifdef _MSC_VER + // MSVC has a different rounding policy than us so we can't test our + // implementation against the native one there. + continue; +#elif defined(__APPLE__) + // Apple formats NaN differently (+nan) vs. (nan) + if (std::isnan(d)) continue; +#endif + if (string_printf_result != str_format_result && + skip_verify.find(d) == skip_verify.end()) { // We use ASSERT_EQ here because failures are usually correlated and a // bug would print way too many failed expectations causing the test // to time out. @@ -616,12 +626,6 @@ } TEST_F(FormatConvertTest, Float) { -#ifdef _MSC_VER - // MSVC has a different rounding policy than us so we can't test our - // implementation against the native one there. - return; -#endif // _MSC_VER - std::vector<float> floats = {0.0f, -0.0f, .9999999f, @@ -635,7 +639,8 @@ std::numeric_limits<float>::epsilon(), std::numeric_limits<float>::epsilon() + 1.0f, std::numeric_limits<float>::infinity(), - -std::numeric_limits<float>::infinity()}; + -std::numeric_limits<float>::infinity(), + std::nanf("")}; // Some regression tests. floats.push_back(0.999999989f); @@ -664,21 +669,14 @@ std::sort(floats.begin(), floats.end()); floats.erase(std::unique(floats.begin(), floats.end()), floats.end()); -#ifndef __APPLE__ - // Apple formats NaN differently (+nan) vs. (nan) - floats.push_back(std::nan("")); -#endif - - TestWithMultipleFormatsHelper(floats); + TestWithMultipleFormatsHelper(floats, {}); } TEST_F(FormatConvertTest, Double) { -#ifdef _MSC_VER - // MSVC has a different rounding policy than us so we can't test our - // implementation against the native one there. - return; -#endif // _MSC_VER - + // For values that we know won't match the standard library implementation we + // skip verification, but still run the algorithm to catch asserts/sanitizer + // bugs. + std::set<double> skip_verify; std::vector<double> doubles = {0.0, -0.0, .99999999999999, @@ -692,7 +690,8 @@ std::numeric_limits<double>::epsilon(), std::numeric_limits<double>::epsilon() + 1, std::numeric_limits<double>::infinity(), - -std::numeric_limits<double>::infinity()}; + -std::numeric_limits<double>::infinity(), + std::nan("")}; // Some regression tests. doubles.push_back(0.99999999999999989); @@ -722,33 +721,29 @@ "5084551339423045832369032229481658085593321233482747978262041447231" "68738177180919299881250404026184124858368.000000"; - if (!gcc_bug_22142) { - for (int exp = -300; exp <= 300; ++exp) { - const double all_ones_mantissa = 0x1fffffffffffff; - doubles.push_back(std::ldexp(all_ones_mantissa, exp)); + for (int exp = -300; exp <= 300; ++exp) { + const double all_ones_mantissa = 0x1fffffffffffff; + doubles.push_back(std::ldexp(all_ones_mantissa, exp)); + if (gcc_bug_22142) { + skip_verify.insert(doubles.back()); } } if (gcc_bug_22142) { - for (auto &d : doubles) { - using L = std::numeric_limits<double>; - double d2 = std::abs(d); - if (d2 == L::max() || d2 == L::min() || d2 == L::denorm_min()) { - d = 0; - } - } + using L = std::numeric_limits<double>; + skip_verify.insert(L::max()); + skip_verify.insert(L::min()); // NOLINT + skip_verify.insert(L::denorm_min()); + skip_verify.insert(-L::max()); + skip_verify.insert(-L::min()); // NOLINT + skip_verify.insert(-L::denorm_min()); } // Remove duplicates to speed up the logic below. std::sort(doubles.begin(), doubles.end()); doubles.erase(std::unique(doubles.begin(), doubles.end()), doubles.end()); -#ifndef __APPLE__ - // Apple formats NaN differently (+nan) vs. (nan) - doubles.push_back(std::nan("")); -#endif - - TestWithMultipleFormatsHelper(doubles); + TestWithMultipleFormatsHelper(doubles, skip_verify); } TEST_F(FormatConvertTest, DoubleRound) { @@ -1069,11 +1064,6 @@ } TEST_F(FormatConvertTest, LongDouble) { -#ifdef _MSC_VER - // MSVC has a different rounding policy than us so we can't test our - // implementation against the native one there. - return; -#endif // _MSC_VER const NativePrintfTraits &native_traits = VerifyNativeImplementation(); const char *const kFormats[] = {"%", "%.3", "%8.5", "%9", "%.5000", "%.60", "%+", "% ", "%-10"}; @@ -1134,10 +1124,18 @@ for (auto d : doubles) { FormatArgImpl arg(d); UntypedFormatSpecImpl format(fmt_str); + std::string result = FormatPack(format, {&arg, 1}); + +#ifdef _MSC_VER + // MSVC has a different rounding policy than us so we can't test our + // implementation against the native one there. + continue; +#endif // _MSC_VER + // We use ASSERT_EQ here because failures are usually correlated and a // bug would print way too many failed expectations causing the test to // time out. - ASSERT_EQ(StrPrint(fmt_str.c_str(), d), FormatPack(format, {&arg, 1})) + ASSERT_EQ(StrPrint(fmt_str.c_str(), d), result) << fmt_str << " " << StrPrint("%.18Lg", d) << " " << StrPrint("%La", d) << " " << StrPrint("%.1080Lf", d); }
diff --git a/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc b/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc index 2aa41aa..2b1fd8c 100644 --- a/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +++ b/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc
@@ -112,12 +112,22 @@ return next_carry % divisor; } +constexpr bool IsDoubleDouble() { + // This is the `double-double` representation of `long double`. + // We do not handle it natively. Fallback to snprintf. + return std::numeric_limits<long double>::digits == + 2 * std::numeric_limits<double>::digits; +} + +using MaxFloatType = + typename std::conditional<IsDoubleDouble(), double, long double>::type; + // Generates the decimal representation for an integer of the form `v * 2^exp`, // where `v` and `exp` are both positive integers. // It generates the digits from the left (ie the most significant digit first) // to allow for direct printing into the sink. // -// Requires `0 <= exp` and `exp <= numeric_limits<long double>::max_exponent`. +// Requires `0 <= exp` and `exp <= numeric_limits<MaxFloatType>::max_exponent`. class BinaryToDecimal { static constexpr int ChunksNeeded(int exp) { // We will left shift a uint128 by `exp` bits, so we need `128+exp` total @@ -132,10 +142,10 @@ static void RunConversion(uint128 v, int exp, absl::FunctionRef<void(BinaryToDecimal)> f) { assert(exp > 0); - assert(exp <= std::numeric_limits<long double>::max_exponent); + assert(exp <= std::numeric_limits<MaxFloatType>::max_exponent); static_assert( static_cast<int>(StackArray::kMaxCapacity) >= - ChunksNeeded(std::numeric_limits<long double>::max_exponent), + ChunksNeeded(std::numeric_limits<MaxFloatType>::max_exponent), ""); StackArray::RunWithCapacity( @@ -232,14 +242,14 @@ // Converts a value of the form `x * 2^-exp` into a sequence of decimal digits. // Requires `-exp < 0` and -// `-exp >= limits<long double>::min_exponent - limits<long double>::digits`. +// `-exp >= limits<MaxFloatType>::min_exponent - limits<MaxFloatType>::digits`. class FractionalDigitGenerator { public: // Run the conversion for `v * 2^exp` and call `f(generator)`. // This function will allocate enough stack space to perform the conversion. static void RunConversion( uint128 v, int exp, absl::FunctionRef<void(FractionalDigitGenerator)> f) { - using Limits = std::numeric_limits<long double>; + using Limits = std::numeric_limits<MaxFloatType>; assert(-exp < 0); assert(-exp >= Limits::min_exponent - 128); static_assert(StackArray::kMaxCapacity >= @@ -871,10 +881,10 @@ // This buffer holds the "0x1.ab1de3" portion of "0x1.ab1de3pe+2". Compute the // size with long double which is the largest of the floats. constexpr size_t kBufSizeForHexFloatRepr = - 2 // 0x - + std::numeric_limits<long double>::digits / 4 // number of hex digits - + 1 // round up - + 1; // "." (dot) + 2 // 0x + + std::numeric_limits<MaxFloatType>::digits / 4 // number of hex digits + + 1 // round up + + 1; // "." (dot) char digits_buffer[kBufSizeForHexFloatRepr]; char *digits_iter = digits_buffer; const char *const digits = @@ -1393,10 +1403,7 @@ bool ConvertFloatImpl(long double v, const FormatConversionSpecImpl &conv, FormatSinkImpl *sink) { - if (std::numeric_limits<long double>::digits == - 2 * std::numeric_limits<double>::digits) { - // This is the `double-double` representation of `long double`. - // We do not handle it natively. Fallback to snprintf. + if (IsDoubleDouble()) { return FallbackToSnprintf(v, conv, sink); }
diff --git a/third_party/abseil-cpp/absl/synchronization/mutex.h b/third_party/abseil-cpp/absl/synchronization/mutex.h index 4dd51fe..8c6d573 100644 --- a/third_party/abseil-cpp/absl/synchronization/mutex.h +++ b/third_party/abseil-cpp/absl/synchronization/mutex.h
@@ -147,7 +147,7 @@ // // Example usage: // namespace foo { - // ABSL_CONST_INIT Mutex mu(absl::kConstInit); + // ABSL_CONST_INIT absl::Mutex mu(absl::kConstInit); // } explicit constexpr Mutex(absl::ConstInitType);
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def index 3eb6ce74..eaadb496 100644 --- a/third_party/abseil-cpp/symbols_arm64_dbg.def +++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -1945,7 +1945,6 @@ ?LengthToTag@CordTestAccess@strings_internal@absl@@SAE_K@Z ?Load16@big_endian@absl@@YAGPEBX@Z ?Load32@big_endian@absl@@YAIPEBX@Z - ?Load32@little_endian@absl@@YAIPEBX@Z ?Load64@little_endian@absl@@YA_KPEBX@Z ?Load@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@Vstring_view@2@AEBVCord@2@@Z@base_internal@absl@@QEBAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@3@Vstring_view@3@AEBVCord@3@@ZXZ ?Load@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@QEBAP6A_NW4LogSeverity@3@PEBDHPEAPEADPEAH@ZXZ @@ -2278,7 +2277,6 @@ ?ToDoubleSeconds@absl@@YANVDuration@1@@Z ?ToHost16@big_endian@absl@@YAGG@Z ?ToHost32@big_endian@absl@@YAII@Z - ?ToHost32@little_endian@absl@@YAII@Z ?ToHost64@little_endian@absl@@YA_K_K@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@__1@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@__1@std@@@Z @@ -2733,6 +2731,8 @@ ?clear@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@InlineRep@Cord@absl@@QEAAPEAUCordRep@cord_internal@3@XZ + ?clear_cordz_info@InlineData@cord_internal@absl@@QEAAXXZ + ?clear_cordz_info@InlineRep@Cord@absl@@QEAAXXZ ?code@Status@absl@@QEBA?AW4StatusCode@2@XZ ?compare_exchange_weak@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEAA_NAEAPEAUHashtablezInfo@container_internal@absl@@PEAU456@W4memory_order@23@2@Z ?concat@CordRep@cord_internal@absl@@QEAAPEAUCordRepConcat@23@XZ @@ -3179,6 +3179,7 @@ ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z ?set_inline_size@InlineData@cord_internal@absl@@QEAAX_K@Z ?set_inline_size@InlineRep@Cord@absl@@AEAAX_K@Z + ?set_profiled@InlineData@cord_internal@absl@@QEAAX_N@Z ?set_tree@InlineData@cord_internal@absl@@QEAAXPEAUCordRep@23@@Z ?set_tree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z ?set_value@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def index e0accc7..caa16fa 100644 --- a/third_party/abseil-cpp/symbols_arm64_rel.def +++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -106,7 +106,6 @@ ??0Condition@absl@@AEAA@XZ ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z ??0Condition@absl@@QEAA@PEB_N@Z - ??0Cord@absl@@QEAA@AEBV01@@Z ??0Cord@absl@@QEAA@Vstring_view@1@@Z ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ ??0HashtablezInfo@container_internal@absl@@QEAA@XZ
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def index 2de719e..a003374c 100644 --- a/third_party/abseil-cpp/symbols_x64_dbg.def +++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -1945,8 +1945,6 @@ ?LengthToTag@CordTestAccess@strings_internal@absl@@SAE_K@Z ?Load16@big_endian@absl@@YAGPEBX@Z ?Load32@big_endian@absl@@YAIPEBX@Z - ?Load32@little_endian@absl@@YAIPEBX@Z - ?Load64@little_endian@absl@@YA_KPEBX@Z ?Load@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@Vstring_view@2@AEBVCord@2@@Z@base_internal@absl@@QEBAP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@3@Vstring_view@3@AEBVCord@3@@ZXZ ?Load@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@QEBAP6A_NW4LogSeverity@3@PEBDHPEAPEADPEAH@ZXZ ?Load@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@67@@Z @@ -2277,8 +2275,6 @@ ?ToDoubleSeconds@absl@@YANVDuration@1@@Z ?ToHost16@big_endian@absl@@YAGG@Z ?ToHost32@big_endian@absl@@YAII@Z - ?ToHost32@little_endian@absl@@YAII@Z - ?ToHost64@little_endian@absl@@YA_K_K@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@__1@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@__1@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@__1@std@@@Z @@ -2732,6 +2728,8 @@ ?clear@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@InlineRep@Cord@absl@@QEAAPEAUCordRep@cord_internal@3@XZ + ?clear_cordz_info@InlineData@cord_internal@absl@@QEAAXXZ + ?clear_cordz_info@InlineRep@Cord@absl@@QEAAXXZ ?code@Status@absl@@QEBA?AW4StatusCode@2@XZ ?compare_exchange_weak@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEAA_NAEAPEAUHashtablezInfo@container_internal@absl@@PEAU456@W4memory_order@23@2@Z ?concat@CordRep@cord_internal@absl@@QEAAPEAUCordRepConcat@23@XZ @@ -3178,6 +3176,7 @@ ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z ?set_inline_size@InlineData@cord_internal@absl@@QEAAX_K@Z ?set_inline_size@InlineRep@Cord@absl@@AEAAX_K@Z + ?set_profiled@InlineData@cord_internal@absl@@QEAAX_N@Z ?set_tree@InlineData@cord_internal@absl@@QEAAXPEAUCordRep@23@@Z ?set_tree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z ?set_value@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def index 325dfef..377c8c7 100644 --- a/third_party/abseil-cpp/symbols_x64_rel.def +++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -108,7 +108,6 @@ ??0Condition@absl@@AEAA@XZ ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z ??0Condition@absl@@QEAA@PEB_N@Z - ??0Cord@absl@@QEAA@AEBV01@@Z ??0Cord@absl@@QEAA@Vstring_view@1@@Z ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ ??0HashtablezInfo@container_internal@absl@@QEAA@XZ
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def index 5b1950c..ec1a207 100644 --- a/third_party/abseil-cpp/symbols_x64_rel_asan.def +++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -113,7 +113,6 @@ ??0Condition@absl@@AEAA@XZ ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z ??0Condition@absl@@QEAA@PEB_N@Z - ??0Cord@absl@@QEAA@AEBV01@@Z ??0Cord@absl@@QEAA@Vstring_view@1@@Z ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ ??0HashtablezInfo@container_internal@absl@@QEAA@XZ
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def index b6650fe20..c2f37405 100644 --- a/third_party/abseil-cpp/symbols_x86_dbg.def +++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -1939,8 +1939,6 @@ ?LengthToTag@CordTestAccess@strings_internal@absl@@SAEI@Z ?Load16@big_endian@absl@@YAGPBX@Z ?Load32@big_endian@absl@@YAIPBX@Z - ?Load32@little_endian@absl@@YAIPBX@Z - ?Load64@little_endian@absl@@YA_KPBX@Z ?Load@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@Vstring_view@2@ABVCord@2@@Z@base_internal@absl@@QBEP6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@3@Vstring_view@3@ABVCord@3@@ZXZ ?Load@?$AtomicHook@P6A_NW4LogSeverity@absl@@PBDHPAPADPAH@Z@base_internal@absl@@QBEP6A_NW4LogSeverity@3@PBDHPAPADPAH@ZXZ ?Load@TimeZoneIf@cctz@time_internal@absl@@SA?AV?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__1@std@@@__1@std@@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@67@@Z @@ -2271,8 +2269,6 @@ ?ToDoubleSeconds@absl@@YANVDuration@1@@Z ?ToHost16@big_endian@absl@@YAGG@Z ?ToHost32@big_endian@absl@@YAII@Z - ?ToHost32@little_endian@absl@@YAII@Z - ?ToHost64@little_endian@absl@@YA_K_K@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@__1@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@__1@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@__1@std@@@Z @@ -2726,6 +2722,8 @@ ?clear@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXXZ ?clear@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QAEXXZ ?clear@InlineRep@Cord@absl@@QAEPAUCordRep@cord_internal@3@XZ + ?clear_cordz_info@InlineData@cord_internal@absl@@QAEXXZ + ?clear_cordz_info@InlineRep@Cord@absl@@QAEXXZ ?code@Status@absl@@QBE?AW4StatusCode@2@XZ ?compare_exchange_weak@?$__atomic_base@PAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QAE_NAAPAUHashtablezInfo@container_internal@absl@@PAU456@W4memory_order@23@2@Z ?concat@CordRep@cord_internal@absl@@QAEPAUCordRepConcat@23@XZ @@ -3172,6 +3170,7 @@ ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QAEXH@Z ?set_inline_size@InlineData@cord_internal@absl@@QAEXI@Z ?set_inline_size@InlineRep@Cord@absl@@AAEXI@Z + ?set_profiled@InlineData@cord_internal@absl@@QAEX_N@Z ?set_tree@InlineData@cord_internal@absl@@QAEXPAUCordRep@23@@Z ?set_tree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@@Z ?set_value@InputValue@UnboundConversion@str_format_internal@absl@@QAEXH@Z
diff --git a/third_party/abseil-cpp/symbols_x86_rel.def b/third_party/abseil-cpp/symbols_x86_rel.def index 70d53d52..2527a4b 100644 --- a/third_party/abseil-cpp/symbols_x86_rel.def +++ b/third_party/abseil-cpp/symbols_x86_rel.def
@@ -106,7 +106,6 @@ ??0Condition@absl@@AAE@XZ ??0Condition@absl@@QAE@P6A_NPAX@Z0@Z ??0Condition@absl@@QAE@PB_N@Z - ??0Cord@absl@@QAE@ABV01@@Z ??0Cord@absl@@QAE@Vstring_view@1@@Z ??0GraphCycles@synchronization_internal@absl@@QAE@XZ ??0HashtablezInfo@container_internal@absl@@QAE@XZ
diff --git a/third_party/blink/common/BUILD.gn b/third_party/blink/common/BUILD.gn index f01465c..d1a9c168 100644 --- a/third_party/blink/common/BUILD.gn +++ b/third_party/blink/common/BUILD.gn
@@ -256,6 +256,7 @@ sources = [ "bluetooth/web_bluetooth_device_id_unittest.cc", "client_hints/client_hints_unittest.cc", + "context_menu_data/context_menu_mojom_traits_unittest.cc", "device_memory/approximated_device_memory_unittest.cc", "feature_policy/document_policy_unittest.cc", "feature_policy/feature_policy_unittest.cc",
diff --git a/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc b/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc index e5ebc765..e56733c 100644 --- a/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc +++ b/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc
@@ -76,7 +76,7 @@ blink::mojom::CustomContextMenuItemDataView, blink::MenuItem>::Read(blink::mojom::CustomContextMenuItemDataView data, blink::MenuItem* out) { - if (!data.ReadLabel(&out->label) || !data.ReadIcon(&out->label) || + if (!data.ReadLabel(&out->label) || !data.ReadIcon(&out->icon) || !data.ReadToolTip(&out->tool_tip) || !data.ReadType(&out->type) || !data.ReadSubmenu(&out->submenu)) return false;
diff --git a/third_party/blink/common/context_menu_data/context_menu_mojom_traits_unittest.cc b/third_party/blink/common/context_menu_data/context_menu_mojom_traits_unittest.cc new file mode 100644 index 0000000..d1e4b4c --- /dev/null +++ b/third_party/blink/common/context_menu_data/context_menu_mojom_traits_unittest.cc
@@ -0,0 +1,72 @@ +// Copyright 2021 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/public/common/context_menu_data/context_menu_mojom_traits.h" + +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" +#include "mojo/public/cpp/bindings/struct_traits.h" +#include "mojo/public/cpp/test_support/test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/context_menu_data/menu_item.h" +#include "third_party/blink/public/mojom/context_menu/context_menu.mojom.h" + +namespace blink { + +TEST(MenuItemStructTraitsTest, MenuItemRoundtrip) { + MenuItem menu_item; + menu_item.label = base::ASCIIToUTF16("Label of menu item"); + menu_item.icon = base::ASCIIToUTF16("Icon of menu item"); + menu_item.tool_tip = base::ASCIIToUTF16("Tooltip of menu item"); + menu_item.type = MenuItem::Type::GROUP; + menu_item.action = 1; + menu_item.rtl = false; + menu_item.has_directional_override = true; + menu_item.enabled = true; + menu_item.checked = true; + + menu_item.submenu.resize(2); + menu_item.submenu[0].label = base::ASCIIToUTF16("Label of submenu item 1"); + menu_item.submenu[0].icon = base::ASCIIToUTF16("Icon of submenu item 1"); + menu_item.submenu[0].tool_tip = + base::ASCIIToUTF16("Tooltip of submenu item 1"); + menu_item.submenu[0].type = MenuItem::Type::SUBMENU; + menu_item.submenu[0].action = 2; + menu_item.submenu[1].label = base::ASCIIToUTF16("Label of submenu item 2"); + menu_item.submenu[1].icon = base::ASCIIToUTF16("Icon of submenu item 2"); + menu_item.submenu[0].tool_tip = + base::ASCIIToUTF16("Tooltip of submenu item 2"); + menu_item.submenu[1].type = MenuItem::Type::SUBMENU; + menu_item.submenu[1].action = 2; + + MenuItem roundtrip_menu_item; + + ASSERT_TRUE( + mojo::test::SerializeAndDeserialize<blink::mojom::CustomContextMenuItem>( + menu_item, roundtrip_menu_item)); + + EXPECT_EQ(roundtrip_menu_item.label, menu_item.label); + EXPECT_EQ(roundtrip_menu_item.icon, menu_item.icon); + EXPECT_EQ(roundtrip_menu_item.tool_tip, menu_item.tool_tip); + EXPECT_EQ(roundtrip_menu_item.type, menu_item.type); + EXPECT_EQ(roundtrip_menu_item.action, menu_item.action); + EXPECT_EQ(roundtrip_menu_item.rtl, menu_item.rtl); + EXPECT_EQ(roundtrip_menu_item.has_directional_override, + menu_item.has_directional_override); + EXPECT_EQ(roundtrip_menu_item.enabled, menu_item.enabled); + EXPECT_EQ(roundtrip_menu_item.checked, menu_item.checked); + + for (size_t i = 0; i < menu_item.submenu.size(); ++i) { + SCOPED_TRACE(base::StringPrintf("Submenu index: %zd", i)); + EXPECT_EQ(menu_item.submenu[i].label, roundtrip_menu_item.submenu[i].label); + EXPECT_EQ(menu_item.submenu[i].icon, roundtrip_menu_item.submenu[i].icon); + EXPECT_EQ(menu_item.submenu[i].tool_tip, + roundtrip_menu_item.submenu[i].tool_tip); + EXPECT_EQ(menu_item.submenu[i].type, roundtrip_menu_item.submenu[i].type); + EXPECT_EQ(menu_item.submenu[i].action, + roundtrip_menu_item.submenu[i].action); + } +} + +} // namespace blink
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 5eb866888a..3bea498 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -19,6 +19,9 @@ "BlockingDownloadsInAdFrameWithoutUserActivation", base::FEATURE_ENABLED_BY_DEFAULT}; +const base::Feature kCOLRV1Fonts{"COLRV1Fonts", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enable defer commits to avoid flash of unstyled content, for same origin // navigation only. const base::Feature kPaintHolding{"PaintHolding",
diff --git a/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h b/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h index 6ace805..c83acee 100644 --- a/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h +++ b/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h
@@ -11,7 +11,6 @@ #include "third_party/blink/public/common/common_export.h" #include "third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h" #include "third_party/blink/public/common/navigation/impression.h" -#include "third_party/blink/public/mojom/choosers/popup_menu.mojom.h" #include "third_party/blink/public/mojom/context_menu/context_menu.mojom.h" #include "url/mojom/url_gurl_mojom_traits.h"
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 6abaf65..ed498acc 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -17,6 +17,7 @@ BLINK_COMMON_EXPORT extern const base::Feature kBlockingDownloadsInAdFrameWithoutUserActivation; +BLINK_COMMON_EXPORT extern const base::Feature kCOLRV1Fonts; BLINK_COMMON_EXPORT extern const base::Feature kPaintHolding; BLINK_COMMON_EXPORT extern const base::Feature kPaintHoldingCrossOrigin; BLINK_COMMON_EXPORT extern const base::Feature
diff --git a/third_party/blink/public/devtools_protocol/OWNERS b/third_party/blink/public/devtools_protocol/OWNERS index a7c4119..5925879 100644 --- a/third_party/blink/public/devtools_protocol/OWNERS +++ b/third_party/blink/public/devtools_protocol/OWNERS
@@ -2,3 +2,4 @@ caseq@chromium.org dgozman@chromium.org pfeldman@chromium.org +sigurds@chromium.org
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 8c722ef0..2bebc2f 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -667,9 +667,8 @@ TransferIssue CreationIssue - # Details for a request that has been blocked with the BLOCKED_BY_RESPONSE - # code. Currently only used for COEP/COOP, but may be extended to include - # some CSP errors in the future. + # Details for a issue arising from an SAB being instantiated in, or + # transfered to a context that is not cross-origin isolated. type SharedArrayBufferIssueDetails extends object properties SourceCodeLocation sourceCodeLocation @@ -705,6 +704,16 @@ string fontSize string fontWeight + # Details for a CORS related issue, e.g. a warning or error related to + # CORS RFC1918 enforcement. + type CorsIssueDetails extends object + properties + Network.CorsErrorStatus corsErrorStatus + boolean isWarning + AffectedRequest request + optional Network.IPAddressSpace resourceIPAddressSpace + optional Network.ClientSecurityState clientSecurityState + # A unique identifier for the type of issue. Each type may use one of the # optional fields in InspectorIssueDetails to convey more specific # information about the kind of issue. @@ -718,6 +727,7 @@ SharedArrayBufferIssue TrustedWebActivityIssue LowTextContrastIssue + CorsIssue # This struct holds a list of optional fields with additional information # specific to the kind of issue. When adding a new issue code, please also @@ -732,6 +742,7 @@ optional SharedArrayBufferIssueDetails sharedArrayBufferIssueDetails optional TrustedWebActivityIssueDetails twaQualityEnforcementDetails optional LowTextContrastIssueDetails lowTextContrastIssueDetails + optional CorsIssueDetails corsIssueDetails # An inspector issue reported from the back-end. type InspectorIssue extends object @@ -5600,6 +5611,7 @@ enum Allow BlockFromInsecureToMorePrivate + WarnFromInsecureToMorePrivate experimental type IPAddressSpace extends string enum
diff --git a/third_party/blink/public/platform/TaskTypes.md b/third_party/blink/public/platform/TaskTypes.md index 4272df7..1b52e7b 100644 --- a/third_party/blink/public/platform/TaskTypes.md +++ b/third_party/blink/public/platform/TaskTypes.md
@@ -41,6 +41,7 @@ | Permission | No | No | Yes | Yes | Yes | Yes | | ServiceWorkerClientMessage | No | No | No | Yes | Yes | Yes | | WebLocks | No | No | No | No | No | Yes | +| WakeLock | No | No | Yes | Yes | Yes | Yes | | InternalDefault | No | No | Yes | Yes | Yes | Yes | | InternalLoading | No | No | Yes | Yes | Yes | No | | InternalTest | No | No | No | No | No | Yes |
diff --git a/third_party/blink/public/platform/task_type.h b/third_party/blink/public/platform/task_type.h index 81dc6307..45272b4 100644 --- a/third_party/blink/public/platform/task_type.h +++ b/third_party/blink/public/platform/task_type.h
@@ -163,6 +163,9 @@ // https://wicg.github.io/web-locks/#web-locks-tasks-source kWebLocks = 66, + // https://w3c.github.io/screen-wake-lock/#dfn-screen-wake-lock-task-source + kWakeLock = 76, + /////////////////////////////////////// // Not-speced tasks should use one of the following task types /////////////////////////////////////// @@ -278,7 +281,7 @@ kWorkerThreadTaskQueueV8 = 47, kWorkerThreadTaskQueueCompositor = 48, - kCount = 76, + kCount = 77, }; } // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h b/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h index a0582c93..539776a 100644 --- a/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h +++ b/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h
@@ -80,7 +80,7 @@ const DOMWrapperWorld&, v8::Local<v8::Object> instance, v8::Local<v8::Object> prototype, - v8::Local<v8::Function> interface); + v8::Local<v8::Function> interface_name); using InstallRuntimeEnabledFeaturesOnTemplateFunction = InstallTemplateFunction;
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc index e61a48dc..57f58951 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -1848,7 +1848,7 @@ } void HTMLInputElement::UpdatePlaceholderText() { - return input_type_view_->UpdatePlaceholderText(); + return input_type_view_->UpdatePlaceholderText(!SuggestedValue().IsEmpty()); } String HTMLInputElement::GetPlaceholderValue() const {
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc index 4af0f4cb300..55b9059 100644 --- a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
@@ -646,6 +646,7 @@ void HTMLTextAreaElement::UpdatePlaceholderText() { HTMLElement* placeholder = PlaceholderElement(); const String placeholder_text = GetPlaceholderValue(); + const bool is_suggested_value = !SuggestedValue().IsEmpty(); if (placeholder_text.IsEmpty()) { if (placeholder) UserAgentShadowRoot()->RemoveChild(placeholder); @@ -662,6 +663,12 @@ IsPlaceholderVisible() ? CSSValueID::kBlock : CSSValueID::kNone, true); UserAgentShadowRoot()->InsertBefore(placeholder, InnerEditorElement()); } + if (is_suggested_value) { + placeholder->SetInlineStyleProperty(CSSPropertyID::kUserSelect, + CSSValueID::kNone, true); + } else { + placeholder->RemoveInlineStyleProperty(CSSPropertyID::kUserSelect); + } String normalized_value = placeholder_text; // https://html.spec.whatwg.org/multipage/form-elements.html#attr-textarea-placeholder ReplaceCRWithNewLine(normalized_value);
diff --git a/third_party/blink/renderer/core/html/forms/input_type_view.cc b/third_party/blink/renderer/core/html/forms/input_type_view.cc index 8819c83..379f218 100644 --- a/third_party/blink/renderer/core/html/forms/input_type_view.cc +++ b/third_party/blink/renderer/core/html/forms/input_type_view.cc
@@ -188,7 +188,7 @@ void InputTypeView::UpdateClearButtonVisibility() {} -void InputTypeView::UpdatePlaceholderText() {} +void InputTypeView::UpdatePlaceholderText(bool) {} AXObject* InputTypeView::PopupRootAXObject() { return nullptr;
diff --git a/third_party/blink/renderer/core/html/forms/input_type_view.h b/third_party/blink/renderer/core/html/forms/input_type_view.h index f2a5ed4..a0e28505 100644 --- a/third_party/blink/renderer/core/html/forms/input_type_view.h +++ b/third_party/blink/renderer/core/html/forms/input_type_view.h
@@ -135,7 +135,7 @@ virtual void CapsLockStateMayHaveChanged(); virtual bool ShouldDrawCapsLockIndicator() const; virtual void UpdateClearButtonVisibility(); - virtual void UpdatePlaceholderText(); + virtual void UpdatePlaceholderText(bool is_suggested_value); virtual AXObject* PopupRootAXObject(); virtual void EnsureFallbackContent() {} virtual void EnsurePrimaryContent() {}
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.h b/third_party/blink/renderer/core/html/forms/text_control_element.h index 3c96c9cb..5d65533 100644 --- a/third_party/blink/renderer/core/html/forms/text_control_element.h +++ b/third_party/blink/renderer/core/html/forms/text_control_element.h
@@ -281,7 +281,7 @@ TextControlElement* EnclosingTextControl(const Position&); TextControlElement* EnclosingTextControl(const PositionInFlatTree&); -TextControlElement* EnclosingTextControl(const Node*); +CORE_EXPORT TextControlElement* EnclosingTextControl(const Node*); } // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/text_field_input_type.cc b/third_party/blink/renderer/core/html/forms/text_field_input_type.cc index c8606c3..cea4e00d 100644 --- a/third_party/blink/renderer/core/html/forms/text_field_input_type.cc +++ b/third_party/blink/renderer/core/html/forms/text_field_input_type.cc
@@ -484,7 +484,7 @@ return true; } -void TextFieldInputType::UpdatePlaceholderText() { +void TextFieldInputType::UpdatePlaceholderText(bool is_suggested_value) { if (!SupportsPlaceholder()) return; HTMLElement* placeholder = GetElement().PlaceholderElement(); @@ -512,6 +512,12 @@ previous->parentNode()->InsertBefore(placeholder, previous); SECURITY_DCHECK(placeholder->parentNode() == previous->parentNode()); } + if (is_suggested_value) { + placeholder->SetInlineStyleProperty(CSSPropertyID::kUserSelect, + CSSValueID::kNone, true); + } else { + placeholder->RemoveInlineStyleProperty(CSSPropertyID::kUserSelect); + } placeholder->setTextContent(placeholder_text); }
diff --git a/third_party/blink/renderer/core/html/forms/text_field_input_type.h b/third_party/blink/renderer/core/html/forms/text_field_input_type.h index 4f24cb60..e187704 100644 --- a/third_party/blink/renderer/core/html/forms/text_field_input_type.h +++ b/third_party/blink/renderer/core/html/forms/text_field_input_type.h
@@ -88,7 +88,7 @@ bool ShouldSubmitImplicitly(const Event&) final; bool ShouldRespectListAttribute() override; void ListAttributeTargetChanged() override; - void UpdatePlaceholderText() final; + void UpdatePlaceholderText(bool is_suggested_value) final; void AppendToFormData(FormData&) const override; void SubtreeHasChanged() final;
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index 898d24a..42e6ea84 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -1556,14 +1556,16 @@ NGPhysicalBoxStrut LayoutBox::ComputeScrollbarsInternal( ShouldClampToContentBox clamp_to_content_box, - OverlayScrollbarClipBehavior overlay_scrollbar_clip_behavior) const { + OverlayScrollbarClipBehavior overlay_scrollbar_clip_behavior, + ShouldIncludeScrollbarGutter include_scrollbar_gutter) const { NOT_DESTROYED(); NGPhysicalBoxStrut scrollbars; PaintLayerScrollableArea* scrollable_area = GetScrollableArea(); if (!scrollable_area) return scrollbars; - if (HasScrollbarGutters(kVerticalScrollbar)) { + if (include_scrollbar_gutter == kIncludeScrollbarGutter && + HasScrollbarGutters(kVerticalScrollbar)) { LayoutUnit gutter_size = LayoutUnit(scrollable_area->HypotheticalScrollbarThickness( kVerticalScrollbar, /* should_include_overlay_thickness */ true)); @@ -1584,7 +1586,8 @@ overlay_scrollbar_clip_behavior)); } - if (HasScrollbarGutters(kHorizontalScrollbar)) { + if (include_scrollbar_gutter == kIncludeScrollbarGutter && + HasScrollbarGutters(kHorizontalScrollbar)) { LayoutUnit gutter_size = LayoutUnit(scrollable_area->HypotheticalScrollbarThickness( kHorizontalScrollbar, /* should_include_overlay_thickness */ true)); @@ -2825,8 +2828,13 @@ } } - if (IsScrollContainer()) - ExcludeScrollbars(clip_rect, overlay_scrollbar_clip_behavior); + if (IsScrollContainer()) { + // The additional gutters created by scrollbar-gutter don't occlude the + // content underneath, so they should not be clipped out here. + // See https://crbug.com/710214 + ExcludeScrollbars(clip_rect, overlay_scrollbar_clip_behavior, + kExcludeScrollbarGutter); + } auto* input = DynamicTo<HTMLInputElement>(GetNode()); if (UNLIKELY(input)) { @@ -2859,13 +2867,15 @@ void LayoutBox::ExcludeScrollbars( PhysicalRect& rect, - OverlayScrollbarClipBehavior overlay_scrollbar_clip_behavior) const { + OverlayScrollbarClipBehavior overlay_scrollbar_clip_behavior, + ShouldIncludeScrollbarGutter include_scrollbar_gutter) const { NOT_DESTROYED(); if (CanSkipComputeScrollbars()) return; NGPhysicalBoxStrut scrollbars = ComputeScrollbarsInternal( - kDoNotClampToContentBox, overlay_scrollbar_clip_behavior); + kDoNotClampToContentBox, overlay_scrollbar_clip_behavior, + include_scrollbar_gutter); rect.offset.top += scrollbars.top; rect.offset.left += scrollbars.left; rect.size.width -= scrollbars.HorizontalSum();
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h index 69653359a..8ecd5596 100644 --- a/third_party/blink/renderer/core/layout/layout_box.h +++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -68,6 +68,11 @@ enum ShouldClampToContentBox { kDoNotClampToContentBox, kClampToContentBox }; +enum ShouldIncludeScrollbarGutter { + kExcludeScrollbarGutter, + kIncludeScrollbarGutter +}; + using SnapAreaSet = HashSet<LayoutBox*>; struct LayoutBoxRareData final : public GarbageCollected<LayoutBoxRareData> { @@ -2123,7 +2128,8 @@ void ExcludeScrollbars( PhysicalRect&, - OverlayScrollbarClipBehavior = kIgnoreOverlayScrollbarSize) const; + OverlayScrollbarClipBehavior = kIgnoreOverlayScrollbarSize, + ShouldIncludeScrollbarGutter = kIncludeScrollbarGutter) const; LayoutUnit ContainingBlockLogicalWidthForPositioned( const LayoutBoxModelObject* containing_block, @@ -2279,7 +2285,8 @@ bool HasScrollbarGutters(ScrollbarOrientation orientation) const; NGPhysicalBoxStrut ComputeScrollbarsInternal( ShouldClampToContentBox = kDoNotClampToContentBox, - OverlayScrollbarClipBehavior = kIgnoreOverlayScrollbarSize) const; + OverlayScrollbarClipBehavior = kIgnoreOverlayScrollbarSize, + ShouldIncludeScrollbarGutter = kIncludeScrollbarGutter) const; LayoutUnit FlipForWritingModeInternal( LayoutUnit position,
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc index 43841b1c..78e820f 100644 --- a/third_party/blink/renderer/core/layout/layout_text.cc +++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -843,29 +843,33 @@ const PhysicalOffset& point) const { NOT_DESTROYED(); if (IsInLayoutNGInlineFormattingContext()) { - // TODO(crbug.com/1150362): The optimized codepath below does not support - // the block fragmentation yet. Use the slow codepath for now if block - // fragmented. - const LayoutBlockFlow* containing_block_flow = ContainingNGBlockFlow(); - if (UNLIKELY(containing_block_flow->PhysicalFragmentCount() > 1)) - return containing_block_flow->PositionForPoint(point); - // Because of Texts in "position:relative" can be outside of line box, we // attempt to find a fragment containing |point|. // See All/LayoutViewHitTestTest.HitTestHorizontal/* and // All/LayoutViewHitTestTest.HitTestVerticalRL/* NGInlineCursor cursor; + cursor.MoveTo(*this); + const LayoutBlockFlow* containing_block_flow = cursor.GetLayoutBlockFlow(); + DCHECK(containing_block_flow); PhysicalOffset point_in_contents = point; if (containing_block_flow->IsScrollContainer()) { point_in_contents += PhysicalOffset( containing_block_flow->PixelSnappedScrolledContentOffset()); } - for (cursor.MoveTo(*this); cursor; cursor.MoveToNextForSameLayoutObject()) { + const NGPhysicalBoxFragment* container_fragment = nullptr; + PhysicalOffset point_in_container_fragment; + for (; cursor; cursor.MoveToNextForSameLayoutObject()) { + DCHECK(&cursor.ContainerFragment()); + if (container_fragment != &cursor.ContainerFragment()) { + container_fragment = &cursor.ContainerFragment(); + point_in_container_fragment = + point_in_contents - container_fragment->OffsetFromOwnerLayoutBox(); + } if (!EnclosingIntRect(cursor.Current().RectInContainerFragment()) - .Contains(FlooredIntPoint(point_in_contents))) + .Contains(FlooredIntPoint(point_in_container_fragment))) continue; if (auto position_with_affinity = - cursor.PositionForPointInChild(point_in_contents)) { + cursor.PositionForPointInChild(point_in_container_fragment)) { // Note: Due by Bidi adjustment, |position| isn't relative to this. const Position& position = position_with_affinity.GetPosition(); DCHECK(position.IsOffsetInAnchor()) << position;
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc index 25bf67f..39a642b 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
@@ -1612,11 +1612,24 @@ void NGGridLayoutAlgorithm::StretchAutoTracks( SizingConstraint sizing_constraint, NGGridLayoutAlgorithmTrackCollection* track_collection) const { + const GridTrackSizingDirection track_direction = + track_collection->Direction(); + + // Stretching auto tracks should only occur if we have a "stretch" (or + // default) content distribution. + const auto& content_alignment = (track_direction == kForColumns) + ? Style().JustifyContent() + : Style().AlignContent(); + bool has_stretch_distribution = + content_alignment.Distribution() == ContentDistributionType::kStretch || + (content_alignment.GetPosition() == ContentPosition::kNormal && + content_alignment.Distribution() == ContentDistributionType::kDefault); + if (!has_stretch_distribution) + return; + LayoutUnit free_space = DetermineFreeSpace(sizing_constraint, *track_collection); - const GridTrackSizingDirection track_direction = - track_collection->Direction(); // If the free space is indefinite, but the grid container has a definite // min-width/height, use that size to calculate the free space for this step // instead.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc index 00c0789..b72681d 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -644,6 +644,7 @@ void NGOutOfFlowLayoutPart::LayoutOOFsInMulticol(const NGBlockNode& multicol) { Vector<NGLogicalOutOfFlowPositionedNode> oof_nodes_to_layout; Vector<NGLink*> mutable_multicol_children; + const NGBlockBreakToken* previous_column_break_token = nullptr; NGConstraintSpace multicol_constraint_space = CreateConstraintSpaceForMulticol(multicol); @@ -663,6 +664,8 @@ multicol_box_fragment->Style().GetWritingDirection(); const WritingModeConverter converter(writing_direction, multicol_box_fragment->Size()); + const NGBlockBreakToken* current_column_break_token = + previous_column_break_token; // Collect the children of the multicol fragments. for (auto& child : @@ -670,15 +673,15 @@ const auto* fragment = To<NGPhysicalContainerFragment>(child.get()); LogicalOffset offset = converter.ToLogical(child.Offset(), fragment->Size()); + if (fragment->IsFragmentainerBox()) { + current_column_break_token = + To<NGBlockBreakToken>(fragment->BreakToken()); + } multicol_container_builder.AddChild(*fragment, offset); mutable_multicol_children.emplace_back(&child); } - if (!multicol_box_fragment - ->HasOutOfFlowPositionedFragmentainerDescendants()) - continue; - // Convert the OOF fragmentainer descendants to the logical coordinate space // and store the resulting nodes inside |oof_nodes_to_layout|. for (const auto& descendant : @@ -689,6 +692,17 @@ converter.ToLogical(descendant.containing_block_offset, containing_block_fragment->Size()); + // The containing block offset should be the offset from the top of the + // inner multicol to the start of the containing block (as if all of the + // columns are placed one on top of the other). When propagating OOFs + // in a nested fragmentation context, we miss the block contribution + // from columns in previous outer fragmentainers. Add the block size + // for such columns here to account for this. + if (previous_column_break_token) { + containing_block_offset.block_offset += + previous_column_break_token->ConsumedBlockSize(); + } + // The static position should remain relative to its containing block // fragment. const WritingModeConverter containing_block_converter( @@ -706,6 +720,7 @@ containing_block_fragment}; oof_nodes_to_layout.push_back(node); } + previous_column_break_token = current_column_break_token; } DCHECK(!oof_nodes_to_layout.IsEmpty());
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc index 0a06b7d5..182f2d9 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc
@@ -1410,60 +1410,6 @@ EXPECT_EQ(expectation, dump); } -// Test the static position of a fragmented OOF element inside a nested -// multi-column. -TEST_F(NGOutOfFlowLayoutPartTest, AbsposNestedFragmentationStaticPos) { - SetBodyInnerHTML( - R"HTML( - <style> - .multicol { - columns:2; column-fill:auto; column-gap:0px; - } - .rel { - position: relative; width:55px; - } - .abs { - position:absolute; width:5px; height:70px; - } - </style> - <div id="container"> - <div class="multicol" id="outer" style="height:100px;"> - <div class="multicol" id="inner"> - <div class="rel"> - <div style="height:250px; width:25px;"></div> - <div class="abs"></div> - </div> - </div> - </div> - </div> - )HTML"); - String dump = DumpFragmentTree(GetElementById("container")); - - // TODO(almaher): The static position should be 250px down instead of 50px. - // It looks like the block size of the first two inner columns are not - // taken into account when determining the static position. - String expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::. - offset:unplaced size:1000x100 - offset:0,0 size:1000x100 - offset:0,0 size:500x100 - offset:0,0 size:500x100 - offset:0,0 size:250x100 - offset:0,0 size:55x100 - offset:0,0 size:25x100 - offset:0,50 size:5x50 - offset:250,0 size:250x100 - offset:0,0 size:55x100 - offset:0,0 size:25x100 - offset:0,0 size:5x20 - offset:500,0 size:500x100 - offset:0,0 size:500x100 - offset:0,0 size:250x100 - offset:0,0 size:55x50 - offset:0,0 size:25x50 -)DUMP"; - EXPECT_EQ(expectation, dump); -} - // Fragmented OOF with `height: auto` and positioned with the bottom property. TEST_F(NGOutOfFlowLayoutPartTest, PositionedFragmentationWithBottomPropertyAndHeightAuto) {
diff --git a/third_party/blink/renderer/core/layout/scrollbars_test.cc b/third_party/blink/renderer/core/layout/scrollbars_test.cc index c802f8e..dc6d073 100644 --- a/third_party/blink/renderer/core/layout/scrollbars_test.cc +++ b/third_party/blink/renderer/core/layout/scrollbars_test.cc
@@ -3594,4 +3594,83 @@ box_always_both_scrollbars); } +// Test the additional gutter created by the "both" keyword of scrollbar-gutter. +TEST_F(ScrollbarsTest, ScrollbarGutterBothKeywordWithClassicScrollbars) { + // This test requires that scrollbars take up space. + ENABLE_OVERLAY_SCROLLBARS(false); + + WebView().MainFrameViewWidget()->Resize(gfx::Size(800, 600)); + SimRequest request("https://example.com/test.html", "text/html"); + LoadURL("https://example.com/test.html"); + request.Complete(R"HTML( + <!DOCTYPE html> + <style> + body { + margin: 0; + } + #container { + scrollbar-gutter: always both; + width: 200px; + height: 200px; + overflow: auto; + writing-mode: horizontal-tb; + direction: ltr; + } + #content { + width: 100%; + height: 300px; + } + </style> + <div id="container"> + <div id="content"> + </div> + )HTML"); + Compositor().BeginFrame(); + + Document& document = GetDocument(); + Element* container = document.getElementById("container"); + + auto* scrollable_container = GetScrollableArea(*container); + scrollable_container->SetScrollbarsHiddenForTesting(false); + + if (WebView().GetPage()->GetScrollbarTheme().AllowsHitTest()) { + // Scrollbar on the right side. + HitTestResult hit_test_result = HitTest(195, 5); + EXPECT_EQ(hit_test_result.InnerElement(), container); + EXPECT_TRUE(hit_test_result.GetScrollbar()); + EXPECT_TRUE(hit_test_result.GetScrollbar()->Enabled()); + + // Empty gutter on the left side, where the events will take place. + hit_test_result = HitTest(5, 5); + EXPECT_EQ(hit_test_result.InnerElement(), container); + EXPECT_FALSE(hit_test_result.GetScrollbar()); + } + + EXPECT_EQ(container->scrollTop(), 0); + + // Scroll down. + WebView().MainFrameViewWidget()->HandleInputEvent( + GenerateWheelGestureEvent(WebInputEvent::Type::kGestureScrollBegin, + IntPoint(5, 5), ScrollOffset(0, -100))); + WebView().MainFrameViewWidget()->HandleInputEvent( + GenerateWheelGestureEvent(WebInputEvent::Type::kGestureScrollUpdate, + IntPoint(5, 5), ScrollOffset(0, -100))); + WebView().MainFrameViewWidget()->HandleInputEvent(GenerateWheelGestureEvent( + WebInputEvent::Type::kGestureScrollEnd, IntPoint(5, 5))); + + EXPECT_EQ(container->scrollTop(), 100); + + // Scroll up. + WebView().MainFrameViewWidget()->HandleInputEvent( + GenerateWheelGestureEvent(WebInputEvent::Type::kGestureScrollBegin, + IntPoint(5, 5), ScrollOffset(0, 100))); + WebView().MainFrameViewWidget()->HandleInputEvent( + GenerateWheelGestureEvent(WebInputEvent::Type::kGestureScrollUpdate, + IntPoint(5, 5), ScrollOffset(0, 100))); + WebView().MainFrameViewWidget()->HandleInputEvent(GenerateWheelGestureEvent( + WebInputEvent::Type::kGestureScrollEnd, IntPoint(195, 5))); + + EXPECT_EQ(container->scrollTop(), 0); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/theme_painter_default.cc b/third_party/blink/renderer/core/paint/theme_painter_default.cc index 922b3e3..dda9decd 100644 --- a/third_party/blink/renderer/core/paint/theme_painter_default.cc +++ b/third_party/blink/renderer/core/paint/theme_painter_default.cc
@@ -167,15 +167,8 @@ float zoom_level = style.EffectiveZoom(); extra_params.button.zoom = zoom_level; GraphicsContextStateSaver state_saver(paint_info.context, false); - IntRect unzoomed_rect = rect; - if (zoom_level != 1 && !features::IsFormControlsRefreshEnabled()) { - state_saver.Save(); - unzoomed_rect.SetWidth(unzoomed_rect.Width() / zoom_level); - unzoomed_rect.SetHeight(unzoomed_rect.Height() / zoom_level); - paint_info.context.Translate(unzoomed_rect.X(), unzoomed_rect.Y()); - paint_info.context.Scale(zoom_level, zoom_level); - paint_info.context.Translate(-unzoomed_rect.X(), -unzoomed_rect.Y()); - } + IntRect unzoomed_rect = + ApplyZoomToRect(rect, paint_info, state_saver, zoom_level); Platform::Current()->ThemeEngine()->Paint( canvas, WebThemeEngine::kPartCheckbox, GetWebThemeState(element), @@ -193,9 +186,15 @@ extra_params.button = WebThemeEngine::ButtonExtraParams(); extra_params.button.checked = IsChecked(element); + float zoom_level = style.EffectiveZoom(); + extra_params.button.zoom = zoom_level; + GraphicsContextStateSaver state_saver(paint_info.context, false); + IntRect unzoomed_rect = + ApplyZoomToRect(rect, paint_info, state_saver, zoom_level); + Platform::Current()->ThemeEngine()->Paint( canvas, WebThemeEngine::kPartRadio, GetWebThemeState(element), - gfx::Rect(rect), &extra_params, style.UsedColorScheme()); + gfx::Rect(unzoomed_rect), &extra_params, style.UsedColorScheme()); return false; } @@ -578,4 +577,22 @@ return false; } +IntRect ThemePainterDefault::ApplyZoomToRect( + const IntRect& rect, + const PaintInfo& paint_info, + GraphicsContextStateSaver& state_saver, + float zoom_level) { + IntRect unzoomed_rect = rect; + if (zoom_level != 1) { + state_saver.Save(); + unzoomed_rect.SetWidth(unzoomed_rect.Width() / zoom_level); + unzoomed_rect.SetHeight(unzoomed_rect.Height() / zoom_level); + paint_info.context.Translate(unzoomed_rect.X(), unzoomed_rect.Y()); + paint_info.context.Scale(zoom_level, zoom_level); + paint_info.context.Translate(-unzoomed_rect.X(), -unzoomed_rect.Y()); + } + + return unzoomed_rect; +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/theme_painter_default.h b/third_party/blink/renderer/core/paint/theme_painter_default.h index 344b6686..b8acda0d 100644 --- a/third_party/blink/renderer/core/paint/theme_painter_default.h +++ b/third_party/blink/renderer/core/paint/theme_painter_default.h
@@ -34,6 +34,7 @@ namespace blink { +class GraphicsContextStateSaver; class LayoutThemeDefault; class ThemePainterDefault final : public ThemePainter { @@ -103,6 +104,11 @@ const IntRect&, WebThemeEngine::ExtraParams&); + IntRect ApplyZoomToRect(const IntRect&, + const PaintInfo&, + GraphicsContextStateSaver&, + float zoom_level); + // ThemePaintDefault is a part object of m_theme. LayoutThemeDefault& theme_; };
diff --git a/third_party/blink/renderer/core/workers/worker_thread.cc b/third_party/blink/renderer/core/workers/worker_thread.cc index 6aa4b2b..cf83267 100644 --- a/third_party/blink/renderer/core/workers/worker_thread.cc +++ b/third_party/blink/renderer/core/workers/worker_thread.cc
@@ -577,6 +577,7 @@ TaskType::kPostedMessage, TaskType::kRemoteEvent, TaskType::kUserInteraction, + TaskType::kWakeLock, TaskType::kWebGL, TaskType::kWebLocks, TaskType::kWebSocket,
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc index 9a3bb8b..575be71 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -503,7 +503,8 @@ if (IsWebArea()) return false; - if (IsA<HTMLHtmlElement>(GetNode())) + const Node* node = GetNode(); + if (IsA<HTMLHtmlElement>(node)) return true; if (!layout_object_) { @@ -536,8 +537,8 @@ return false; // Make sure renderers with layers stay in the tree. - if (GetLayoutObject() && GetLayoutObject()->HasLayer() && GetNode() && - GetNode()->hasChildren()) { + if (GetLayoutObject() && GetLayoutObject()->HasLayer() && node && + node->hasChildren()) { if (IsPlaceholder()) { // Placeholder is already exposed via AX attributes, do not expose as // child of text input. Therefore, if there is a child of a text input, @@ -583,7 +584,7 @@ } // FIXME(aboxhall): may need to move? - base::Optional<String> alt_text = GetCSSAltText(GetNode()); + base::Optional<String> alt_text = GetCSSAltText(node); if (alt_text) return alt_text->IsEmpty(); @@ -612,9 +613,10 @@ // Inner editor element of editable area with empty text provides bounds // used to compute the character extent for index 0. This is the same as // what the caret's bounds would be if the editable area is focused. - if (ParentObject() && ParentObject()->GetLayoutObject() && - ParentObject()->GetLayoutObject()->IsTextControlIncludingNG()) { - return false; + if (node) { + const TextControlElement* text_control = EnclosingTextControl(node); + if (text_control && text_control->InnerEditorElement() == node) + return false; } // Ignore layout objects that are block flows with inline children. These @@ -627,9 +629,8 @@ const bool has_any_text = HasLineBox(*block_flow); // Always include interesting-looking objects. - if (has_any_text || - (GetNode() && GetNode()->HasAnyEventListeners( - event_util::MouseButtonEventTypes()))) { + if (has_any_text || (node && node->HasAnyEventListeners( + event_util::MouseButtonEventTypes()))) { return false; } @@ -639,7 +640,7 @@ } // If setting enabled, do not ignore SVG grouping (<g>) elements. - if (IsA<SVGGElement>(GetNode())) { + if (IsA<SVGGElement>(node)) { Settings* settings = GetDocument()->GetSettings(); if (settings->GetAccessibilityIncludeSvgGElement()) { return false;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc index 18895dd4..d5a3bcbf 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -475,7 +475,7 @@ return kDefaultBehavior; } -base::Optional<String> AXNodeObject::GetCSSAltText(Node* node) { +base::Optional<String> AXNodeObject::GetCSSAltText(const Node* node) { if (!node || !node->GetComputedStyle() || node->GetComputedStyle()->ContentBehavesAsNormal()) { return base::nullopt;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.h b/third_party/blink/renderer/modules/accessibility/ax_node_object.h index 758f0a1..44515cd1 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.h
@@ -56,7 +56,7 @@ // The accessibility role, not taking ARIA into account. ax::mojom::blink::Role native_role_; - static base::Optional<String> GetCSSAltText(Node*); + static base::Optional<String> GetCSSAltText(const Node*); AXObjectInclusion ShouldIncludeBasedOnSemantics( IgnoredReasons* = nullptr) const; bool ComputeAccessibilityIsIgnored(IgnoredReasons* = nullptr) const override;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc index 4d01e36..808fa8eb 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -30,6 +30,7 @@ #include <algorithm> #include "base/strings/string_util.h" +#include "build/build_config.h" #include "third_party/blink/public/common/input/web_menu_source_type.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-blink.h" #include "third_party/blink/renderer/core/aom/accessible_node.h" @@ -951,6 +952,9 @@ void AXObject::Serialize(ui::AXNodeData* node_data, ui::AXMode accessibility_mode) { + node_data->role = RoleValue(); + node_data->id = AXObjectID(); + AccessibilityExpanded expanded = IsExpanded(); if (expanded) { if (expanded == kExpandedCollapsed) @@ -1178,6 +1182,13 @@ if (IsScrollableContainer()) SerializeScrollAttributes(node_data); + + if (GetElement()) { + SerializeElementAttributes(node_data); + if (accessibility_mode.has_mode(ui::AXMode::kHTML)) { + SerializeHTMLAttributes(node_data); + } + } } void AXObject::SerializeTableAttributes(ui::AXNodeData* node_data) { @@ -1260,6 +1271,57 @@ max_scroll_offset.y()); } +void AXObject::SerializeElementAttributes(ui::AXNodeData* node_data) { + Element* element = this->GetElement(); + if (!element) + return; + + if (const AtomicString& class_name = element->GetClassAttribute()) { + TruncateAndAddStringAttribute(node_data, + ax::mojom::blink::StringAttribute::kClassName, + class_name.Utf8()); + } + + // ARIA role. + if (const AtomicString& aria_role = + GetAOMPropertyOrARIAAttribute(AOMStringProperty::kRole)) { + TruncateAndAddStringAttribute( + node_data, ax::mojom::blink::StringAttribute::kRole, aria_role.Utf8()); + } else { + std::string role = GetEquivalentAriaRoleString(RoleValue()); + if (!role.empty()) { + TruncateAndAddStringAttribute( + node_data, ax::mojom::blink::StringAttribute::kRole, role); + } + } +} + +void AXObject::SerializeHTMLAttributes(ui::AXNodeData* node_data) { + Element* element = GetElement(); + TruncateAndAddStringAttribute(node_data, + ax::mojom::blink::StringAttribute::kHtmlTag, + element->tagName().LowerASCII().Utf8()); + for (const Attribute& attr : element->Attributes()) { + std::string name = attr.LocalName().LowerASCII().Utf8(); + if (name == "class") { // class already in kClassName + continue; + } + std::string value = attr.Value().Utf8(); + node_data->html_attributes.push_back(std::make_pair(name, value)); + } + +// TODO(nektar): Turn off kHTMLAccessibilityMode for automation and Mac +// and remove ifdef. +#if defined(OS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH) + if (node_data->role == ax::mojom::blink::Role::kMath && + element->innerHTML().length()) { + TruncateAndAddStringAttribute(node_data, + ax::mojom::blink::StringAttribute::kInnerHtml, + element->innerHTML().Utf8()); + } +#endif +} + void AXObject::SerializeStyleAttributes(ui::AXNodeData* node_data) { // Text attributes. if (BackgroundColor()) {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h index 6ae3040..af0f421e 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -1310,6 +1310,8 @@ void SerializeTableAttributes(ui::AXNodeData* node_data); void SerializeListAttributes(ui::AXNodeData* node_data); void SerializeScrollAttributes(ui::AXNodeData* node_data); + void SerializeElementAttributes(ui::AXNodeData* dst); + void SerializeHTMLAttributes(ui::AXNodeData* dst); // Serialization implemented in specific subclasses. virtual void SerializeMarkerAttributes(ui::AXNodeData* node_data) const;
diff --git a/third_party/blink/renderer/modules/encoding/text_decoder.cc b/third_party/blink/renderer/modules/encoding/text_decoder.cc index 239cac2f..430b431 100644 --- a/third_party/blink/renderer/modules/encoding/text_decoder.cc +++ b/third_party/blink/renderer/modules/encoding/text_decoder.cc
@@ -81,29 +81,25 @@ const TextDecodeOptions* options, ExceptionState& exception_state) { DCHECK(options); - DCHECK(!input.IsNull()); + // In case of `input` == IDL "missing" special value, default to (nullptr, 0). + void* start = nullptr; + size_t length = 0; if (input.IsArrayBufferView()) { - const char* start = - static_cast<const char*>(input.GetAsArrayBufferView()->BaseAddress()); - size_t length = input.GetAsArrayBufferView()->byteLength(); - if (length > std::numeric_limits<uint32_t>::max()) { - exception_state.ThrowRangeError( - "Buffer size exceeds maximum heap object size."); - return String(); - } - return decode(start, static_cast<uint32_t>(length), options, - exception_state); + start = input.GetAsArrayBufferView()->BaseAddress(); + length = input.GetAsArrayBufferView()->byteLength(); + } else if (input.IsArrayBuffer()) { + start = input.GetAsArrayBuffer()->Data(); + length = input.GetAsArrayBuffer()->ByteLength(); } - DCHECK(input.IsArrayBuffer()); - const char* start = - static_cast<const char*>(input.GetAsArrayBuffer()->Data()); - size_t length = input.GetAsArrayBuffer()->ByteLength(); + if (length > std::numeric_limits<uint32_t>::max()) { exception_state.ThrowRangeError( "Buffer size exceeds maximum heap object size."); return String(); } - return decode(start, static_cast<uint32_t>(length), options, exception_state); + + return decode(static_cast<const char*>(start), static_cast<uint32_t>(length), + options, exception_state); } String TextDecoder::decode(const char* start,
diff --git a/third_party/blink/renderer/modules/remote_objects/remote_object_gateway_impl.cc b/third_party/blink/renderer/modules/remote_objects/remote_object_gateway_impl.cc index 5167a7ed..6669741 100644 --- a/third_party/blink/renderer/modules/remote_objects/remote_object_gateway_impl.cc +++ b/third_party/blink/renderer/modules/remote_objects/remote_object_gateway_impl.cc
@@ -150,6 +150,8 @@ void RemoteObjectGatewayFactoryImpl::CreateRemoteObjectGateway( mojo::PendingRemote<mojom::blink::RemoteObjectHost> host, mojo::PendingReceiver<mojom::blink::RemoteObjectGateway> receiver) { + if (!frame_) + return; RemoteObjectGatewayImpl::BindMojoReceiver(frame_, std::move(host), std::move(receiver)); }
diff --git a/third_party/blink/renderer/modules/wake_lock/wake_lock.cc b/third_party/blink/renderer/modules/wake_lock/wake_lock.cc index 19f11f8..4b77850a 100644 --- a/third_party/blink/renderer/modules/wake_lock/wake_lock.cc +++ b/third_party/blink/renderer/modules/wake_lock/wake_lock.cc
@@ -278,7 +278,7 @@ ConnectToPermissionService( GetExecutionContext(), permission_service_.BindNewPipeAndPassReceiver( - GetExecutionContext()->GetTaskRunner(TaskType::kMiscPlatformAPI))); + GetExecutionContext()->GetTaskRunner(TaskType::kWakeLock))); } return permission_service_.get(); }
diff --git a/third_party/blink/renderer/modules/wake_lock/wake_lock_manager.cc b/third_party/blink/renderer/modules/wake_lock/wake_lock_manager.cc index c8cd404b..7b8429b 100644 --- a/third_party/blink/renderer/modules/wake_lock/wake_lock_manager.cc +++ b/third_party/blink/renderer/modules/wake_lock/wake_lock_manager.cc
@@ -47,7 +47,7 @@ ToMojomWakeLockType(wake_lock_type_), device::mojom::blink::WakeLockReason::kOther, "Blink Wake Lock", wake_lock_.BindNewPipeAndPassReceiver( - execution_context_->GetTaskRunner(TaskType::kMiscPlatformAPI))); + execution_context_->GetTaskRunner(TaskType::kWakeLock))); wake_lock_.set_disconnect_handler(WTF::Bind( &WakeLockManager::OnWakeLockConnectionError, WrapWeakPersistent(this))); wake_lock_->RequestWakeLock();
diff --git a/third_party/blink/renderer/modules/wake_lock/wake_lock_sentinel.cc b/third_party/blink/renderer/modules/wake_lock/wake_lock_sentinel.cc index 3c24465..7592a11 100644 --- a/third_party/blink/renderer/modules/wake_lock/wake_lock_sentinel.cc +++ b/third_party/blink/renderer/modules/wake_lock/wake_lock_sentinel.cc
@@ -96,7 +96,7 @@ // 6. Queue a task to run the following steps: GetExecutionContext() - ->GetTaskRunner(TaskType::kMiscPlatformAPI) + ->GetTaskRunner(TaskType::kWakeLock) ->PostTask(FROM_HERE, WTF::Bind(&WakeLockSentinel::DispatchReleaseEvent, WrapWeakPersistent(this))); }
diff --git a/third_party/blink/renderer/modules/webcodecs/DEPS b/third_party/blink/renderer/modules/webcodecs/DEPS index ea1919d..189c70a 100644 --- a/third_party/blink/renderer/modules/webcodecs/DEPS +++ b/third_party/blink/renderer/modules/webcodecs/DEPS
@@ -40,4 +40,7 @@ "+base/run_loop.h", "+base/files/file_util.h", ], + "video_frame_test\.cc": [ + "+components/viz/test/test_context_provider.h", + ] }
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame.cc b/third_party/blink/renderer/modules/webcodecs/video_frame.cc index 3076fa1..19fd47e 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_frame.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_frame.cc
@@ -251,7 +251,7 @@ // implement asyncRescaleAndReadPixelsYUV420. if (sk_image->isTextureBacked()) { YUVReadbackContext result; - result.coded_size = gfx::Size(); + result.coded_size = coded_size; result.visible_rect = visible_rect; result.natural_size = natural_size; result.timestamp = timestamp;
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame_test.cc b/third_party/blink/renderer/modules/webcodecs/video_frame_test.cc index 37c6163..3c7bbf5 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_frame_test.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_frame_test.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "media/base/video_frame.h" +#include "components/viz/test/test_context_provider.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_tester.h" @@ -11,6 +12,9 @@ #include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h" #include "third_party/blink/renderer/modules/webcodecs/video_frame.h" #include "third_party/blink/renderer/modules/webcodecs/video_frame_handle.h" +#include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h" +#include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h" +#include "third_party/blink/renderer/platform/graphics/test/gpu_test_utils.h" #include "third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h" #include "third_party/blink/renderer/platform/heap/thread_state.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" @@ -29,6 +33,13 @@ class VideoFrameTest : public testing::Test { public: + void SetUp() override { + test_context_provider_ = viz::TestContextProvider::Create(); + InitializeSharedGpuContext(test_context_provider_.get()); + } + + void TearDown() override { SharedGpuContext::ResetForTesting(); } + VideoFrame* CreateBlinkVideoFrame( scoped_refptr<media::VideoFrame> media_frame, ExecutionContext* context) { @@ -58,6 +69,9 @@ media_frame->set_timestamp(timestamp); return media_frame; } + + private: + scoped_refptr<viz::TestContextProvider> test_context_provider_; }; TEST_F(VideoFrameTest, ConstructorAndAttributes) { @@ -243,6 +257,32 @@ EXPECT_EQ(clone->handle()->sk_image(), original_image); } +TEST_F(VideoFrameTest, VideoFrameFromGPUImageBitmap) { + V8TestingScope scope; + + auto context_provider_wrapper = SharedGpuContext::ContextProviderWrapper(); + CanvasResourceParams resource_params; + auto resource_provider = CanvasResourceProvider::CreateSharedImageProvider( + IntSize(100, 100), kLow_SkFilterQuality, resource_params, + CanvasResourceProvider::ShouldInitialize::kNo, context_provider_wrapper, + RasterMode::kGPU, true /*is_origin_top_left*/, + 0u /*shared_image_usage_flags*/); + + scoped_refptr<StaticBitmapImage> bitmap = resource_provider->Snapshot(); + ASSERT_TRUE(bitmap->IsTextureBacked()); + + auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(bitmap); + EXPECT_TRUE(image_bitmap); + EXPECT_TRUE(image_bitmap->BitmapImage()->IsTextureBacked()); + + auto* init = VideoFrameInit::Create(); + init->setTimestamp(0); + + auto* video_frame = VideoFrame::Create(scope.GetScriptState(), image_bitmap, + init, scope.GetExceptionState()); + ASSERT_TRUE(video_frame); +} + } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_queue.cc b/third_party/blink/renderer/modules/webgpu/gpu_queue.cc index 5b4e02e..0fdb8c5 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_queue.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_queue.cc
@@ -471,10 +471,9 @@ const WGPUOrigin3D& origin, const WGPUExtent3D& copy_size, const WGPUTextureCopyView& destination) { - scoped_refptr<WebGPUMailboxTexture> mailbox_texture = - WebGPUMailboxTexture::FromStaticBitmapImage( - GetDawnControlClient(), device_->GetHandle(), - WGPUTextureUsage_CopySrc, image); + scoped_refptr<WebGPUMailboxTexture> mailbox_texture = base::AdoptRef( + new WebGPUMailboxTexture(GetDawnControlClient(), device_->GetHandle(), + image, WGPUTextureUsage_CopySrc)); WGPUTexture src_texture = mailbox_texture->GetTexture(); DCHECK(src_texture != nullptr);
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture.cc b/third_party/blink/renderer/modules/webgpu/gpu_texture.cc index 2ab5110..3254dd5 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_texture.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_texture.cc
@@ -4,7 +4,6 @@ #include "third_party/blink/renderer/modules/webgpu/gpu_texture.h" -#include "gpu/command_buffer/client/webgpu_interface.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_texture_descriptor.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_texture_view_descriptor.h" #include "third_party/blink/renderer/core/html/media/html_video_element.h" @@ -15,6 +14,7 @@ #include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h" #include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h" #include "third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h" +#include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h" namespace blink { @@ -125,8 +125,6 @@ // Create a CanvasResourceProvider for producing WebGPU-compatible shared // images. - // TODO(crbug.com/1174809): This should recycle resources instead of creating - // a new shared image every time. std::unique_ptr<CanvasResourceProvider> resource_provider = CanvasResourceProvider::CreateWebGPUImageProvider( IntSize(video->videoWidth(), video->videoHeight()), @@ -154,11 +152,19 @@ DCHECK(canvas_resource->IsValid()); DCHECK(canvas_resource->IsAccelerated()); + scoped_refptr<StaticBitmapImage> image = canvas_resource->Bitmap(); + + // Set origin to be clean. This was checked above. + image->SetOriginClean(true); + + DCHECK(image->IsTextureBacked()); + SkImageInfo image_info = image->PaintImageForCurrentFrame().GetSkImageInfo(); + // Extract the format. This is only used to validate copyImageBitmapToTexture // right now. We may want to reflect it from this function or validate it // against some input parameters. WGPUTextureFormat format; - switch (canvas_resource->CreateSkImageInfo().colorType()) { + switch (image_info.colorType()) { case SkColorType::kRGBA_8888_SkColorType: format = WGPUTextureFormat_RGBA8Unorm; break; @@ -187,10 +193,9 @@ return nullptr; } - scoped_refptr<WebGPUMailboxTexture> mailbox_texture = - WebGPUMailboxTexture::FromCanvasResource(device->GetDawnControlClient(), - device->GetHandle(), usage, - std::move(canvas_resource)); + scoped_refptr<WebGPUMailboxTexture> mailbox_texture = base::AdoptRef( + new WebGPUMailboxTexture(device->GetDawnControlClient(), + device->GetHandle(), image.get(), usage)); DCHECK(mailbox_texture->GetTexture() != nullptr); return MakeGarbageCollected<GPUTexture>(device, format,
diff --git a/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.cc b/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.cc index 13ae8b5..bb6ef79 100644 --- a/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.cc +++ b/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.cc
@@ -4,9 +4,11 @@ #include "third_party/blink/renderer/platform/fonts/web_font_typeface_factory.h" +#include "base/logging.h" #include "base/metrics/histogram_macros.h" #include "third_party/blink/renderer/platform/fonts/font_cache.h" #include "third_party/blink/renderer/platform/fonts/opentype/font_format_check.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/wtf/assertions.h" #include "third_party/skia/include/core/SkStream.h" #include "third_party/skia/include/core/SkTypeface.h" @@ -34,11 +36,6 @@ std::unique_ptr<SkStreamAsset> stream(new SkMemoryStream(sk_data)); - // Reject COLRv1 for now until we have a feature flag to gate them and control - // the release process. - if (format_check.IsColrCpalColorFontV1()) - return false; - if (!format_check.IsVariableFont() && !format_check.IsColorFont()) { typeface = DefaultFontManager()->makeFromStream(std::move(stream)); if (typeface) { @@ -60,6 +57,19 @@ return typeface.get(); } + if (format_check.IsColrCpalColorFontV1()) { + if (RuntimeEnabledFeatures::COLRV1FontsEnabled()) { + typeface = FreeTypeFontManager()->makeFromStream(std::move(stream)); + if (typeface) { + ReportInstantiationResult(InstantiationResult::kSuccessColrV1Font); + } + return typeface.get(); + } else { + // Always reject COLRv1 fonts when the feature is off. + return false; + } + } + if (format_check.IsSbixColorFont()) { typeface = FontManagerForSbix()->makeFromStream(std::move(stream)); if (typeface) { @@ -147,8 +157,6 @@ if (!CoreTextVersionSupportsColrCpal()) return FreeTypeFontManager(); #endif - // TODO(https://crbug.com/882844): Check Mac OS version and use the FreeType - // font manager accordingly. return DefaultFontManager(); }
diff --git a/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.h b/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.h index fc3a64cf..ee3ea75 100644 --- a/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.h +++ b/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.h
@@ -43,7 +43,8 @@ kSuccessCff2Font = 4, kSuccessSbixFont = 5, kSuccessColrCpalFont = 6, - kMaxValue = kSuccessColrCpalFont, + kSuccessColrV1Font = 7, + kMaxValue = kSuccessColrV1Font }; static sk_sp<SkFontMgr> DefaultFontManager();
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_image_bitmap_handler_test.cc b/third_party/blink/renderer/platform/graphics/gpu/webgpu_image_bitmap_handler_test.cc index 16df6620..9dc4bc9 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/webgpu_image_bitmap_handler_test.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_image_bitmap_handler_test.cc
@@ -406,9 +406,9 @@ WGPUTextureUsage_CopySrc, _)) .WillOnce(testing::SaveArg<5>(&mailbox_bytes)); - scoped_refptr<WebGPUMailboxTexture> mailbox_texture = - WebGPUMailboxTexture::FromStaticBitmapImage( - dawn_control_client_, fake_device_, WGPUTextureUsage_CopySrc, bitmap); + scoped_refptr<WebGPUMailboxTexture> mailbox_texture = base::AdoptRef( + new WebGPUMailboxTexture(dawn_control_client_, fake_device_, bitmap.get(), + WGPUTextureUsage_CopySrc)); gpu::Mailbox mailbox = gpu::Mailbox::FromVolatile( *reinterpret_cast<const volatile gpu::Mailbox*>(mailbox_bytes));
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.cc b/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.cc index 915f3403..13ec602 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.cc
@@ -5,62 +5,22 @@ #include "third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h" #include "gpu/command_buffer/client/webgpu_interface.h" -#include "third_party/blink/renderer/platform/graphics/canvas_resource.h" #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h" namespace blink { -// static -scoped_refptr<WebGPUMailboxTexture> WebGPUMailboxTexture::FromStaticBitmapImage( - scoped_refptr<DawnControlClientHolder> dawn_control_client, - WGPUDevice device, - WGPUTextureUsage usage, - scoped_refptr<StaticBitmapImage> image) { - DCHECK(image->IsTextureBacked()); - auto finished_access_callback = - WTF::Bind(&StaticBitmapImage::UpdateSyncToken, WTF::RetainedRef(image)); - - return base::AdoptRef(new WebGPUMailboxTexture( - std::move(dawn_control_client), device, usage, - image->GetMailboxHolder().mailbox, image->GetMailboxHolder().sync_token, - std::move(finished_access_callback))); -} - -// static -scoped_refptr<WebGPUMailboxTexture> WebGPUMailboxTexture::FromCanvasResource( - scoped_refptr<DawnControlClientHolder> dawn_control_client, - WGPUDevice device, - WGPUTextureUsage usage, - scoped_refptr<CanvasResource> canvas_resource) { - auto finished_access_callback = WTF::Bind(&CanvasResource::WaitSyncToken, - WTF::RetainedRef(canvas_resource)); - - const gpu::Mailbox& mailbox = - canvas_resource->GetOrCreateGpuMailbox(kUnverifiedSyncToken); - gpu::SyncToken sync_token = canvas_resource->GetSyncToken(); - return base::AdoptRef(new WebGPUMailboxTexture( - std::move(dawn_control_client), device, usage, mailbox, sync_token, - std::move(finished_access_callback))); -} - WebGPUMailboxTexture::WebGPUMailboxTexture( scoped_refptr<DawnControlClientHolder> dawn_control_client, WGPUDevice device, - WGPUTextureUsage usage, - const gpu::Mailbox& mailbox, - const gpu::SyncToken& sync_token, - base::OnceCallback<void(const gpu::SyncToken&)> destroy_callback) - : dawn_control_client_(std::move(dawn_control_client)), - device_(device), - destroy_callback_(std::move(destroy_callback)) { + StaticBitmapImage* image, + WGPUTextureUsage usage) + : dawn_control_client_(std::move(dawn_control_client)), device_(device) { dawn_control_client_->GetProcs().deviceReference(device_); - gpu::webgpu::WebGPUInterface* webgpu = dawn_control_client_->GetInterface(); - - // Wait on any work using the image. - webgpu->WaitSyncTokenCHROMIUM(sync_token.GetConstData()); + mailbox_ = image->GetMailboxHolder().mailbox; // Produce and inject image to WebGPU texture + gpu::webgpu::WebGPUInterface* webgpu = dawn_control_client_->GetInterface(); gpu::webgpu::ReservedTexture reservation = webgpu->ReserveTexture(device_); DCHECK(reservation.texture); @@ -72,7 +32,7 @@ // representation. webgpu->AssociateMailbox(reservation.deviceId, reservation.deviceGeneration, wire_texture_id_, wire_texture_generation_, usage, - reinterpret_cast<const GLbyte*>(&mailbox)); + reinterpret_cast<GLbyte*>(&mailbox_)); } WebGPUMailboxTexture::~WebGPUMailboxTexture() { @@ -80,12 +40,7 @@ gpu::webgpu::WebGPUInterface* webgpu = dawn_control_client_->GetInterface(); webgpu->DissociateMailbox(wire_texture_id_, wire_texture_generation_); - - if (destroy_callback_) { - gpu::SyncToken finished_access_token; - webgpu->GenUnverifiedSyncTokenCHROMIUM(finished_access_token.GetData()); - std::move(destroy_callback_).Run(finished_access_token); - } + mailbox_.SetZero(); dawn_control_client_->GetProcs().deviceRelease(device_); }
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h b/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h index 73d181c..6875816 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h +++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h
@@ -8,32 +8,23 @@ #include <dawn/webgpu.h> #include "gpu/command_buffer/common/mailbox.h" -#include "gpu/command_buffer/common/sync_token.h" #include "third_party/blink/renderer/platform/graphics/gpu/dawn_control_client_holder.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/wtf/ref_counted.h" namespace blink { -class CanvasResource; class DawnControlClientHolder; class StaticBitmapImage; class PLATFORM_EXPORT WebGPUMailboxTexture : public RefCounted<WebGPUMailboxTexture> { public: - static scoped_refptr<WebGPUMailboxTexture> FromStaticBitmapImage( + WebGPUMailboxTexture( scoped_refptr<DawnControlClientHolder> dawn_control_client, WGPUDevice device, - WGPUTextureUsage usage, - scoped_refptr<StaticBitmapImage> image); - - static scoped_refptr<WebGPUMailboxTexture> FromCanvasResource( - scoped_refptr<DawnControlClientHolder> dawn_control_client, - WGPUDevice device, - WGPUTextureUsage usage, - scoped_refptr<CanvasResource> canvas_resource); - + StaticBitmapImage* image, + WGPUTextureUsage usage); ~WebGPUMailboxTexture(); WGPUTexture GetTexture() { return texture_; } @@ -42,17 +33,9 @@ WGPUDevice GetDeviceForTest() { return device_; } private: - WebGPUMailboxTexture( - scoped_refptr<DawnControlClientHolder> dawn_control_client, - WGPUDevice device, - WGPUTextureUsage usage, - const gpu::Mailbox& mailbox, - const gpu::SyncToken& sync_token, - base::OnceCallback<void(const gpu::SyncToken&)> destroy_callback); - scoped_refptr<DawnControlClientHolder> dawn_control_client_; + gpu::Mailbox mailbox_; WGPUDevice device_; - base::OnceCallback<void(const gpu::SyncToken&)> destroy_callback_; WGPUTexture texture_; uint32_t wire_texture_id_ = 0; uint32_t wire_texture_generation_ = 0;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 4c091de7..a76f001 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -364,6 +364,10 @@ status: "experimental", }, { + name: "COLRV1Fonts", + status: "experimental", + }, + { name: "CompositeAfterPaint", }, {
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc index 56b3c6d..75ac9b7f 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
@@ -430,6 +430,7 @@ case TaskType::kApplicationLifeCycle: case TaskType::kBackgroundFetch: case TaskType::kPermission: + case TaskType::kWakeLock: // TODO(altimin): Move appropriate tasks to throttleable task queue. return DeferrableTaskQueueTraits(); // PostedMessage can be used for navigation, so we shouldn't defer it
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc index 9651483..6338f29e 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc
@@ -144,10 +144,11 @@ TaskType::kInternalTranslation, TaskType::kInternalInspector, TaskType::kInternalNavigationAssociatedUnfreezable, - TaskType::kInternalHighPriorityLocalFrame}; + TaskType::kInternalHighPriorityLocalFrame, + TaskType::kWakeLock}; static_assert( - static_cast<int>(TaskType::kCount) == 76, + static_cast<int>(TaskType::kCount) == 77, "When adding a TaskType, make sure that kAllFrameTaskTypes is updated."); void AppendToVectorTestTask(Vector<String>* vector, String value) {
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/task_type_names.cc b/third_party/blink/renderer/platform/scheduler/main_thread/task_type_names.cc index 6084494..a1a5df6 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/task_type_names.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/task_type_names.cc
@@ -145,6 +145,8 @@ return "InternalHighPriorityLocalFrame"; case TaskType::kMainThreadTaskQueueIPCTracking: return "MainThreadTaskQueueIPCTracking"; + case TaskType::kWakeLock: + return "WakeLock"; case TaskType::kCount: return "Count"; }
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc index 1e28f35..6bbe09c 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc
@@ -175,6 +175,7 @@ case TaskType::kInternalIntersectionObserver: case TaskType::kInternalNavigationAssociated: case TaskType::kInternalContinueScriptLoading: + case TaskType::kWakeLock: // UnthrottledTaskRunner is generally discouraged in future. // TODO(nhiroki): Identify which tasks can be throttled / suspendable and // move them into other task runners. See also comments in
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer b/third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer index b385ae2..e604a45 100644 --- a/third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer +++ b/third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer
@@ -10,6 +10,26 @@ # Needs rebaseline. crbug.com/1039401 [ Linux ] css3/filters/effect-blur-hw.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/background/background-repeat-round-auto1.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/background/background-repeat-round-border.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/background/background-repeat-round-content.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/background/background-repeat-round-padding.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/blending/background-blend-mode-default-value.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/blending/background-blend-mode-multiple-background-layers.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/blending/background-blend-mode-single-layer-no-blending.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/blending/effect-background-blend-mode-stacking.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/blending/mix-blend-mode-isolated-group-1.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/blending/mix-blend-mode-isolated-group-2.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/blending/mix-blend-mode-isolated-group-3.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/masking/mask-repeat-round-auto1.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/masking/mask-repeat-round-border.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/masking/mask-repeat-round-content.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] css3/masking/mask-repeat-round-padding.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] images/color-profile-background-image-cover.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] images/color-profile-background-image-repeat.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] images/rgb-png-with-cmyk-color-profile.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] media/video-controls-hide-on-move-outside-controls.html [ Failure Pass ] +crbug.com/1175758 [ Linux ] virtual/android/fullscreen/model/fully-exit-fullscreen-single.html [ Failure Pass ] # Flaky on Windows. crbug.com/1026375 [ Win ] media/video-currentTime-delay.html [ Timeout Pass ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index f5d56ad..2db162b 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -762,9 +762,10 @@ crbug.com/1066577 external/wpt/css/css-lists/li-value-reversed-004.html [ Failure ] # [css-counter-styles-3] -# Image symbols are not implemented yet -crbug.com/687225 external/wpt/css/css-counter-styles/counter-style-prefix-suffix-syntax.html [ Failure ] -crbug.com/687225 external/wpt/css/css-counter-styles/counter-style-symbols-syntax.html [ Failure ] +crbug.com/1176323 external/wpt/css/css-counter-styles/counter-style-prefix-suffix-syntax.html [ Failure ] +crbug.com/1176323 external/wpt/css/css-counter-styles/counter-style-symbols-syntax.html [ Failure ] +crbug.com/1168277 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/disclosure-styles.html [ Failure ] +crbug.com/1176315 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/symbols-function.html [ Failure ] # [css-overflow] # Incorrect WPT tests. @@ -2439,6 +2440,7 @@ crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-206.xht [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/uievents/keyboard/modifier-keys.html [ Timeout ] crbug.com/626703 external/wpt/css/css-backgrounds/background-repeat-space-1b.html [ Failure ] crbug.com/626703 virtual/composite-bgcolor-animation/external/wpt/css/css-backgrounds/background-repeat-space-1c.html [ Failure ] crbug.com/626703 virtual/composite-bgcolor-animation/external/wpt/css/css-backgrounds/background-repeat-space-1a.html [ Failure ] @@ -3064,7 +3066,6 @@ crbug.com/626703 external/wpt/html/browsers/history/joint-session-history/joint-session-history-remove-iframe.html [ Timeout ] crbug.com/626703 external/wpt/css/css-fonts/font-variant-descriptor-01.html [ Failure ] crbug.com/626703 [ Win7 ] external/wpt/css/css-fonts/variations/font-opentype-collections.html [ Timeout ] -crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/disclosure-styles.html [ Failure ] crbug.com/626703 external/wpt/css/css-fonts/font-variant-05.xht [ Failure ] crbug.com/626703 external/wpt/css/css-fonts/font-variant-06.xht [ Failure ] crbug.com/626703 external/wpt/css/mediaqueries/viewport-script-dynamic.html [ Failure ] @@ -3453,7 +3454,6 @@ crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-container-auto-margins-scrollbars-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-content-alignment-auto-sized-tracks-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-content-alignment-overflow-001.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-002.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-content-distribution-with-collapsed-tracks-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-content-distribution-with-collapsed-tracks-002.html [ Failure ] @@ -3481,7 +3481,6 @@ crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-item-no-aspect-ratio-stretch-5.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-item-no-aspect-ratio-stretch-6.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-item-no-aspect-ratio-stretch-7.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-place-content-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-row-axis-alignment-positioned-items-017.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-row-axis-self-baseline-synthesized-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-row-axis-self-baseline-synthesized-002.html [ Failure ] @@ -3524,21 +3523,18 @@ crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-horiz-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-horiz-002.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-horiz-003.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-horiz-004.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-horiz-005.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-horiz-006.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-horiz-007.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-lr-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-lr-002.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-lr-003.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-lr-004.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-lr-005.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-lr-006.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-lr-007.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-rl-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-rl-002.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-rl-003.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-rl-004.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-rl-005.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-rl-006.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-vertical-rl-007.html [ Failure ] @@ -3590,8 +3586,6 @@ crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-item-percentage-sizes-003.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-item-overflow-auto-max-height-percentage.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-minimum-size-grid-items-017.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-items-001.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-items-002.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-items-minimum-width-orthogonal-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-items-minimum-width-orthogonal-002.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-items-percentage-margins-001.html [ Failure ] @@ -3607,7 +3601,6 @@ crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-items-relative-offsets-002.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-minimum-size-grid-items-015.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-minimum-size-grid-items-021.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-minimum-size-grid-items-022.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-minimum-size-grid-items-023.html [ Failure ] @@ -3615,13 +3608,7 @@ crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-minimum-size-grid-items-025.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-layout-properties.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-model/grid-box-sizing-001.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-order-property-auto-placement-001.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-order-property-auto-placement-002.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-order-property-auto-placement-003.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-order-property-auto-placement-004.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-items/grid-order-property-auto-placement-005.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-model/iner-ignores-first-letter-001.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-model/grid-float-002.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-model/grid-gutters-and-flex-content-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-model/grid-gutters-as-percentage-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-tracks-stretched-with-different-flex-factors-sum.html [ Failure ] @@ -3662,8 +3649,6 @@ crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/parsing/grid-template-rows-computed-implicit-track.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/parsing/grid-template-rows-computed-withcontent.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/parsing/grid-template-rows-computed.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/placement/grid-container-change-named-grid-recompute-child-positions-001.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/auto-content-resolution-columns.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/flex-and-content-sized-resolution-columns.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/flex-content-sized-column-use-available-width.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/flex-content-sized-columns-resize.html [ Failure Timeout ] @@ -3674,7 +3659,6 @@ crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-auto-repeat-huge-grid.html [ Failure Crash ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-columns-rows-get-set.html [ Failure Crash ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-element-auto-repeat-get-set.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-element-min-max-width.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-element-repeat-get-set.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-grow-tracks-to-their-max.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-initialize-span-one-items.html [ Failure ] @@ -3684,8 +3668,6 @@ crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-item-grid-container-percentage-rows.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-item-multiple-minmax-content-resolution.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-item-named-grid-line-resolution.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-item-named-grid-area-resolution.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-item-negative-indexes.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-item-negative-position-resolution.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-item-positioning-with-orthogonal-flows.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-item-removal-auto-placement-update.html [ Failure Crash ] @@ -3705,21 +3687,17 @@ crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-track-sizing-with-orthogonal-flows.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-track-sizing-with-percentages-and-orthogonal-flows.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/grid-update-sizes-after-distributing-all.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/implicit-columns-auto-resolution.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/implicit-position-dynamic-change.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/implicit-tracks-before-explicit.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/mark-as-infinitely-growable.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/maximize-tracks-definite-indefinite-height.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/maximize-tracks-definite-indefinite-width.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/min-content-row-must-shrink-when-column-grows.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/min-height-border-box.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/min-width-margin-box.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/minmax-max-content-resolution-rows.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/minmax-min-content-column-resolution-rows.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/minmax-spanning-resolution-rows.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/minmax-spanning-resolution-columns.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/mozilla/grid-repeat-auto-fill-fit-005-part-2.html [ Failure Crash ] -crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/named-grid-lines-with-named-grid-areas-resolution.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/named-grid-areas-dynamic-with-media-query.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/named-grid-line-get-set.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/fast/css-grid-layout/named-grid-lines-computed-style-implicit-tracks.html [ Failure ] @@ -4539,7 +4517,6 @@ crbug.com/937811 [ Linux Release ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Pass Failure Timeout ] crbug.com/937811 [ Linux Release ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-3.js [ Pass Failure ] crbug.com/937811 [ Win Release ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Pass Failure Timeout ] -crbug.com/935689 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/symbols-function.html [ Failure Pass ] # Sheriff 2019-03-05 crbug.com/938200 http/tests/devtools/network/network-blocked-reason.js [ Timeout Pass ] @@ -5682,3 +5659,8 @@ # Timing out on Fuchsia crbug.com/1171283 [ Fuchsia ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-zoom-out-slow.html [ Pass Timeout ] + +# Sheriff 2021-02-09 +crbug.com/1176286 [ Linux ] http/tests/devtools/service-workers/service-workers-redundant.js [ Failure Pass ] +crbug.com/1175901 [ Linux ] http/tests/devtools/console/console-search-reveals-messages.js [ Failure Pass ] +crbug.com/1175901 [ Linux ] http/tests/devtools/console/console-viewport-stick-to-bottom.js [ Failure Pass ]
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 a37e933..ced367f0 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
@@ -77,6 +77,13 @@ null, {} ] + ], + "no-room-for-line-in-first-fragmentainer-crash.html": [ + "bc7b9aaa5e6e563f781b02924cf87aefcd997138", + [ + null, + {} + ] ] }, "css-contain": { @@ -501,12 +508,26 @@ ] ], "crashtests": { + "dialog-table-crash.html": [ + "decc3eb1fbe1937e693a5401c64f58a3411d792b", + [ + null, + {} + ] + ], "inline-splitting-crash.html": [ "decc3eb1fbe1937e693a5401c64f58a3411d792b", [ null, {} ] + ], + "uninitialized_read_crash.html": [ + "5aa3b223cd53401edf01a25d2079a87b034b76fb", + [ + null, + {} + ] ] }, "visibility-collapse-colspan-crash.html": [ @@ -9952,13 +9973,6 @@ null, {} ] - ], - "multi-touch-interfaces-manual.html": [ - "e9f1b91c4862ebaa77fb855b6d20c2850e5b482b", - [ - null, - {} - ] ] }, "uievents": { @@ -53580,6 +53594,32 @@ {} ] ], + "out-of-flow-in-multicolumn-016.html": [ + "141cae73d86058a6475f48bcc3f4cdabc2ad80ba", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "out-of-flow-in-multicolumn-017.html": [ + "aa56a7cddfcee78a9f57d350a579690953d0ca34", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "overflowed-block-with-no-room-after-000.html": [ "084e16fb38de072fb83f92ba01302a2e404cdd97", [ @@ -84992,6 +85032,45 @@ ], {} ] + ], + "table-grid-item-dynamic-002.html": [ + "fdec4e6b3b423e4ca872210473ebd6a1f8f47b13", + [ + null, + [ + [ + "/css/css-grid/table-grid-item-dynamic-002-ref.html", + "==" + ] + ], + {} + ] + ], + "table-grid-item-dynamic-003.html": [ + "32b809c5dcbc33a8c42f575879cd59faddab7318", + [ + null, + [ + [ + "/css/css-grid/table-grid-item-dynamic-003-ref.html", + "==" + ] + ], + {} + ] + ], + "table-grid-item-dynamic-004.html": [ + "537d85ad3420fc66929511f7ced486482340fbca", + [ + null, + [ + [ + "/css/css-grid/table-grid-item-dynamic-004-ref.html", + "==" + ] + ], + {} + ] ] }, "css-images": { @@ -162587,7 +162666,7 @@ ] ], "redefine-attr-mapping.html": [ - "1e3fcfcf59b9acc2565b6f8907b74e58ca0dceb8", + "6c53b42df8153cabcb2f3d1049f663a9015b343b", [ null, [ @@ -203567,6 +203646,18 @@ "362904334aaef447de9d895e413474a9b4d2c5a6", [] ], + "table-grid-item-dynamic-002-ref.html": [ + "88fdfa71f109edc61e74c0ecf3300c7f981925f7", + [] + ], + "table-grid-item-dynamic-003-ref.html": [ + "1de4ccea471b5e5b12f6766ab63a1294f8cc93f9", + [] + ], + "table-grid-item-dynamic-004-ref.html": [ + "9189fb5f7e2f85fa7b9fef04c6b764c35bb96515", + [] + ], "test-plan": { "index.html": [ "039f3a87c1a7d042af4ac043b1a5c4c4cb6c0d1e", @@ -222125,7 +222216,7 @@ [] ], "redefine-attr-mapping-ref.html": [ - "3924851b5188bb298d3f1d6a240b65579d81c7da", + "744aa32855492b9b8cee9e170ca7de9cab7dc70e", [] ], "redefine-builtin-ref.html": [ @@ -225954,7 +226045,7 @@ [] ], "event-timing-test-utils.js": [ - "749cfe3c19d1b3c65da1530bd339190b0566f429", + "70fd66abfbcb22a62c699dba4466f76a539729ed", [] ], "slow-image.py": [ @@ -333662,7 +333753,7 @@ ] ], "crossiframe.html": [ - "147e144631df10ef9e829e9978828e40b1289ceb", + "6beb9aa357f9490eeff55bc762ab178b1dc58619", [ null, { @@ -333842,7 +333933,7 @@ ] ], "mouseenter.html": [ - "804d5743742c73ec769613e41ce45bf190a473a9", + "1d0171ec460e2abf7c61587030735b8f44136a16", [ null, { @@ -333851,7 +333942,7 @@ ] ], "mouseleave.html": [ - "202cf73e2a616c5612232a7e1f987570eed9e2e3", + "b3cf1447e381639a1e3703d649e3aa452662637d", [ null, { @@ -333906,7 +333997,7 @@ ] ], "pointerenter.html": [ - "bae1c51d51cde4d2314e310693328fd26dbd8be3", + "bb8ee08abc7a35bd4ed915cfe68a71c528de972d", [ null, { @@ -333915,7 +334006,7 @@ ] ], "pointerleave.html": [ - "81e8f15ec0d16a53182f06e7f9553228cc0ab7ec", + "b17464e0e7b004f4a11682bc5db98f129f876ed2", [ null, { @@ -333978,6 +334069,15 @@ } ] ], + "shadow-dom-null-target.html": [ + "89587312c89ba20578538a37ed30ee3904a5058b", + [ + null, + { + "testdriver": true + } + ] + ], "supported-types.window.js": [ "1cc43495c096fd0cd568fa5983055c0390f94d40", [ @@ -335534,7 +335634,7 @@ ] ], "keepalive.html": [ - "a6405dcea6f24b53db1f502b6c6233563808591f", + "36d156bba43606dc6ebfc29024ad59cdbad667f4", [ null, {} @@ -385518,7 +385618,7 @@ ] ], "navigator-pluginarray.html": [ - "15d671153643112b016cd6ad0cbf47e668c00dab", + "cd5fc41856cb4a9b46c31a743fc09a85daa5390f", [ null, {} @@ -427489,6 +427589,15 @@ } ] ], + "multi-touch-interfaces.html": [ + "fae884480fea05e25f9c40007d0d5cd7e1db8390", + [ + null, + { + "testdriver": true + } + ] + ], "single-touch.html": [ "a067bc13801928caf1bfc873a80208db4b9b0bbd", [ @@ -428253,6 +428362,17 @@ ] ] }, + "keyboard": { + "modifier-keys.html": [ + "635e5d3b7797e1fcde058f81dda1b3b2132ee375", + [ + null, + { + "testdriver": true + } + ] + ] + }, "legacy": { "Event-subclasses-init.html": [ "a79a9f18adba6e329b6be8c45724417b4e337fde", @@ -439999,7 +440119,7 @@ ] ], "RTCPeerConnection-capture-video.https.html": [ - "ed12e68e598e09880b7004ec0c52be30f41fbab8", + "b6c0222dc21d779a6ab982d963cf3fd5acfc19c1", [ null, {
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-blob.html b/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-blob.html deleted file mode 100644 index 805ea63..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-blob.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>W3C Beacon Basic Blob Test</title> - <meta name="timeout" content="long"> - <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> -</head> -<body> - <script src="/common/utils.js"></script> - <script src="beacon-common.sub.js"></script> - <script> - "use strict"; - runTests(blobTests); - </script> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-blobMax.html b/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-blobMax.html deleted file mode 100644 index e18b163..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-blobMax.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>W3C Beacon Basic Blob Test - MaxSize</title> - <meta name="timeout" content="long"> - <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> -</head> -<body> - <script src="/common/utils.js"></script> - <script src="beacon-common.sub.js"></script> - <script> - "use strict"; - runTests(blobMaxTest); - </script> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-buffersource.html b/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-buffersource.html deleted file mode 100644 index 14c7a4f3..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-buffersource.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>W3C Beacon Basic BufferSource Test</title> - <meta name="timeout" content="long"> - <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> -</head> -<body> - <script src="/common/utils.js"></script> - <script src="beacon-common.sub.js"></script> - <script> - "use strict"; - runTests(bufferSourceTests); - </script> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-buffersourceMax.html b/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-buffersourceMax.html deleted file mode 100644 index 5163ecd..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-buffersourceMax.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>W3C Beacon Basic BufferSource Test - MaxSize</title> - <meta name="timeout" content="long"> - <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> -</head> -<body> - <script src="/common/utils.js"></script> - <script src="beacon-common.sub.js"></script> - <script> - "use strict"; - runTests(bufferSourceMaxTest); - </script> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-formdata.html b/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-formdata.html deleted file mode 100644 index 9f46cf6..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-formdata.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>W3C Beacon Basic FormData Test</title> - <meta name="timeout" content="long"> - <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> -</head> -<body> - <script src="/common/utils.js"></script> - <script src="beacon-common.sub.js"></script> - <script> - "use strict"; - runTests(formDataTests); - </script> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-formdataMax.html b/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-formdataMax.html deleted file mode 100644 index 2c7e0fa..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-formdataMax.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>W3C Beacon Basic FormData Test</title> - <meta name="timeout" content="long"> - <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> -</head> -<body> - <script src="/common/utils.js"></script> - <script src="beacon-common.sub.js"></script> - <script> - "use strict"; - runTests(formDataMaxTest); - </script> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-string.html b/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-string.html deleted file mode 100644 index cba65da..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-string.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>W3C Beacon Basic String Test</title> - <meta name="timeout" content="long"> - <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> -</head> -<body> - <script src="/common/utils.js"></script> - <script src="beacon-common.sub.js"></script> - <script> - "use strict"; - runTests(stringTests); - </script> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-stringMax.html b/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-stringMax.html deleted file mode 100644 index 005e9f5c..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic-stringMax.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>W3C Beacon Basic String Test - MaxSize</title> - <meta name="timeout" content="long"> - <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> -</head> -<body> - <script src="/common/utils.js"></script> - <script src="beacon-common.sub.js"></script> - <script> - "use strict"; - runTests(stringMaxTest); - </script> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/beacon/beacon-basic.https.window-expected.txt new file mode 100644 index 0000000..05875121 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/beacon/beacon-basic.https.window-expected.txt
@@ -0,0 +1,28 @@ +This is a testharness.js-based test. +FAIL simple case: with no payload assert_equals: content-type expected "(missing)" but got "text/plain;charset=UTF-8" +FAIL simple case: with null payload assert_equals: content-type expected "(missing)" but got "text/plain;charset=UTF-8" +PASS simple case: type = string and size = empty +PASS simple case: type = arraybuffer and size = empty +PASS simple case: type = form and size = empty +PASS simple case: type = blob and size = empty +PASS simple case: type = string and size = small +PASS simple case: type = arraybuffer and size = small +PASS simple case: type = form and size = small +PASS simple case: type = blob and size = small +PASS simple case: type = string and size = large +PASS simple case: type = arraybuffer and size = large +PASS simple case: type = form and size = large +PASS simple case: type = blob and size = large +PASS simple case: type = string and size = max +PASS simple case: type = arraybuffer and size = max +PASS simple case: type = blob and size = max +PASS Too large payload should be rejected: type = string +PASS Too large payload should be rejected: type = arraybuffer +PASS Too large payload should be rejected: type = form +PASS Too large payload should be rejected: type = blob +PASS Payload size restriction should be accumulated: type = string +PASS Payload size restriction should be accumulated: type = arraybuffer +PASS Payload size restriction should be accumulated: type = blob +PASS sendBeacon() with a stream does not work due to the keepalive flag being set +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-basic.https.window.js b/third_party/blink/web_tests/external/wpt/beacon/beacon-basic.https.window.js new file mode 100644 index 0000000..47117716 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/beacon/beacon-basic.https.window.js
@@ -0,0 +1,98 @@ +// META: timeout=long +// META: script=/common/utils.js +// META: script=beacon-common.sub.js + +'use strict'; + +// TODO(yhirano): Check the sec-fetch-mode request header once WebKit supports +// the feature. + +parallelPromiseTest(async (t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); + + const id = token(); + const url = `/beacon/resources/beacon.py?cmd=store&id=${id}`; + assert_true(iframe.contentWindow.navigator.sendBeacon(url)); + iframe.remove(); + + const result = await waitForResult(id); + assert_equals(result.type, '(missing)', 'content-type'); +}, `simple case: with no payload`); + +parallelPromiseTest(async (t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); + + const id = token(); + const url = `/beacon/resources/beacon.py?cmd=store&id=${id}`; + assert_true(iframe.contentWindow.navigator.sendBeacon(url, null)); + iframe.remove(); + + const result = await waitForResult(id); + assert_equals(result.type, '(missing)', 'content-type'); +}, `simple case: with null payload`); + +for (const size of [EMPTY, SMALL, LARGE, MAX]) { + for (const type of [STRING, ARRAYBUFFER, FORM, BLOB]) { + if (size === MAX && type === FORM) { + // It is difficult to estimate the size of a form accurately, so we cannot + // test this case. + continue; + } + parallelPromiseTest(async (t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); + + const payload = makePayload(size, type); + const id = token(); + const url = `/beacon/resources/beacon.py?cmd=store&id=${id}`; + assert_true(iframe.contentWindow.navigator.sendBeacon(url, payload)); + iframe.remove(); + + const result = await waitForResult(id); + if (getContentType(type) === null) { + assert_equals(result.type, '(missing)', 'content-type'); + } else { + assert_true(result.type.includes(getContentType(type)), 'content-type'); + } + }, `simple case: type = ${type} and size = ${size}`); + } +} + +for (const type of [STRING, ARRAYBUFFER, FORM, BLOB]) { + parallelPromiseTest(async (t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); + + const payload = makePayload(TOOLARGE, type); + const id = token(); + const url = `/beacon/resources/beacon.py?cmd=store&id=${id}`; + assert_false(iframe.contentWindow.navigator.sendBeacon(url, payload)); + }, `Too large payload should be rejected: type = ${type}`); +} + +for (const type of [STRING, ARRAYBUFFER, BLOB]) { + parallelPromiseTest(async (t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); + + assert_true(iframe.contentWindow.navigator.sendBeacon( + `/beacon/resources/beacon.py?cmd=store&id=${token()}`, + makePayload(MAX, type))); + assert_true(iframe.contentWindow.navigator.sendBeacon( + `/beacon/resources/beacon.py?cmd=store&id=${token()}`, '')); + assert_false(iframe.contentWindow.navigator.sendBeacon( + `/beacon/resources/beacon.py?cmd=store&id=${token()}`, 'x')); + }, `Payload size restriction should be accumulated: type = ${type}`); +} + +test(() => { + assert_throws_js( + TypeError, () => navigator.sendBeacon('...', new ReadableStream())); +}, 'sendBeacon() with a stream does not work due to the keepalive flag being set');
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-common.sub.js b/third_party/blink/web_tests/external/wpt/beacon/beacon-common.sub.js index 279ad22..4699495 100644 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-common.sub.js +++ b/third_party/blink/web_tests/external/wpt/beacon/beacon-common.sub.js
@@ -1,172 +1,111 @@ -"use strict"; +'use strict'; -// Different sizes of payloads to test. -var smallPayloadSize = 10; -var mediumPayloadSize = 10000; -var largePayloadSize = 50000; -var maxPayloadSize = 65536; // The maximum payload size allowed for a beacon request. +const EMPTY = 'empty'; +const SMALL = 'small'; +const LARGE = 'large'; +const MAX = 'max'; +const TOOLARGE = 'toolarge'; -// String payloads of various sizes sent by sendbeacon. The format of the payloads is a string: -// <numberOfCharacters>:<numberOfCharacters *'s> -// ex. "10:**********" -var smallPayload = smallPayloadSize + ":" + Array(smallPayloadSize).fill('*').join(""); -var mediumPayload = mediumPayloadSize + ":" + Array(mediumPayloadSize).fill('*').join(""); -var largePayload = largePayloadSize + ":" + Array(largePayloadSize).fill('*').join(""); -// Subtract 6 from maxPayloadSize because 65536 is 5 digits, plus 1 more for the ':' -var maxPayload = (maxPayloadSize - 6) + ":" + Array(maxPayloadSize - 6).fill('*').join("") +const STRING = 'string'; +const ARRAYBUFFER = 'arraybuffer'; +const FORM = 'form'; +const BLOB = 'blob'; -// Test case definitions. -// name: String containing the unique name of the test case. -// data: Payload object to send through sendbeacon. -var noDataTest = { name: "NoData" }; -var nullDataTest = { name: "NullData", data: null }; -var undefinedDataTest = { name: "UndefinedData", data: undefined }; -var smallStringTest = { name: "SmallString", data: smallPayload }; -var mediumStringTest = { name: "MediumString", data: mediumPayload }; -var largeStringTest = { name: "LargeString", data: largePayload }; -var maxStringTest = { name: "MaxString", data: maxPayload }; -var emptyBlobTest = { name: "EmptyBlob", data: new Blob() }; -var smallBlobTest = { name: "SmallBlob", data: new Blob([smallPayload]) }; -var mediumBlobTest = { name: "MediumBlob", data: new Blob([mediumPayload]) }; -var largeBlobTest = { name: "LargeBlob", data: new Blob([largePayload]) }; -var maxBlobTest = { name: "MaxBlob", data: new Blob([maxPayload]) }; -var emptyBufferSourceTest = { name: "EmptyBufferSource", data: new Uint8Array() }; -var smallBufferSourceTest = { name: "SmallBufferSource", data: CreateArrayBufferFromPayload(smallPayload) }; -var mediumBufferSourceTest = { name: "MediumBufferSource", data: CreateArrayBufferFromPayload(mediumPayload) }; -var largeBufferSourceTest = { name: "LargeBufferSource", data: CreateArrayBufferFromPayload(largePayload) }; -var maxBufferSourceTest = { name: "MaxBufferSource", data: CreateArrayBufferFromPayload(maxPayload) }; -var emptyFormDataTest = { name: "EmptyFormData", data: CreateEmptyFormDataPayload() }; -var smallFormDataTest = { name: "SmallFormData", data: CreateFormDataFromPayload(smallPayload) }; -var mediumFormDataTest = { name: "MediumFormData", data: CreateFormDataFromPayload(mediumPayload) }; -var largeFormDataTest = { name: "LargeFormData", data: CreateFormDataFromPayload(largePayload) }; -var smallSafeContentTypeEncodedTest = { name: "SmallSafeContentTypeEncoded", data: new Blob([smallPayload], { type: 'application/x-www-form-urlencoded' }) }; -var smallSafeContentTypeFormTest = { name: "SmallSafeContentTypeForm", data: new FormData() }; -var smallSafeContentTypeTextTest = { name: "SmallSafeContentTypeText", data: new Blob([smallPayload], { type: 'text/plain' }) }; -var smallCORSContentTypeTextTest = { name: "SmallCORSContentTypeText", data: new Blob([smallPayload], { type: 'text/html' }) }; -// We don't test maxFormData because the extra multipart separators make it difficult to -// calculate a maxPayload. - -// Test case suites. -// Due to quota limits we split the max payload tests into their own bucket. -var stringTests = [noDataTest, nullDataTest, undefinedDataTest, smallStringTest, mediumStringTest, largeStringTest]; -var stringMaxTest = [maxStringTest]; -var blobTests = [emptyBlobTest, smallBlobTest, mediumBlobTest, largeBlobTest]; -var blobMaxTest = [maxBlobTest]; -var bufferSourceTests = [emptyBufferSourceTest, smallBufferSourceTest, mediumBufferSourceTest, largeBufferSourceTest]; -var bufferSourceMaxTest = [maxBufferSourceTest]; -var formDataTests = [emptyFormDataTest, smallFormDataTest, mediumFormDataTest, largeFormDataTest]; -var formDataMaxTest = [largeFormDataTest]; -var contentTypeTests = [smallSafeContentTypeEncodedTest,smallSafeContentTypeFormTest,smallSafeContentTypeTextTest,smallCORSContentTypeTextTest]; -var allTests = [].concat(stringTests, stringMaxTest, blobTests, blobMaxTest, bufferSourceTests, bufferSourceMaxTest, formDataTests, formDataMaxTest, contentTypeTests); - -// This special cross section of test cases is meant to provide a slimmer but reasonably- -// representative set of tests for parameterization across variables (e.g. redirect codes, -// cors modes, etc.) -var sampleTests = [noDataTest, nullDataTest, undefinedDataTest, smallStringTest, smallBlobTest, smallBufferSourceTest, smallFormDataTest, smallSafeContentTypeEncodedTest, smallSafeContentTypeFormTest, smallSafeContentTypeTextTest]; - -var preflightTests = [smallCORSContentTypeTextTest]; - -// Helper function to create an ArrayBuffer representation of a string. -function CreateArrayBufferFromPayload(payload) { - var length = payload.length; - var buffer = new Uint8Array(length); - - for (var i = 0; i < length; i++) { - buffer[i] = payload.charCodeAt(i); - } - - return buffer; +function getContentType(type) { + switch (type) { + case STRING: + return 'text/plain;charset=UTF-8'; + case ARRAYBUFFER: + return null; + case FORM: + return 'multipart/form-data'; + case BLOB: + return null; + default: + throw Error(`invalid type: ${type}`); + } } -// Helper function to create an empty FormData object. -function CreateEmptyFormDataPayload() { - if (self.document === undefined) { - return null; - } +// Create a payload with the given size and type. +// `sizeString` must be one of EMPTY, SMALL, LARGE, MAX, TOOLARGE. +// `type` must be one of STRING, ARRAYBUFFER, FORM, BLOB. +// `contentType` is effective only if `type` is BLOB. +function makePayload(sizeString, type, contentType) { + let size = 0; + switch (sizeString) { + case EMPTY: + size = 0; + break; + case SMALL: + size = 10; + break; + case LARGE: + size = 10 * 1000; + break; + case MAX: + if (type === FORM) { + throw Error('Not supported'); + } + size = 65536; + break; + case TOOLARGE: + size = 65537; + break; + default: + throw Error('invalid size'); + } - return new FormData(); + let data = ''; + if (size > 0) { + const prefix = String(size) + ':'; + data = prefix + Array(size - prefix.length).fill('*').join(''); + } + + switch (type) { + case STRING: + return data; + case ARRAYBUFFER: + return new TextEncoder().encode(data).buffer; + case FORM: + const formData = new FormData(); + if (size > 0) { + formData.append('payload', data); + } + return formData; + case BLOB: + const options = contentType ? {type: contentType} : undefined; + const blob = new Blob([data], options); + return blob; + default: + throw Error('invalid type'); + } } -// Helper function to create a FormData representation of a string. -function CreateFormDataFromPayload(payload) { - if (self.document === undefined) { - return null; - } - - var formData = new FormData(); - formData.append("payload", payload); - return formData; -} - -// Schedules promise_test's for each of the test cases. -// Parameters: -// testCases: An array of test cases. -// suffix [optional]: A string used for the suffix for each test case name. -// buildUrl [optional]: A function that returns a beacon URL given an id. -// sendData [optional]: A function that sends the beacon with given a URL and payload. -function runTests(testCases, suffix = '', buildUrl = self.buildUrl, sendData = self.sendData) { - for (const testCase of testCases) { - const id = token(); - promise_test((test) => { - const url = buildUrl(id); - assert_true(sendData(url, testCase.data), 'sendBeacon should succeed'); - return waitForResult(id); - }, `Verify 'navigator.sendbeacon()' successfully sends for variant: ${testCase.name}${suffix}`); - }; -} - -function buildUrl(id) { - const baseUrl = "http://{{host}}:{{ports[http][0]}}"; - return `${baseUrl}/beacon/resources/beacon.py?cmd=store&id=${id}`; -} - -// Sends the beacon for a single test. This step is factored into its own function so that -// it can be called from a web worker. It does not check for results. -// Note: do not assert from this method, as when called from a worker, we won't have the -// full testharness.js test context. Instead return 'false', and the main scope will fail -// the test. -// Returns the result of the 'sendbeacon()' function call, true or false. -function sendData(url, payload) { - return self.navigator.sendBeacon(url, payload); +function parallelPromiseTest(func, description) { + async_test((t) => { + Promise.resolve(func(t)).then(() => t.done()).catch(t.step_func((e) => { + throw e; + })); + }, description); } // Poll the server for the test result. -async function waitForResult(id) { - const url = `resources/beacon.py?cmd=stat&id=${id}`; - for (let i = 0; i < 30; ++i) { - const response = await fetch(url); - const text = await response.text(); - const results = JSON.parse(text); +async function waitForResult(id, expectedError = null) { + const url = `/beacon/resources/beacon.py?cmd=stat&id=${id}`; + for (let i = 0; i < 30; ++i) { + const response = await fetch(url); + const text = await response.text(); + const results = JSON.parse(text); - if (results.length === 0) { - await new Promise(resolve => step_timeout(resolve, 100)); - continue; - } - assert_equals(results.length, 1, `bad response: '${text}'`);; - // null JSON values parse as null, not undefined - assert_equals(results[0].error, null, "'sendbeacon' data must not fail validation"); - return; + if (results.length === 0) { + await new Promise(resolve => step_timeout(resolve, 100)); + continue; } - assert_true(false, 'timeout'); -} - -// Creates an iframe on the document's body and runs the sample tests from the iframe. -// The iframe is navigated immediately after it sends the data, and the window verifies -// that the data is still successfully sent. -function runSendInIframeAndNavigateTests() { - var iframe = document.createElement("iframe"); - iframe.id = "iframe"; - iframe.onload = function() { - // Clear our onload handler to prevent re-running the tests as we navigate away. - iframe.onload = null; - function sendData(url, payload) { - return iframe.contentWindow.navigator.sendBeacon(url, payload); - } - runTests(sampleTests, '-NAVIGATE', self.buildUrl, sendData); - // Now navigate ourselves. - iframe.contentWindow.location = "http://{{host}}:{{ports[http][0]}}/"; - }; - - iframe.srcdoc = '<html></html>'; - document.body.appendChild(iframe); + assert_equals(results.length, 1, `bad response: '${text}'`); + const result = results[0]; + // null JSON values parse as null, not undefined + assert_equals(result.error, expectedError, 'error recorded in stash'); + return result; + } + assert_true(false, 'timeout'); }
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-cors.https.window.js b/third_party/blink/web_tests/external/wpt/beacon/beacon-cors.https.window.js new file mode 100644 index 0000000..6f282a2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/beacon/beacon-cors.https.window.js
@@ -0,0 +1,132 @@ +// META: timeout=long +// META: script=/common/get-host-info.sub.js +// META: script=/common/utils.js +// META: script=beacon-common.sub.js + +'use strict'; + +const {HTTPS_ORIGIN, ORIGIN, HTTPS_REMOTE_ORIGIN} = get_host_info(); + +// As /common/redirect.py is not under our control, let's make sure that +// it doesn't support CORS. +parallelPromiseTest(async (t) => { + const destination = `${HTTPS_REMOTE_ORIGIN}/common/text-plain.txt` + + `?pipe=header(access-control-allow-origin,*)`; + const redirect = `${HTTPS_REMOTE_ORIGIN}/common/redirect.py` + + `?location=${encodeURIComponent(destination)}`; + + // Fetching `destination` is fine because it supports CORS. + await fetch(destination); + + // Fetching redirect.py should fail because it doesn't support CORS. + await promise_rejects_js(t, TypeError, fetch(redirect)); +}, '/common/redirect.py does not support CORS'); + +for (const type of [STRING, ARRAYBUFFER, FORM, BLOB]) { + parallelPromiseTest(async (t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); + + const payload = makePayload(SMALL, type); + const id = token(); + // As we use "no-cors" for CORS-safelisted requests, the redirect is + // processed without an error while the request is cross-origin and the + // redirect handler doesn't support CORS. + const destination = + `${HTTPS_REMOTE_ORIGIN}/beacon/resources/beacon.py?cmd=store&id=${id}`; + const url = `${HTTPS_REMOTE_ORIGIN}/common/redirect.py` + + `?status=307&location=${encodeURIComponent(destination)}`; + + assert_true(iframe.contentWindow.navigator.sendBeacon(url, payload)); + iframe.remove(); + + await waitForResult(id); + }, `cross-origin, CORS-safelisted: type = ${type}`); +} + +parallelPromiseTest(async (t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); + + const payload = makePayload(SMALL, BLOB, 'application/octet-stream'); + const id = token(); + const destination = + `${HTTPS_REMOTE_ORIGIN}/beacon/resources/beacon.py?cmd=store&id=${id}`; + const url = `${HTTPS_REMOTE_ORIGIN}/common/redirect.py` + + `?status=307&location=${encodeURIComponent(destination)}`; + assert_true(iframe.contentWindow.navigator.sendBeacon(url, payload)); + iframe.remove(); + + // The beacon is rejected during redirect handling because /common/redirect.py + // doesn't support CORS. + + await new Promise((resolve) => step_timeout(resolve, 3000)); + const res = await fetch(`/beacon/resources/beacon.py?cmd=stat&id=${id}`); + assert_equals((await res.json()).length, 0); +}, `cross-origin, non-CORS-safelisted: failure case (with redirect)`); + +parallelPromiseTest(async (t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); + + const payload = makePayload(SMALL, BLOB, 'application/octet-stream'); + const id = token(); + const url = + `${HTTPS_REMOTE_ORIGIN}/beacon/resources/beacon.py?cmd=store&id=${id}`; + assert_true(iframe.contentWindow.navigator.sendBeacon(url, payload)); + iframe.remove(); + + // The beacon is rejected during preflight handling. + await waitForResult(id, /*expectedError=*/ 'Preflight not expected.'); +}, `cross-origin, non-CORS-safelisted: failure case (without redirect)`); + +for (const credentials of [false, true]) { + parallelPromiseTest(async (t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); + + const payload = makePayload(SMALL, BLOB, 'application/octet-stream'); + const id = token(); + let url = `${HTTPS_REMOTE_ORIGIN}/beacon/resources/beacon.py` + + `?cmd=store&id=${id}&preflightExpected&origin=${ORIGIN}`; + if (credentials) { + url += `&credentials=true`; + } + assert_true(iframe.contentWindow.navigator.sendBeacon(url, payload)); + iframe.remove(); + + // We need access-control-allow-credentials in the preflight response. This + // shows that the request's credentials mode is 'include'. + if (credentials) { + const result = await waitForResult(id); + assert_equals(result.type, 'application/octet-stream'); + } else { + await new Promise((resolve) => step_timeout(resolve, 3000)); + const res = await fetch(`/beacon/resources/beacon.py?cmd=stat&id=${id}`); + assert_equals((await res.json()).length, 0); + } + }, `cross-origin, non-CORS-safelisted[credentials=${credentials}]`); +} + +parallelPromiseTest(async (t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); + + const payload = makePayload(SMALL, BLOB, 'application/octet-stream'); + const id = token(); + const destination = `${HTTPS_REMOTE_ORIGIN}/beacon/resources/beacon.py` + + `?cmd=store&id=${id}&preflightExpected&origin=${ORIGIN}&credentials=true`; + const url = `${HTTPS_REMOTE_ORIGIN}/fetch/api/resources/redirect.py` + + `?redirect_status=307&allow_headers=content-type` + + `&location=${encodeURIComponent(destination)}`; + assert_true(iframe.contentWindow.navigator.sendBeacon(url, payload)); + iframe.remove(); + + const result = await waitForResult(id); + assert_equals(result.type, 'application/octet-stream'); +}, `cross-origin, non-CORS-safelisted success-case (with redirect)`);
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-cors.sub.window.js b/third_party/blink/web_tests/external/wpt/beacon/beacon-cors.sub.window.js deleted file mode 100644 index 5543bdd..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-cors.sub.window.js +++ /dev/null
@@ -1,42 +0,0 @@ -// META: timeout=long -// META: script=/common/utils.js -// META: script=beacon-common.sub.js - -"use strict"; - -// Execute each sample test with a cross-origin URL. If allowCors is 'true' -// the beacon handler will return CORS headers. This test ensures that the -// sendBeacon() succeeds in either case. -[true, false].forEach(function(allowCors) { - function buildUrl(id) { - const baseUrl = "http://{{domains[www]}}:{{ports[http][0]}}"; - // Note that 'allowCors=true' is not necessary for the sendBeacon() to reach - // the server. Beacons use the HTTP POST method, which is a CORS-safelisted - // method, and thus they do not trigger preflight. If the server does not - // respond with Access-Control-Allow-Origin and Access-Control-Allow-Credentials - // headers, an error will be printed to the console, but the request will - // already have reached the server. Since beacons are fire-and-forget, the - // error will not affect any client script, either -- not even the return - // value of the sendBeacon() call, because the underlying fetch is asynchronous. - // The "Beacon CORS" tests are merely testing that sendBeacon() to a cross- - // origin URL *will* work regardless. - const additionalQuery = allowCors ? "&origin=http://{{host}}:{{ports[http][0]}}&credentials=true" : ""; - return `${baseUrl}/beacon/resources/beacon.py?cmd=store&id=${id}${additionalQuery}` - } - runTests(sampleTests, allowCors ? "-CORS-ALLOW" : "-CORS-FORBID", buildUrl); -}); - -// Now test a cross-origin request that doesn't use a safelisted Content-Type and ensure -// we are applying the proper restrictions. Since a non-safelisted Content-Type request -// header is used there should be a preflight/options request and we should only succeed -// send the payload if the proper CORS headers are used. -{ - function buildUrl(id) { - const baseUrl = "http://{{domains[www]}}:{{ports[http][0]}}"; - const additionalQuery = "&origin=http://{{host}}:{{ports[http][0]}}&credentials=true&preflightExpected=true"; - return `${baseUrl}/beacon/resources/beacon.py?cmd=store&id=${id}${additionalQuery}` - } - runTests(preflightTests, "-PREFLIGHT-ALLOW", buildUrl); -} - -done();
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-error.sub.window.js b/third_party/blink/web_tests/external/wpt/beacon/beacon-error.sub.window.js deleted file mode 100644 index 499fa3b2..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-error.sub.window.js +++ /dev/null
@@ -1,48 +0,0 @@ -// META: script=/common/utils.js -// META: script=beacon-common.sub.js - -"use strict"; - -test(function() { - // Payload that should cause sendBeacon to return false because it exceeds the maximum payload size. - var exceedPayload = Array(maxPayloadSize + 1).fill('z').join(""); - - var success = navigator.sendBeacon("http://{{hosts[][nonexistent]}}", exceedPayload); - assert_false(success, "calling 'navigator.sendBeacon()' with payload size exceeding the maximum size must fail"); -}, "Verify calling 'navigator.sendBeacon()' with a large payload returns 'false'."); - -test(function() { - var invalidUrl = "http://invalid:url"; - assert_throws_js(TypeError, function() { navigator.sendBeacon(invalidUrl, smallPayload); }, - `calling 'navigator.sendBeacon()' with an invalid URL '${invalidUrl}' must throw a TypeError`); -}, "Verify calling 'navigator.sendBeacon()' with an invalid URL throws an exception."); - -test(function() { - var invalidUrl = "nothttp://invalid.url"; - assert_throws_js(TypeError, function() { navigator.sendBeacon(invalidUrl, smallPayload); }, - `calling 'navigator.sendBeacon()' with a non-http(s) URL '${invalidUrl}' must throw a TypeError`); -}, "Verify calling 'navigator.sendBeacon()' with a URL that is not a http(s) scheme throws an exception."); - -// We'll validate that we can send one beacon that uses our entire Quota and then fail to send one that is just one char. -promise_test(async () => { - function wait(ms) { - return new Promise(res => step_timeout(res, ms)); - } - const url = '/fetch/api/resources/trickle.py?count=1&ms=0'; - assert_true(navigator.sendBeacon(url, maxPayload), - "calling 'navigator.sendBeacon()' with our max payload size should succeed."); - - // Now we'll send just one character. - assert_false(navigator.sendBeacon(url, '1'), - "calling 'navigator.sendBeacon()' with just one char should fail while our Quota is used up."); - - for (let i = 0; i < 20; ++i) { - await wait(100); - if (navigator.sendBeacon(url, maxPayload)) { - return; - } - } - assert_unreached('The quota should recover after fetching.'); -}, "Verify the behavior after the quota is exhausted."); - -done();
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-navigate.html b/third_party/blink/web_tests/external/wpt/beacon/beacon-navigate.html deleted file mode 100644 index 5df13905..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-navigate.html +++ /dev/null
@@ -1,19 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>W3C Beacon Outliving Navigation Test</title> - <meta name="timeout" content="long"> - <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> -</head> -<body> - <script src="/common/utils.js"></script> - <script src="beacon-common.sub.js"></script> - <script> - "use strict"; - - runSendInIframeAndNavigateTests("beacon"); - </script> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-navigate.https.window.js b/third_party/blink/web_tests/external/wpt/beacon/beacon-navigate.https.window.js new file mode 100644 index 0000000..8b42a47c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/beacon/beacon-navigate.https.window.js
@@ -0,0 +1,23 @@ +// META: timeout=long +// META: script=/common/utils.js +// META: script=/common/get-host-info.sub.js +// META: script=beacon-common.sub.js + +'use strict'; + +const {HTTP_REMOTE_ORIGIN} = get_host_info(); + +for (const type of [STRING, ARRAYBUFFER, FORM, BLOB]) { + parallelPromiseTest(async (t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); + + const payload = makePayload(SMALL, type); + const id = token(); + const url = `/beacon/resources/beacon.py?cmd=store&id=${id}`; + assert_true(iframe.contentWindow.navigator.sendBeacon(url, payload)); + + iframe.src = `${HTTP_REMOTE_ORIGIN}/common/blank.html`; + }, `The frame navigates away after calling sendBeacon[type = ${type}].`); +}
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-preflight-failure.sub.window.js b/third_party/blink/web_tests/external/wpt/beacon/beacon-preflight-failure.sub.window.js deleted file mode 100644 index c5a2d813..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-preflight-failure.sub.window.js +++ /dev/null
@@ -1,28 +0,0 @@ -// META: script=/common/utils.js -// META: script=/common/get-host-info.sub.js - -promise_test(async (test) => { - const origin = get_host_info().REMOTE_ORIGIN; - const id = token(); - const store = `${origin}/beacon/resources/beacon.py?cmd=store&id=${id}`; - const monitor = `/beacon/resources/beacon.py?cmd=stat&id=${id}`; - - assert_true(navigator.sendBeacon(store, new Blob([], {type: 'x/y'}))); - - let actual; - for (let i = 0; i < 30; ++i) { - await new Promise(resolve => test.step_timeout(resolve, 10)); - - const response = await fetch(monitor); - const obj = await response.json(); - if (obj.length > 0) { - actual = JSON.stringify(obj); - break; - } - } - - const expected = - JSON.stringify([{error: 'Preflight not expected.'}]); - - assert_equals(actual, expected); -});
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-readablestream.window.js b/third_party/blink/web_tests/external/wpt/beacon/beacon-readablestream.window.js deleted file mode 100644 index 46e30fc..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-readablestream.window.js +++ /dev/null
@@ -1,3 +0,0 @@ -test(() => { - assert_throws_js(TypeError, () => navigator.sendBeacon("...", new ReadableStream())); -}, "sendBeacon() with a stream does not work due to the keepalive flag being set");
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-redirect.https.window.js b/third_party/blink/web_tests/external/wpt/beacon/beacon-redirect.https.window.js new file mode 100644 index 0000000..16a2545 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/beacon/beacon-redirect.https.window.js
@@ -0,0 +1,35 @@ +// META: timeout=long +// META: script=/common/get-host-info.sub.js +// META: script=/common/utils.js +// META: script=beacon-common.sub.js + +'use strict'; + +const {ORIGIN} = get_host_info(); + +// Execute each sample test per redirect status code. +// Note that status codes 307 and 308 are the only codes that will maintain POST +// data through a redirect. +for (const status of [307, 308]) { + for (const type of [STRING, ARRAYBUFFER, FORM, BLOB]) { + parallelPromiseTest(async (t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); + + const payload = makePayload(SMALL, type); + const id = token(); + const destination = + `${ORIGIN}/beacon/resources/beacon.py?cmd=store&id=${id}`; + const url = `${ORIGIN}/common/redirect.py` + + `?status=${status}&location=${encodeURIComponent(destination)}`; + + assert_true(iframe.contentWindow.navigator.sendBeacon(url, payload)); + iframe.remove(); + + await waitForResult(id); + }, `cross-origin, CORS-safelisted: status = ${status}, type = ${type}`); + } +}; + +done();
diff --git a/third_party/blink/web_tests/external/wpt/beacon/beacon-redirect.sub.window.js b/third_party/blink/web_tests/external/wpt/beacon/beacon-redirect.sub.window.js deleted file mode 100644 index fd23a45f..0000000 --- a/third_party/blink/web_tests/external/wpt/beacon/beacon-redirect.sub.window.js +++ /dev/null
@@ -1,20 +0,0 @@ -// META: timeout=long -// META: script=/common/utils.js -// META: script=beacon-common.sub.js - -"use strict"; - -// Execute each sample test per redirect status code. -// Note that status codes 307 and 308 are the only codes that will maintain POST data -// through a redirect. -[307, 308].forEach(function(status) { - function buildUrl(id) { - const baseUrl = "http://{{host}}:{{ports[http][0]}}"; - const targetUrl = `${baseUrl}/beacon/resources/beacon.py?cmd=store&id=${id}`; - - return `/common/redirect.py?status=${status}&location=${encodeURIComponent(targetUrl)}`; - } - runTests(sampleTests, `-${status}`, buildUrl); -}); - -done();
diff --git a/third_party/blink/web_tests/external/wpt/beacon/resources/beacon.py b/third_party/blink/web_tests/external/wpt/beacon/resources/beacon.py index f5caaf4..d81bfb1a 100644 --- a/third_party/blink/web_tests/external/wpt/beacon/resources/beacon.py +++ b/third_party/blink/web_tests/external/wpt/beacon/resources/beacon.py
@@ -24,8 +24,13 @@ nature of the stash, results for a given test are only guaranteed to be returned once, though they may be returned multiple times. + An entry may contain following members. + - error: An error string. null if there is no error. + - type: The content-type header of the request "(missing)" if there + is no content-type header in the request. + Example response bodies: - - [{error: null}] + - [{error: null, type: "text/plain;charset=UTF8"}] - [{error: "some validation details"}] - [] @@ -53,8 +58,9 @@ # requests we may get. if request.method == u"POST": payload = b"" - if b"Content-Type" in request.headers and \ - b"form-data" in request.headers[b"Content-Type"]: + contentType = request.headers[b"Content-Type"] \ + if b"Content-Type" in request.headers else b"(missing)" + if b"form-data" in contentType: if b"payload" in request.POST: # The payload was sent as a FormData. payload = request.POST.first(b"payload") @@ -71,20 +77,26 @@ # Confirm the payload size sent matches with the number of # characters sent. - if payload_size != len(payload_parts[1]): + if payload_size != len(payload): error = u"expected %d characters but got %d" % ( - payload_size, len(payload_parts[1])) + payload_size, len(payload)) else: # Confirm the payload contains the correct characters. - for i in range(0, payload_size): - if payload_parts[1][i:i+1] != b"*": + for i in range(len(payload)): + if i <= len(payload_parts[0]): + continue + c = payload[i:i+1] + if c != b"*": error = u"expected '*' at index %d but got '%s''" % ( - i, isomorphic_decode(payload_parts[1][i:i+1])) + i, isomorphic_decode(c)) break # Store the result in the stash so that it can be retrieved # later with a 'stat' command. - request.server.stash.put(id, {u"error": error}) + request.server.stash.put(id, { + u"error": error, + u"type": isomorphic_decode(contentType) + }) elif request.method == u"OPTIONS": # If we expect a preflight, then add the cors headers we expect, # otherwise log an error as we shouldn't send a preflight for all
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-016.html b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-016.html new file mode 100644 index 0000000..141cae7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-016.html
@@ -0,0 +1,43 @@ +<!DOCTYPE html> +<title> + Nested fragmentation for out-of-flow positioned elements. +</title> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#abspos-breaking"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<style> + .multicol { + column-count: 2; + column-fill: auto; + column-gap: 0px; + } + #outer { + height: 100px; + width: 300px; + } + #inner { + width: 100px; + background-color: red; + position: relative; + left: -150px; + } + .rel { + position: relative; + height: 200px; + } + .abs { + position: absolute; + height: 200px; + width: 50px; + top: 0px; + background-color: green; + } +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="multicol" id="outer"> + <div class="multicol" id="inner"> + <div style="height: 200px;"></div> + <div class="rel"> + <div class="abs"></div> + </div> + </div> +</div> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-017.html b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-017.html new file mode 100644 index 0000000..aa56a7c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-017.html
@@ -0,0 +1,43 @@ +<!DOCTYPE html> +<title> + Out-of-flow static position in nested context. +</title> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#abspos-breaking"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<style> + .multicol { + column-count: 2; + column-fill: auto; + column-gap: 0px; + } + #outer { + height: 100px; + width: 300px; + } + #inner { + width: 100px; + background-color: red; + position: relative; + left: -150px; + } + .rel { + position: relative; + height: 360px; + } + .abs { + position: absolute; + height: 180px; + width: 50px; + background-color: green; + } +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div class="multicol" id="outer"> + <div class="multicol" id="inner"> + <div class="rel"> + <div style="height: 180px;"></div> + <div style="column-span: all; height: 20px; background-color: green;"></div> + <div class="abs"></div> + </div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-002-ref.html new file mode 100644 index 0000000..88fdfa7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-002-ref.html
@@ -0,0 +1,27 @@ +<!doctype html> +<meta charset="utf-8"> +<title>CSS Test Reference</title> +<style> +html,body { + color:black; background-color:white; font:16px/1 monospace; padding:0; margin:0; +} + +div { + display: grid; + background-color: lime; +} + +table { + min-height: 100px; +} +</style> +<div> + <table> + <caption>Table caption</caption> + <thead> + <tr> + <th>This table should shrink after setting a smaller min-height</th> + </tr> + </thead> + </table> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-002.html new file mode 100644 index 0000000..fdec4e6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-002.html
@@ -0,0 +1,46 @@ +<!doctype html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<meta charset="utf-8"> +<title>Table grid items with min-height should shrink after setting a smaller min-height</title> +<link rel="author" href="mailto:mats@mozilla.com"> +<link rel="author" href="mailto:emilio@crisal.io"> +<link rel="author" href="mailto:tlin@mozilla.com"> +<link rel="author" href="https://mozilla.org"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1527734"> +<link rel="match" href="table-grid-item-dynamic-002-ref.html"> +<style> +html,body { + color:black; background-color:white; font:16px/1 monospace; padding:0; margin:0; +} + +div { + display: grid; + background-color: lime; +} + +table { + min-height: 500px; +} +</style> + +<div> + <table> + <caption>Table caption</caption> + <thead> + <tr> + <th>This table should shrink after setting a smaller min-height</th> + </tr> + </thead> + </table> +</div> +<script> +onload = function() { + let grid = document.querySelector("div"); + let table = grid.querySelector("table"); + grid.getBoundingClientRect(); + table.style.minHeight = "100px"; +} +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-003-ref.html new file mode 100644 index 0000000..1de4cce --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-003-ref.html
@@ -0,0 +1,30 @@ +<!doctype html> +<meta charset="utf-8"> +<title>CSS Test Reference</title> +<style> +html,body { + color:black; background-color:white; font:16px/1 monospace; padding:0; margin:0; +} + +div { + display: grid; + height: 100px; + background-color: lime; +} + +table { + padding-top: 100px; + height: 100%; + box-sizing: content-box; + background-color: yellow; +} +</style> +<div> + <table> + <thead> + <tr> + <th>Relayout shouldn't grow this table</th> + </tr> + </thead> + </table> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-003.html new file mode 100644 index 0000000..32b809c5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-003.html
@@ -0,0 +1,50 @@ +<!doctype html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<meta charset="utf-8"> +<title>Table grid items with padding-top, percentage height, and box-sizing:content-box, don't grow on incremental relayout</title> +<link rel="author" href="mailto:mats@mozilla.com"> +<link rel="author" href="mailto:emilio@crisal.io"> +<link rel="author" href="mailto:tlin@mozilla.com"> +<link rel="author" href="https://mozilla.org"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1521088"> +<link rel="match" href="table-grid-item-dynamic-003-ref.html"> +<style> +html,body { + color:black; background-color:white; font:16px/1 monospace; padding:0; margin:0; +} + +div { + display: grid; + height: 100px; + background-color: lime; +} + +table { + padding-top: 100px; + height: 100%; + box-sizing: content-box; + background-color: yellow; +} +</style> + +<div> + <table> + <thead> + <tr> + <th>Relayout shouldn't grow this table</th> + </tr> + </thead> + </table> +</div> +<script> +onload = function() { + let grid = document.querySelector("div"); + grid.getBoundingClientRect(); + document.body.style.width = "50vw"; + grid.getBoundingClientRect(); + document.body.style.width = ""; +} +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-004-ref.html new file mode 100644 index 0000000..9189fb5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-004-ref.html
@@ -0,0 +1,31 @@ +<!doctype html> +<meta charset="utf-8"> +<title>CSS Test Reference</title> +<style> +html,body { + color:black; background-color:white; font:16px/1 monospace; padding:0; margin:0; +} + +div { + display: grid; + height: 100px; + background-color: lime; +} + +table { + padding-top: 100px; + width: 500px; + height: 100%; + box-sizing: content-box; + background-color: yellow; +} +</style> +<div> + <table> + <thead> + <tr> + <th>Relayout shouldn't grow this table</th> + </tr> + </thead> + </table> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-004.html new file mode 100644 index 0000000..537d85a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/table-grid-item-dynamic-004.html
@@ -0,0 +1,51 @@ +<!doctype html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<meta charset="utf-8"> +<title>Table grid items with padding-top, definite width, percentage height, and box-sizing:content-box, don't grow on incremental relayout</title> +<link rel="author" href="mailto:mats@mozilla.com"> +<link rel="author" href="mailto:emilio@crisal.io"> +<link rel="author" href="mailto:tlin@mozilla.com"> +<link rel="author" href="https://mozilla.org"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1521088"> +<link rel="match" href="table-grid-item-dynamic-004-ref.html"> +<style> +html,body { + color:black; background-color:white; font:16px/1 monospace; padding:0; margin:0; +} + +div { + display: grid; + height: 100px; + background-color: lime; +} + +table { + padding-top: 100px; + width: 500px; + height: 100%; + box-sizing: content-box; + background-color: yellow; +} +</style> + +<div> + <table> + <thead> + <tr> + <th>Relayout shouldn't grow this table</th> + </tr> + </thead> + </table> +</div> +<script> +onload = function() { + let grid = document.querySelector("div"); + grid.getBoundingClientRect(); + document.body.style.width = "50vw"; + grid.getBoundingClientRect(); + document.body.style.width = ""; +} +</script>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/crossiframe.html b/third_party/blink/web_tests/external/wpt/event-timing/crossiframe.html index 147e144..6beb9aa 100644 --- a/third_party/blink/web_tests/external/wpt/event-timing/crossiframe.html +++ b/third_party/blink/web_tests/external/wpt/event-timing/crossiframe.html
@@ -72,10 +72,13 @@ }); const childFrameEntriesPromise = new Promise(resolve => { window.addEventListener("message", (event) => { - t.step(() => { - validateChildFrameEntries(event.data); - }); - resolve(); + // testdriver-complete is a webdriver internal event + if (event.data.type != "testdriver-complete") { + t.step(() => { + validateChildFrameEntries(event.data); + }); + resolve(); + } }, false); }); let iframe = document.getElementById('iframe');
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/mouseenter.html b/third_party/blink/web_tests/external/wpt/event-timing/mouseenter.html index 804d574..1d0171e 100644 --- a/third_party/blink/web_tests/external/wpt/event-timing/mouseenter.html +++ b/third_party/blink/web_tests/external/wpt/event-timing/mouseenter.html
@@ -12,7 +12,8 @@ <div id='target'>Target</div> <script> promise_test(async t => { - return testEventType(t, 'mouseenter'); + // PointerMove also creates mouseenter events on the body + return testEventType(t, 'mouseenter', true); }) </script> </html>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/mouseleave.html b/third_party/blink/web_tests/external/wpt/event-timing/mouseleave.html index 202cf73..b3cf1447e 100644 --- a/third_party/blink/web_tests/external/wpt/event-timing/mouseleave.html +++ b/third_party/blink/web_tests/external/wpt/event-timing/mouseleave.html
@@ -12,7 +12,8 @@ <div id='target'>Target</div> <script> promise_test(async t => { - return testEventType(t, 'mouseleave'); + // Loose event because a mouseleave from html -> body also occurs + return testEventType(t, 'mouseleave', true); }) </script> </html>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/pointerenter.html b/third_party/blink/web_tests/external/wpt/event-timing/pointerenter.html index bae1c51..bb8ee08 100644 --- a/third_party/blink/web_tests/external/wpt/event-timing/pointerenter.html +++ b/third_party/blink/web_tests/external/wpt/event-timing/pointerenter.html
@@ -12,7 +12,9 @@ <div id='target'>Target</div> <script> promise_test(async t => { - return testEventType(t, 'pointerenter'); + // A looseCount because the first move of pointerenter causes a + // `pointerenter` on body + return testEventType(t, 'pointerenter', true); }) </script> </html>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/pointerleave.html b/third_party/blink/web_tests/external/wpt/event-timing/pointerleave.html index 81e8f15..b17464e 100644 --- a/third_party/blink/web_tests/external/wpt/event-timing/pointerleave.html +++ b/third_party/blink/web_tests/external/wpt/event-timing/pointerleave.html
@@ -12,7 +12,8 @@ <div id='target'>Target</div> <script> promise_test(async t => { - return testEventType(t, 'pointerleave'); + // Loose event because a pointerleave from html -> body also occurs + return testEventType(t, 'pointerleave', true); }) </script> </html>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js b/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js index 749cfe3..70fd66ab 100644 --- a/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js +++ b/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js
@@ -70,6 +70,13 @@ }); } +function waitForTick() { + return new Promise(resolve => { + window.requestAnimationFrame(() => { + window.requestAnimationFrame(resolve); + }); + }); +} // Add a PerformanceObserver and observe with a durationThreshold of |dur|. This test will // attempt to check that the duration is appropriately checked by: // * Asserting that entries received have a duration which is the smallest multiple of 8 @@ -150,11 +157,12 @@ // Reset by clicking outside of the target. .pointerMove(0, 0) .pointerDown() - .pointerUp(); } else if (eventType === 'mouseenter' || eventType === 'mouseover' || eventType === 'pointerenter' || eventType === 'pointerover') { // Move outside of the target and then back inside. - actions.pointerMove(0, 0) + // Moving it to 0, 1 because 0, 0 doesn't cause the pointer to + // move in Firefox. See https://github.com/w3c/webdriver/issues/1545 + actions.pointerMove(0, 1) .pointerMove(0, 0, {origin: target}); } else if (eventType === 'mouseleave' || eventType === 'mouseout' || eventType === 'pointerleave' || eventType === 'pointerout') { @@ -219,6 +227,7 @@ // Trigger two 'fast' events of the type. await applyAction(eventType, target); await applyAction(eventType, target); + await waitForTick(); await new Promise(t.step_func(resolve => { testCounts(t, resolve, looseCount, eventType, initialCount + 2); })); @@ -260,6 +269,9 @@ })).observe({type: 'event', durationThreshold: durationThreshold}); }); // Cause a slow event. - let actionPromise = applyAction(eventType, target); - return Promise.all([actionPromise, observerPromise]); + await applyAction(eventType, target); + + await waitForTick(); + + await observerPromise; }
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/shadow-dom-null-target.html b/third_party/blink/web_tests/external/wpt/event-timing/shadow-dom-null-target.html new file mode 100644 index 0000000..89587312 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/event-timing/shadow-dom-null-target.html
@@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html> +<meta charset=utf-8 /> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script src=/resources/testdriver-actions.js></script> +<script src=resources/event-timing-test-utils.js></script> +<body> +<div id='host'> +</div> +<script> +promise_test(async t => { + assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.'); + + const host = document.getElementById('host'); + const shadowRoot = host.attachShadow({mode: "closed"}); + + const durationThreshold = 16; + + const innerSpan1 = document.createElement("span"); + innerSpan1.textContent = "Span1"; + const innerSpan2 = document.createElement("span"); + innerSpan2.textContent = "Span2"; + + shadowRoot.append(innerSpan1); + shadowRoot.append(innerSpan2); + + innerSpan2.addEventListener("mouseover", function(e) { + // To make this is a slow event + mainThreadBusy(durationThreshold + 4); + }); + + const span1Rect = innerSpan1.getBoundingClientRect(); + const span2Rect = innerSpan2.getBoundingClientRect(); + + const actions = new test_driver.Actions(); + // Move the pointer to innerSpan1 + await actions.pointerMove( + Math.ceil(span1Rect.x + span1Rect.width / 2), + Math.ceil(span1Rect.y + span1Rect.height / 2) + ).send(); + + await waitForTick(); + + const observerPromise = new Promise(resolve => { + new PerformanceObserver(t.step_func(entryList => { + let mouseOverEntries = entryList.getEntriesByName("mouseover"); + assert_equals(mouseOverEntries.length, 1); + assert_equals(mouseOverEntries[0].target, null); + resolve(); + })).observe({type: 'event', durationThreshold: durationThreshold}); + }); + + // Move the pointer to innerSpan2 + // Here we move the pointer within the shadow DOM + await actions.pointerMove( + Math.ceil(span2Rect.x + span2Rect.width / 2), + Math.ceil(span2Rect.y + span2Rect.height / 2) + ).send(); + + await waitForTick(); + + await observerPromise; +}, "Event Timing: Move pointer within shadow DOM should create event-timing entry with null target."); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/basic/keepalive.html b/third_party/blink/web_tests/external/wpt/fetch/api/basic/keepalive.html index a6405dce..36d156b 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/api/basic/keepalive.html +++ b/third_party/blink/web_tests/external/wpt/fetch/api/basic/keepalive.html
@@ -42,7 +42,7 @@ // an async_test. function checkToken(testName, token) { async_test((test) => { - new Promise((resolve) => test.step_timeout(resolve, 1000)).then(() => { + new Promise((resolve) => test.step_timeout(resolve, 3000)).then(() => { return queryToken(token); }).then((result) => { assert_equals(result, 'on');
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html index 15d671153..cd5fc41 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html
@@ -14,4 +14,11 @@ assert_equals(navigator.plugins.length, 0, "Plugins array must be empty, even after refresh()"); assert_equals(navigator.mimeTypes.length, 0, "mimeTypes array must be empty, even after refresh()"); }, "Tests that navigator.plugins and mimeTypes both return empty arrays."); + +test(() => { + const arrayIterator = Array.prototype[Symbol.iterator]; + assert_equals(navigator.plugins[Symbol.iterator], arrayIterator, "plugins array must provide @@iterator"); + assert_equals(navigator.mimeTypes[Symbol.iterator], arrayIterator, "mimeTypes array must provide @@iterator"); + assert_equals(Plugin.prototype[Symbol.iterator], arrayIterator, "Plugin must provide @@iterator"); +}, "@@iterator must exist"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/uievents/keyboard/modifier-keys.html b/third_party/blink/web_tests/external/wpt/uievents/keyboard/modifier-keys.html new file mode 100644 index 0000000..635e5d3b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/uievents/keyboard/modifier-keys.html
@@ -0,0 +1,35 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>UI Events Test: Modifier keys</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="help" href="https://w3c.github.io/uievents/#idl-keyboardevent" /> +<meta name="assert" content="This test checks that modifier keys are properly detected in 'keydown' event."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<div id="target" tabindex="0">Target</div> +<script> + const keys = { + "Shift": '\uE008', + "Control": '\uE009', + "Alt": '\uE00A', + "Meta": '\uE03D', + }; + + target.focus(); + for (const [key, code] of Object.entries(keys)) { + promise_test(() => { + return new Promise(resolve => { + target.addEventListener("keydown", resolve); + test_driver.send_keys(target, code); + }).then((event) => { + assert_equals(event.key, key); + assert_equals(event.shiftKey, key === "Shift"); + assert_equals(event.ctrlKey, key === "Control"); + assert_equals(event.altKey, key === "Alt"); + assert_equals(event.metaKey, key === "Meta"); + }); + }, `Check sending ${key} key`); + } +</script>
diff --git a/third_party/blink/web_tests/fast/forms/focus-rect/radio-focus-ring-expected.png b/third_party/blink/web_tests/fast/forms/focus-rect/radio-focus-ring-expected.png deleted file mode 100644 index b448a74..0000000 --- a/third_party/blink/web_tests/fast/forms/focus-rect/radio-focus-ring-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/suggested-value-after-empty-suggested-value-expected.txt b/third_party/blink/web_tests/fast/forms/suggested-value-after-empty-suggested-value-expected.txt index cceeb95..7a458ed4 100644 --- a/third_party/blink/web_tests/fast/forms/suggested-value-after-empty-suggested-value-expected.txt +++ b/third_party/blink/web_tests/fast/forms/suggested-value-after-empty-suggested-value-expected.txt
@@ -90,7 +90,7 @@ | <div> | id="placeholder" | pseudo="-internal-input-suggested" -| style="display: block !important;" +| style="display: block !important; user-select: none !important;" | shadow:pseudoId="-internal-input-suggested" | "suggested value" | <div> @@ -107,7 +107,7 @@ | <div> | id="placeholder" | pseudo="-internal-input-suggested" -| style="display: block !important;" +| style="display: block !important; user-select: none !important;" | shadow:pseudoId="-internal-input-suggested" | "suggested value" | <div> @@ -122,7 +122,7 @@ | <div> | id="placeholder" | pseudo="-internal-input-suggested" -| style="display: block !important;" +| style="display: block !important; user-select: none !important;" | shadow:pseudoId="-internal-input-suggested" | "suggested value" | <div> @@ -138,7 +138,7 @@ | <div> | id="placeholder" | pseudo="-internal-input-suggested" -| style="display: block !important;" +| style="display: block !important; user-select: none !important;" | shadow:pseudoId="-internal-input-suggested" | "suggested value" | <div>
diff --git a/third_party/blink/web_tests/fast/forms/suggested-value-after-setvalue-expected.txt b/third_party/blink/web_tests/fast/forms/suggested-value-after-setvalue-expected.txt index 8c023727..6a06cdc 100644 --- a/third_party/blink/web_tests/fast/forms/suggested-value-after-setvalue-expected.txt +++ b/third_party/blink/web_tests/fast/forms/suggested-value-after-setvalue-expected.txt
@@ -10,7 +10,7 @@ | <div> | id="placeholder" | pseudo="-internal-input-suggested" -| style="display: block !important;" +| style="display: block !important; user-select: none !important;" | shadow:pseudoId="-internal-input-suggested" | "suggested value" | <div>
diff --git a/third_party/blink/web_tests/fast/forms/suggested-value-expected.txt b/third_party/blink/web_tests/fast/forms/suggested-value-expected.txt index e26dd4b..5f795c28 100644 --- a/third_party/blink/web_tests/fast/forms/suggested-value-expected.txt +++ b/third_party/blink/web_tests/fast/forms/suggested-value-expected.txt
@@ -10,7 +10,7 @@ | <div> | id="placeholder" | pseudo="-internal-input-suggested" -| style="display: block !important;" +| style="display: block !important; user-select: none !important;" | shadow:pseudoId="-internal-input-suggested" | "suggested value" | <div> @@ -65,7 +65,7 @@ | <div> | id="placeholder" | pseudo="-internal-input-suggested" -| style="display: block !important;" +| style="display: block !important; user-select: none !important;" | shadow:pseudoId="-internal-input-suggested" | "suggested value" | <div>
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png new file mode 100644 index 0000000..e4d4e771 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png new file mode 100644 index 0000000..48215a2 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-allowance-limit.html b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-allowance-limit.html deleted file mode 100644 index 095c322c..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-allowance-limit.html +++ /dev/null
@@ -1,17 +0,0 @@ -<!DOCTYPE HTML> -<script src="/js-test-resources/testharness.js"></script> -<script src="/js-test-resources/testharnessreport.js"></script> -<script> -test(() => { - // Note: the limit used must be same as Settings#maxBeaconTransmission. - // First beacon request should go through, but with a zero allowance for - // any subsequent requests. Which must fail. - let payload = new Uint8Array(64 * 1024); - let result = navigator.sendBeacon("resources/blank.txt", payload); - assert_true(result); - result = navigator.sendBeacon("resources/blank.txt", payload); - assert_false(result); -}, "navigator.sendBeacon() with a payload size greater than " + - "remaining transfer allowance should fail."); -</script> -</html>
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-blob-with-non-simple-type.html b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-blob-with-non-simple-type.html deleted file mode 100644 index c80801c..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-blob-with-non-simple-type.html +++ /dev/null
@@ -1,9 +0,0 @@ -<!DOCTYPE HTML> -<script src="/js-test-resources/testharness.js"></script> -<script src="/js-test-resources/testharnessreport.js"></script> -<script> -test(() => { - assert_true(navigator.sendBeacon("/", new Blob(["X"], {type: "image/png"}))); -}, "navigator.sendBeacon() to a cross-origin target with a Blob body with " + - "non-simple type should not throw."); -</script>
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cookie-expected.txt b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cookie-expected.txt deleted file mode 100644 index 7e4f674..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cookie-expected.txt +++ /dev/null
@@ -1,20 +0,0 @@ -CONSOLE WARNING: line 18: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/. -PingLoader dispatched to 'http://127.0.0.1:8000/sendbeacon/resources/save-beacon.php?name=cookie'. -Checking transmission of Beacons involving cookies. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS navigator.sendBeacon("resources/save-beacon.php?name=cookie", "Blip"); is true -PASS Beacon sent successfully -PASS Content-Type: text/plain;charset=UTF-8 -PASS Cookie: hello=world -PASS Origin: http://127.0.0.1:8000 -PASS Referer: http://127.0.0.1:8000/sendbeacon/beacon-cookie.html -PASS Request-Method: POST -PASS Length: 4 -PASS Body: Blip -PASS -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cookie.html b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cookie.html deleted file mode 100644 index 73e0369..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cookie.html +++ /dev/null
@@ -1,50 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> -<script src="/js-test-resources/js-test.js"></script> -<script> -description("Checking transmission of Beacons involving cookies."); - -window.jsTestIsAsync = true; - -function test() { - if (window.testRunner) { - testRunner.dumpAsText(); - testRunner.waitUntilDone(); - testRunner.dumpPingLoaderCallbacks(); - } - try { - var xhr = new XMLHttpRequest(); - xhr.open("GET", "../cookies/resources/setCookies.cgi", false); - xhr.setRequestHeader("SET-COOKIE", "hello=world;path=/"); - xhr.send(null); - if (xhr.status != 200) { - testFailed("cookie not set"); - finishJSTest(); - } - } catch (e) { - testFailed("cookie not set"); - finishJSTest(); - } - - shouldBeTrue('navigator.sendBeacon("resources/save-beacon.php?name=cookie", "Blip");'); - var xhr = new XMLHttpRequest(); - xhr.open("GET", "resources/check-beacon.php?name=cookie"); - xhr.onload = function () { - var lines = xhr.responseText.split("\n"); - for (var i in lines) - testPassed(lines[i]); - finishJSTest(); - }; - xhr.onerror = function () { - testFailed("Unable to fetch beacon status"); - finishJSTest(); - }; - - xhr.send(); -} -</script> -</head> -<body onload="test();"> -</body> -</html>
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-expected.txt b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-expected.txt deleted file mode 100644 index e639cba..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-expected.txt +++ /dev/null
@@ -1,18 +0,0 @@ -PingLoader dispatched to 'http://localhost:8000/sendbeacon/resources/save-beacon.php?name=cross-origin'. -Testing navigator.sendBeacon() cross-origin. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS navigator.sendBeacon("http://localhost:8000/sendbeacon/resources/save-beacon.php?name=cross-origin", "CrossOrigin"); is true -PASS Beacon sent successfully -PASS Content-Type: text/plain;charset=UTF-8 -PASS Origin: http://127.0.0.1:8000 -PASS Referer: http://127.0.0.1:8000/ -PASS Request-Method: POST -PASS Length: 11 -PASS Body: CrossOrigin -PASS -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect-blob-expected.txt b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect-blob-expected.txt deleted file mode 100644 index 4e8d4b7..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect-blob-expected.txt +++ /dev/null
@@ -1,10 +0,0 @@ -PingLoader dispatched to 'http://127.0.0.1:8080/resources/redirection-response.php?status=302&simple=true&target=/non-existent.php'. -Verifying navigator.sendBeacon(Blob) non-CORS cross-origin redirect handling. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS navigator.sendBeacon("http://127.0.0.1:8080/resources/redirection-response.php?status=302&simple=true&target=/non-existent.php", blob); is true -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect-blob.html b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect-blob.html deleted file mode 100644 index adb4cf6..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect-blob.html +++ /dev/null
@@ -1,13 +0,0 @@ -<!DOCTYPE HTML> -<script src="/js-test-resources/js-test.js"></script> -<script> -description("Verifying navigator.sendBeacon(Blob) non-CORS cross-origin redirect handling."); - -if (window.testRunner) { - testRunner.dumpPingLoaderCallbacks(); -} - -const blob = new Blob(["Cross", "Origin"], {type: "text/plain;from-beacon=true"}); -// The "simple" parameter is just for differentiating the URLs. -shouldBeTrue('navigator.sendBeacon("http://127.0.0.1:8080/resources/redirection-response.php?status=302&simple=true&target=/non-existent.php", blob);'); -</script>
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect-credentials.html b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect-credentials.html deleted file mode 100644 index 8f4e45c..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect-credentials.html +++ /dev/null
@@ -1,123 +0,0 @@ -<!DOCTYPE HTML> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/get-host-info.js?pipe=sub"></script> -<script> -if (window.testRunner) - testRunner.setBlockThirdPartyCookies(false); - -const host_info = get_host_info(); - -document.cookie = "TestCookie=same"; - -const set_cookie_promise = fetch( - host_info['HTTPS_REMOTE_ORIGIN'] + '/security/resources/set-cookie.php?name=TestCookie&value=cross&SameSiteNone', - {mode: 'no-cors', credentials: 'include'}); - -let count = 0; - -const test_name_prefix = 'cross-origin-redirect-credentials'; - -function parse_check_beacon_response(body) { - const lines = body.split('\n'); - - const headers = {}; - - for (let line of lines) { - const elements = line.split(': ', 2); - const name = elements[0].toLowerCase(); - const value = elements[1]; - if (name in headers) { - headers[name].push(value); - } else { - headers[name] = [value]; - } - } - - return headers; -} - -function run_test(url, status_code, expectations) { - const test_name = test_name_prefix + count; - ++count; - - return set_cookie_promise.then(() => { - const destination_params = new URLSearchParams(); - destination_params.append('name', test_name); - destination_params.append('dontclearcookies', undefined); - - const params = new URLSearchParams(); - params.append('url', url + '?' + destination_params.toString()); - params.append('code', status_code); - - navigator.sendBeacon('/resources/redirect.php?' + params.toString(), 'foobar'); - }).then(() => { - return new Promise(resolve => { - setTimeout(resolve, 10); - }); - }).then(() => { - return fetch('resources/check-beacon.php?name=' + test_name); - }).then(response => { - assert_equals(response.status, 200, 'check-beacon must be successful'); - - return response.text(); - }).then(responseText => { - const headers = parse_check_beacon_response(responseText); - - for (let name of Object.keys(expectations)) { - const expected_value = expectations[name]; - if (expected_value === undefined) { - assert_false(name in headers, 'No ' + name + ' header expected'); - } else { - assert_true(name in headers, name + ' header expected'); - const actual_values = headers[name]; - assert_equals(actual_values.length, 1, 'Just one ' + name + ' header expected'); - assert_equals(actual_values[0], - expected_value, 'Value of ' + name + ' header should be "' + expected_value + '"'); - } - } - }); -} - -promise_test(() => { - return run_test( - host_info['HTTPS_REMOTE_ORIGIN'] + '/sendbeacon/resources/save-beacon.php', - 301, - { - cookie: 'TestCookie=cross', - 'request-method': 'GET' - }); -}, 'Status code 301'); - -promise_test(() => { - return run_test( - host_info['HTTPS_REMOTE_ORIGIN'] + '/sendbeacon/resources/save-beacon.php', - 302, - { - cookie: 'TestCookie=cross', - 'request-method': 'GET' - }); -}, 'Status code 302'); - -promise_test(() => { - return run_test( - host_info['HTTPS_REMOTE_ORIGIN'] + '/sendbeacon/resources/save-beacon.php', - 303, - { - cookie: 'TestCookie=cross', - 'request-method': 'GET' - }); -}, 'Status code 303'); - -promise_test(() => { - return run_test( - host_info['HTTPS_REMOTE_ORIGIN'] + '/sendbeacon/resources/save-beacon.php', - 307, - { - cookie: 'TestCookie=cross', - 'request-method': 'POST' - }); -}, 'Status code 307'); - -// TODO(tyoshino): Add a test for 308. -</script>
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect-expected.txt b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect-expected.txt deleted file mode 100644 index fcc9ceae..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect-expected.txt +++ /dev/null
@@ -1,10 +0,0 @@ -PingLoader dispatched to 'http://127.0.0.1:8080/resources/redirection-response.php?status=302&target=/non-existent.php'. -Verifying that navigator.sendBeacon() to non-CORS cross-origin redirect fails. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS navigator.sendBeacon("http://127.0.0.1:8080/resources/redirection-response.php?status=302&target=/non-existent.php", "CrossOrigin"); is true -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect.html b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect.html deleted file mode 100644 index 0495ad7..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin-redirect.html +++ /dev/null
@@ -1,24 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> -<script src="/js-test-resources/js-test.js"></script> -<script> -description("Verifying that navigator.sendBeacon() to non-CORS cross-origin redirect fails."); - -window.jsTestIsAsync = true; - -function test() { - if (window.testRunner) { - testRunner.dumpAsText(); - testRunner.dumpPingLoaderCallbacks(); - } - - shouldBeTrue('navigator.sendBeacon("http://127.0.0.1:8080/resources/redirection-response.php?status=302&target=/non-existent.php", "CrossOrigin");'); - // Wait a while for the redirect response handling to happen before finishing up. - setTimeout(finishJSTest, 200); -} -</script> -</head> -<body onload="test();"> -</body> -</html>
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin.html b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin.html deleted file mode 100644 index cbaad167..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-cross-origin.html +++ /dev/null
@@ -1,36 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> -<script src="/js-test-resources/js-test.js"></script> -<script> -description("Testing navigator.sendBeacon() cross-origin."); - -window.jsTestIsAsync = true; - -function test() { - if (window.testRunner) { - testRunner.dumpAsText(); - testRunner.waitUntilDone(); - testRunner.dumpPingLoaderCallbacks(); - } - - shouldBeTrue('navigator.sendBeacon("http://localhost:8000/sendbeacon/resources/save-beacon.php?name=cross-origin", "CrossOrigin");'); - var xhr = new XMLHttpRequest(); - xhr.open("GET", "resources/check-beacon.php?name=cross-origin"); - xhr.onload = function () { - var lines = xhr.responseText.split("\n"); - for (var i in lines) - testPassed(lines[i]); - finishJSTest(); - }; - xhr.onerror = function () { - testFailed("Unable to fetch beacon status"); - finishJSTest(); - }; - xhr.send(); -} -</script> -</head> -<body onload="test();"> -</body> -</html>
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-same-origin-expected.txt b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-same-origin-expected.txt deleted file mode 100644 index 67b552b7..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-same-origin-expected.txt +++ /dev/null
@@ -1,51 +0,0 @@ -PingLoader dispatched to 'http://127.0.0.1:8000/sendbeacon/resources/save-beacon.php?name=same-origin'. -PingLoader dispatched to 'http://127.0.0.1:8000/sendbeacon/resources/save-beacon.php?name=same-origin'. -PingLoader dispatched to 'http://127.0.0.1:8000/sendbeacon/resources/save-beacon.php?name=same-origin'. -PingLoader dispatched to 'http://127.0.0.1:8000/sendbeacon/resources/save-beacon.php?name=same-origin'. -Testing navigator.sendBeacon() within same origin. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -Sending beacon with type: [object String] -PASS navigator.sendBeacon("resources/save-beacon.php?name=same-origin", payload); is true -PASS Beacon sent successfully -PASS Content-Type: text/plain;charset=UTF-8 -PASS Origin: http://127.0.0.1:8000 -PASS Referer: http://127.0.0.1:8000/sendbeacon/beacon-same-origin.html -PASS Request-Method: POST -PASS Length: 10 -PASS Body: SameOrigin -PASS -Sending beacon with type: [object Uint32Array] -PASS navigator.sendBeacon("resources/save-beacon.php?name=same-origin", payload); is true -PASS Beacon sent successfully -PASS Origin: http://127.0.0.1:8000 -PASS Referer: http://127.0.0.1:8000/sendbeacon/beacon-same-origin.html -PASS Request-Method: POST -PASS Length: 40 -PASS Body: @\0\0\0A\0\0\0B\0\0\0C\0\0\0D\0\0\0E\0\0\0F\0\0\0G\0\0\0H\0\0\0I -PASS -Sending beacon with type: [object Blob] -PASS navigator.sendBeacon("resources/save-beacon.php?name=same-origin", payload); is true -PASS Beacon sent successfully -PASS Content-Type: text/plain;from-beacon=true -PASS Origin: http://127.0.0.1:8000 -PASS Referer: http://127.0.0.1:8000/sendbeacon/beacon-same-origin.html -PASS Request-Method: POST -PASS Length: 11 -PASS Body: hello world -PASS -Sending beacon with type: [object FormData] -PASS navigator.sendBeacon("resources/save-beacon.php?name=same-origin", payload); is true -PASS Beacon sent successfully -PASS Content-Type: multipart/form-data; -PASS Origin: http://127.0.0.1:8000 -PASS Referer: http://127.0.0.1:8000/sendbeacon/beacon-same-origin.html -PASS Request-Method: POST -PASS Length: 9 -PASS Body: key=value -PASS -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-same-origin.html b/third_party/blink/web_tests/http/tests/sendbeacon/beacon-same-origin.html deleted file mode 100644 index e9608e41..0000000 --- a/third_party/blink/web_tests/http/tests/sendbeacon/beacon-same-origin.html +++ /dev/null
@@ -1,61 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> -<script src="/js-test-resources/js-test.js"></script> -<script> -description("Testing navigator.sendBeacon() within same origin."); - -window.jsTestIsAsync = true; - -var binary_array = new Uint32Array(10); -for (var i = 0; i < binary_array.length; i++) { - binary_array[i] = 64 + i; -} - -var blob = new Blob(["hello", " ", "world"], {type: "text/plain;from-beacon=true"}); -var form = new FormData(); -form.append("key", "value"); - -var tests = [ - "SameOrigin", - binary_array, - blob, - form]; - -var payload; -function testOne() { - payload = tests.shift(); - if (!payload) { - finishJSTest(); - return; - } - debug("Sending beacon with type: " + Object.prototype.toString.call(payload)); - shouldBeTrue('navigator.sendBeacon("resources/save-beacon.php?name=same-origin", payload);'); - var xhr = new XMLHttpRequest(); - xhr.open("GET", "resources/check-beacon.php?name=same-origin"); - xhr.onload = function () { - var lines = xhr.responseText.split("\n"); - for (var i in lines) - testPassed(lines[i]); - testOne(); - }; - xhr.onerror = function () { - testFailed("Unable to fetch beacon status"); - testOne(); - }; - xhr.send(); -} - -function test() { - if (window.testRunner) { - testRunner.dumpAsText(); - testRunner.waitUntilDone(); - testRunner.dumpPingLoaderCallbacks(); - } - testOne(); -} -</script> -</head> -<body onload="test();"> -</body> -</html>
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png deleted file mode 100644 index 741efe3..0000000 --- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png deleted file mode 100644 index d98406a4..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png deleted file mode 100644 index 3abaae8d4..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png index 957e48e..3d73313 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png index a3c8462..67e0314 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/checkbox/checkbox-appearance-basic-expected.png new file mode 100644 index 0000000..e277d51 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/checkbox/checkbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png new file mode 100644 index 0000000..11769f8e --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png similarity index 100% rename from third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png rename to third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/focus-rect/checkbox-zoom-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/focus-rect/checkbox-zoom-focus-ring-expected.png new file mode 100644 index 0000000..486bfcb --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/focus-rect/checkbox-zoom-focus-ring-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/focus-rect/radio-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/focus-rect/radio-focus-ring-expected.png new file mode 100644 index 0000000..0945d084 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/focus-rect/radio-focus-ring-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/radio/radio-appearance-basic-expected.png new file mode 100644 index 0000000..dd00eaae --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/fast/forms/radio/radio-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png similarity index 100% rename from third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png rename to third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png similarity index 100% rename from third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png rename to third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png deleted file mode 100644 index e8b5811..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png deleted file mode 100644 index 7730ca7..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png deleted file mode 100644 index bc051d7..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png deleted file mode 100644 index e8b5811..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png deleted file mode 100644 index 7730ca7..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png deleted file mode 100644 index bc051d7..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/checkbox/checkbox-appearance-basic-expected.png index e277d51..75953796 100644 --- a/third_party/blink/web_tests/platform/mac/fast/forms/checkbox/checkbox-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/forms/checkbox/checkbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png index 11769f8e..ae2bdfcd 100644 --- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png index e8b5811..840708c 100644 --- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/select/select-inpage-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/select/select-inpage-appearance-basic-expected.png index 73a5cfe..15aace7 100644 --- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/select/select-inpage-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/select/select-inpage-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/checkbox-zoom-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/checkbox-zoom-focus-ring-expected.png index 486bfcb..e520e8f 100644 --- a/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/checkbox-zoom-focus-ring-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/checkbox-zoom-focus-ring-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/radio-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/radio-focus-ring-expected.png index 0945d084..844a745 100644 --- a/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/radio-focus-ring-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/radio-focus-ring-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/radio/radio-appearance-basic-expected.png index dd00eaae..3e5cdd0 100644 --- a/third_party/blink/web_tests/platform/mac/fast/forms/radio/radio-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/forms/radio/radio-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png index 7730ca7..c697283 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png index bc051d7..4ba8d68 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png index 156474d..398c995 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png index e794fb04..9e0d2fb 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/checkbox/checkbox-appearance-basic-expected.png index 5daab0a..d85f82bb 100644 --- a/third_party/blink/web_tests/platform/win/fast/forms/checkbox/checkbox-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/forms/checkbox/checkbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png index 6076ce21..7178dd0 100644 --- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png index 741efe3..b1e8791 100644 --- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/focus-rect/checkbox-zoom-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/focus-rect/checkbox-zoom-focus-ring-expected.png index f681132a..caaaef412 100644 --- a/third_party/blink/web_tests/platform/win/fast/forms/focus-rect/checkbox-zoom-focus-ring-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/forms/focus-rect/checkbox-zoom-focus-ring-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/focus-rect/radio-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/focus-rect/radio-focus-ring-expected.png new file mode 100644 index 0000000..5cff25b --- /dev/null +++ b/third_party/blink/web_tests/platform/win/fast/forms/focus-rect/radio-focus-ring-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/radio/radio-appearance-basic-expected.png index dda9941..b3e546cd 100644 --- a/third_party/blink/web_tests/platform/win/fast/forms/radio/radio-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/forms/radio/radio-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png index d98406a4..3c877d9bc 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png index 3abaae8d4..cd04761a 100644 --- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png index b71a859..83638d0 100644 --- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png index 0c51c82..098b110 100644 --- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png index 6996f884..5650af4 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png index 802c8ab7..4e4b318 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png deleted file mode 100644 index 741efe3..0000000 --- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png deleted file mode 100644 index d98406a4..0000000 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/checkbox/checkbox-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png deleted file mode 100644 index 3abaae8d4..0000000 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/radio/radio-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-overflow/scrollbar-gutter-content-overflowing-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-overflow/scrollbar-gutter-content-overflowing-ref.html new file mode 100644 index 0000000..6f828ad --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/css/css-overflow/scrollbar-gutter-content-overflowing-ref.html
@@ -0,0 +1,71 @@ +<!DOCTYPE html> +<title>Test that scrollbar-gutter does not clip overflowing content</title> +<link rel="author" title="Felipe Erias Morandeira" href="mailto:felipeerias@gmail.com"/> +<link rel="help" href="https://www.w3.org/TR/css-overflow-4/#scollbar-gutter-property"/> +<link rel="match" href="scrollbar-gutter-content-overflowing-ref.html"> +<style> + body { + margin: 0; + padding: 0; + } + .row { + display: flex; + flex-flow: row wrap; + } + .container { + overflow-x: hidden; + overflow-y: auto; + height: 185px; + width: 185px; + margin: 6px; + border: 1px solid black; + background-color: #00AA00; + } + .container.ltr { + direction: ltr; + } + .container.rtl { + direction: rtl; + } + .container.vertical { + writing-mode: vertical-rl; + overflow-x: auto; + overflow-y: hidden; + } + .overflowing { + background-color: #FF0000; + width: 500px; + height: 50px; + margin-left: -100px; + } + .vertical > .overflowing { + width: 50px; + height: 500px; + margin-top: -100px; + } + .tall { + background: transparent; + width: 100%; + height: 500px; + } + .vertical > .tall { + width: 500px; + height: 100%; + } +</style> +<body> + <div class="row"> + <div class="container ltr"> + <div class="overflowing"></div> + <div class="tall"></div> + </div> + <div class="container rtl"> + <div class="overflowing"></div> + <div class="tall"></div> + </div> + <div class="container vertical"> + <div class="overflowing"></div> + <div class="tall"></div> + </div> + </div> +</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-overflow/scrollbar-gutter-content-overflowing.html b/third_party/blink/web_tests/wpt_internal/css/css-overflow/scrollbar-gutter-content-overflowing.html new file mode 100644 index 0000000..c640912 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/css/css-overflow/scrollbar-gutter-content-overflowing.html
@@ -0,0 +1,72 @@ +<!DOCTYPE html> +<title>Test that scrollbar-gutter does not clip overflowing content</title> +<link rel="author" title="Felipe Erias Morandeira" href="mailto:felipeerias@gmail.com"/> +<link rel="help" href="https://www.w3.org/TR/css-overflow-4/#scollbar-gutter-property"/> +<link rel="match" href="scrollbar-gutter-content-overflowing-ref.html"> +<style> + body { + margin: 0; + padding: 0; + } + .row { + display: flex; + flex-flow: row wrap; + } + .container { + scrollbar-gutter: always both; + overflow-x: hidden; + overflow-y: auto; + height: 185px; + width: 185px; + margin: 6px; + border: 1px solid black; + background-color: #00AA00; + } + .container.ltr { + direction: ltr; + } + .container.rtl { + direction: rtl; + } + .container.vertical { + writing-mode: vertical-rl; + overflow-x: auto; + overflow-y: hidden; + } + .overflowing { + background-color: #FF0000; + width: 500px; + height: 50px; + margin-left: -100px; + } + .vertical > .overflowing { + width: 50px; + height: 500px; + margin-top: -100px; + } + .tall { + background: transparent; + width: 100%; + height: 500px; + } + .vertical > .tall { + width: 500px; + height: 100%; + } +</style> +<body> + <div class="row"> + <div class="container ltr"> + <div class="overflowing"></div> + <div class="tall"></div> + </div> + <div class="container rtl"> + <div class="overflowing"></div> + <div class="tall"></div> + </div> + <div class="container vertical"> + <div class="overflowing"></div> + <div class="tall"></div> + </div> + </div> +</body>
diff --git a/third_party/gvr-android-sdk/BUILD.gn b/third_party/gvr-android-sdk/BUILD.gn index 8c6972c..7b07a46a 100644 --- a/third_party/gvr-android-sdk/BUILD.gn +++ b/third_party/gvr-android-sdk/BUILD.gn
@@ -55,7 +55,7 @@ if (enable_chrome_android_internal && !is_official_build) { deps = [ "//clank/third_party/gvr_shim" ] } else { - if (is_component_build) { + if (libcxx_is_shared) { cxx_abi_version = "Cr" } else { cxx_abi_version = "1" @@ -63,7 +63,7 @@ library = "//third_party/gvr-android-sdk/libgvr_shim_static_${current_cpu}_${cxx_abi_version}.a" libs += [ library ] - if (is_component_build) { + if (libcxx_is_shared) { ldflags = [ "-Wl,--whole-archive", rebase_path(library, root_build_dir),
diff --git a/third_party/libzip/BUILD.gn b/third_party/libzip/BUILD.gn index 26328fa..896c51c 100644 --- a/third_party/libzip/BUILD.gn +++ b/third_party/libzip/BUILD.gn
@@ -17,6 +17,10 @@ "src/zip_err_str.c", "src/zipconf.h", ] + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + public_configs = [ ":libzip_config" ] } static_library("libzip") {
diff --git a/third_party/libzip/README.chromium b/third_party/libzip/README.chromium index d6742d77..26eb699 100644 --- a/third_party/libzip/README.chromium +++ b/third_party/libzip/README.chromium
@@ -18,7 +18,7 @@ - Add static file config.h that is generated normally by the build system (patches/0001-add-built-config.h.patch) - Add static file zipconfig.h that is generated normally by the build system (patches/0001-add-built-zip_err_str.c.patch) - Add static file zip_err_str.c that is generated normally by the build system (patches/0001-add-built-zipconf.h.patch) -- Modify config.h and zipconfig.h to handle Windows build (patches/0001-patch-configs-for-windows.patch) +- Modify config.h and zipconfig.h to handle multi-platform build (patches/0001-patch-configs.patch) Update Process: 1) Clone the libzip github repo at the desired commit into src/
diff --git a/third_party/libzip/patches/0001-patch-configs-for-windows.patch b/third_party/libzip/patches/0001-patch-configs.patch similarity index 98% rename from third_party/libzip/patches/0001-patch-configs-for-windows.patch rename to third_party/libzip/patches/0001-patch-configs.patch index 5a68179..24bc27e 100644 --- a/third_party/libzip/patches/0001-patch-configs-for-windows.patch +++ b/third_party/libzip/patches/0001-patch-configs.patch
@@ -86,9 +86,7 @@ #define LIBZIP_VERSION_MICRO 3 -/* #undef ZIP_STATIC */ -+#if defined(OS_WIN) +#define ZIP_STATIC -+#endif #define _Nullable #define _Nonnull
diff --git a/third_party/libzip/src/zipconf.h b/third_party/libzip/src/zipconf.h index f798750..85e2967 100644 --- a/third_party/libzip/src/zipconf.h +++ b/third_party/libzip/src/zipconf.h
@@ -15,9 +15,7 @@ #define LIBZIP_VERSION_MINOR 7 #define LIBZIP_VERSION_MICRO 3 -#if defined(OS_WIN) #define ZIP_STATIC -#endif #define _Nullable #define _Nonnull
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium index 907588e..7818d00 100644 --- a/third_party/nearby/README.chromium +++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@ Name: Nearby Connections Library Short Name: Nearby URL: https://github.com/google/nearby-connections -Version: f02498f17e4903d913b08c33bde0dc800d3eced9 +Version: 7069c5710741dab014060f677a10d4e89db68a77 License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/tools/clang/rewrite_raw_ptr_fields/manual-fields-to-ignore.txt b/tools/clang/rewrite_raw_ptr_fields/manual-fields-to-ignore.txt index 907ece1..4747980 100644 --- a/tools/clang/rewrite_raw_ptr_fields/manual-fields-to-ignore.txt +++ b/tools/clang/rewrite_raw_ptr_fields/manual-fields-to-ignore.txt
@@ -77,10 +77,6 @@ ui::AXPlatformNodeAuraLinux::atk_hyperlink_ PrintDialogGtk::dialog_ -# Populated manually - using nmap or base::AllocPages directly -blink::GCInfoTable::table_ -disk_cache::MappedFile::buffer_ - # Populated manually, because of in-out-arg usage. blink::PaintController::IdAsHashKey::client ui::AXPlatformNodeAuraLinux::atk_object_ @@ -257,6 +253,14 @@ # Populated manually - on-stack pointee mojo::internal::ValidationContext::ScopedDepthTracker::ctx_ +# Populated manually - using mmap, MapViewOfFile or base::AllocPages directly +blink::GCInfoTable::table_ +cc::(anonymous namespace)::BitmapRasterBufferImpl::pixels_ +# TODO(bartekn): This one has a malloc() path, consider rewriting after all. +disk_cache::MappedFile::buffer_ +network::MojoToNetPendingBuffer::buffer_ +network::NetToMojoPendingBuffer::buffer_ + ####### # End of performance-related exclusions #######
diff --git a/tools/clang/rewrite_raw_ptr_fields/manual-paths-to-ignore.txt b/tools/clang/rewrite_raw_ptr_fields/manual-paths-to-ignore.txt index 1ccbdfa..3e0cc94 100644 --- a/tools/clang/rewrite_raw_ptr_fields/manual-paths-to-ignore.txt +++ b/tools/clang/rewrite_raw_ptr_fields/manual-paths-to-ignore.txt
@@ -33,9 +33,13 @@ # DEPS prohibits includes from base/ chrome/install_static -# Exclude pocdll.dll asnit doesn't depend on //base and only used for testing. +# Exclude pocdll.dll as it doesn't depend on //base and only used for testing. sandbox/win/sandbox_poc/pocdll +# Exclude directories that don't depend on //base, because nothing there uses +# anything from /base. +sandbox/linux/system_headers/ + # The folder holds headers that are duplicated in the Android source and need to # provide a stable C ABI. Can't depend on //base. android_webview/public/
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index f2216f4..cadbdfe4 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -2354,15 +2354,15 @@ ], 'official_goma_perf': [ - 'official', 'goma', 'minimal_symbols', + 'official', 'goma', 'minimal_symbols', 'pgo_phase_0', ], 'official_goma_mac_perf': [ - 'official', 'goma', 'no_keystone_registration_framework', 'no_widevine_cdm_host_verification', 'full_symbols', + 'official', 'goma', 'no_keystone_registration_framework', 'no_widevine_cdm_host_verification', 'full_symbols', 'pgo_phase_0', ], 'official_goma_mac_arm_perf': [ - 'official', 'goma', 'no_keystone_registration_framework', 'no_widevine_cdm_host_verification', 'full_symbols', 'arm64' + 'official', 'goma', 'no_keystone_registration_framework', 'no_widevine_cdm_host_verification', 'full_symbols', 'arm64', 'pgo_phase_0', ], 'official_goma_mac_pgo': [ @@ -2370,7 +2370,7 @@ ], 'official_goma_linux_perf': [ - 'official', 'goma', 'no_gnome_keyring', 'minimal_symbols', + 'official', 'goma', 'no_gnome_keyring', 'minimal_symbols', 'pgo_phase_0', ], 'official_goma_fuchsia_arm64_perf': [ @@ -2386,11 +2386,11 @@ ], 'official_goma_minimal_symbols_android': [ - 'official', 'goma', 'minimal_symbols', 'android', + 'official', 'goma', 'minimal_symbols', 'android', 'pgo_phase_0', ], 'official_goma_minimal_symbols_android_arm64': [ - 'official', 'goma', 'minimal_symbols', 'android', 'arm64', + 'official', 'goma', 'minimal_symbols', 'android', 'arm64', 'pgo_phase_0', ], 'official_goma_minimal_symbols_android_thin_lto_opt': [ @@ -2414,7 +2414,7 @@ ], 'official_goma_x86_perf': [ - 'official', 'goma', 'x86', 'minimal_symbols' + 'official', 'goma', 'x86', 'minimal_symbols', 'pgo_phase_0', ], 'official_goma_x86_pgo': [ @@ -3243,6 +3243,11 @@ 'gn_args': 'use_perfetto_client_library=true', }, + 'pgo_phase_0': { + 'mixins': ['strip_absolute_paths_from_debug_symbols'], + 'gn_args': 'chrome_pgo_phase=0' + }, + 'pgo_phase_1': { 'mixins': ['strip_absolute_paths_from_debug_symbols'], 'gn_args': 'chrome_pgo_phase=1'
diff --git a/tools/mb/mb_config_expectations/chromium.perf.json b/tools/mb/mb_config_expectations/chromium.perf.json index 5cc14f66..cf660f1 100644 --- a/tools/mb/mb_config_expectations/chromium.perf.json +++ b/tools/mb/mb_config_expectations/chromium.perf.json
@@ -1,10 +1,12 @@ { "Android Builder Perf": { "gn_args": { + "chrome_pgo_phase": 0, "ffmpeg_branding": "Chrome", "is_chrome_branded": true, "is_official_build": true, "proprietary_codecs": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "target_os": "android", "use_goma": true @@ -12,10 +14,12 @@ }, "Android arm64 Builder Perf": { "gn_args": { + "chrome_pgo_phase": 0, "ffmpeg_branding": "Chrome", "is_chrome_branded": true, "is_official_build": true, "proprietary_codecs": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "target_cpu": "arm64", "target_os": "android", @@ -24,10 +28,12 @@ }, "android-builder-perf": { "gn_args": { + "chrome_pgo_phase": 0, "ffmpeg_branding": "Chrome", "is_chrome_branded": true, "is_official_build": true, "proprietary_codecs": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "target_os": "android", "use_goma": true @@ -35,10 +41,12 @@ }, "android_arm64-builder-perf": { "gn_args": { + "chrome_pgo_phase": 0, "ffmpeg_branding": "Chrome", "is_chrome_branded": true, "is_official_build": true, "proprietary_codecs": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "target_cpu": "arm64", "target_os": "android", @@ -80,8 +88,10 @@ }, "linux-builder-perf": { "gn_args": { + "chrome_pgo_phase": 0, "is_chrome_branded": true, "is_official_build": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "use_gnome_keyring": false, "use_goma": true @@ -89,8 +99,10 @@ }, "linux-builder-perf-rel": { "gn_args": { + "chrome_pgo_phase": 0, "is_chrome_branded": true, "is_official_build": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "use_gnome_keyring": false, "use_goma": true @@ -98,10 +110,12 @@ }, "mac-arm-builder-perf": { "gn_args": { + "chrome_pgo_phase": 0, "enable_keystone_registration_framework": false, "ignore_missing_widevine_signing_cert": true, "is_chrome_branded": true, "is_official_build": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 2, "target_cpu": "arm64", "use_goma": true @@ -109,18 +123,22 @@ }, "mac-builder-perf": { "gn_args": { + "chrome_pgo_phase": 0, "enable_keystone_registration_framework": false, "ignore_missing_widevine_signing_cert": true, "is_chrome_branded": true, "is_official_build": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 2, "use_goma": true } }, "win32-builder-perf": { "gn_args": { + "chrome_pgo_phase": 0, "is_chrome_branded": true, "is_official_build": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "target_cpu": "x86", "use_goma": true @@ -128,8 +146,10 @@ }, "win64-builder-perf": { "gn_args": { + "chrome_pgo_phase": 0, "is_chrome_branded": true, "is_official_build": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "use_goma": true }
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.perf.json b/tools/mb/mb_config_expectations/tryserver.chromium.perf.json index 41d4c3c..ea6d67f5 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.perf.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.perf.json
@@ -1,10 +1,12 @@ { "Android Compile Perf": { "gn_args": { + "chrome_pgo_phase": 0, "ffmpeg_branding": "Chrome", "is_chrome_branded": true, "is_official_build": true, "proprietary_codecs": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "target_os": "android", "use_goma": true @@ -12,10 +14,12 @@ }, "Android arm64 Compile Perf": { "gn_args": { + "chrome_pgo_phase": 0, "ffmpeg_branding": "Chrome", "is_chrome_branded": true, "is_official_build": true, "proprietary_codecs": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "target_cpu": "arm64", "target_os": "android", @@ -24,8 +28,10 @@ }, "Linux Builder Perf": { "gn_args": { + "chrome_pgo_phase": 0, "is_chrome_branded": true, "is_official_build": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "use_gnome_keyring": false, "use_goma": true @@ -33,20 +39,24 @@ }, "Mac Builder Perf": { "gn_args": { + "chrome_pgo_phase": 0, "enable_keystone_registration_framework": false, "ignore_missing_widevine_signing_cert": true, "is_chrome_branded": true, "is_official_build": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 2, "use_goma": true } }, "Mac arm Builder Perf": { "gn_args": { + "chrome_pgo_phase": 0, "enable_keystone_registration_framework": false, "ignore_missing_widevine_signing_cert": true, "is_chrome_branded": true, "is_official_build": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 2, "target_cpu": "arm64", "use_goma": true @@ -54,8 +64,10 @@ }, "Win Builder Perf": { "gn_args": { + "chrome_pgo_phase": 0, "is_chrome_branded": true, "is_official_build": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "target_cpu": "x86", "use_goma": true @@ -63,8 +75,10 @@ }, "Win x64 Builder Perf": { "gn_args": { + "chrome_pgo_phase": 0, "is_chrome_branded": true, "is_official_build": true, + "strip_absolute_paths_from_debug_symbols": true, "symbol_level": 1, "use_goma": true }
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index e95ad38..47be950d 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -4814,6 +4814,14 @@ <int value="3" label="Initially incomplete & Failure"/> </enum> +<enum name="AutofillAssistantTriggerUIType"> + <int value="0" label="UNSPECIFIED_TRIGGER_UI_TYPE"/> + <int value="1" label="CART_FIRST_TIME_USER"/> + <int value="2" label="CART_RETURNING_USER"/> + <int value="3" label="CHECKOUT_FIRST_TIME_USER"/> + <int value="4" label="CHECKOUT_RETURNING_TIME_USER"/> +</enum> + <enum name="AutofillAwGSuggestionAvailability"> <int value="0" label="No suggestion"/> <int value="1" label="Has suggestion, user doesn't select it"/> @@ -41581,6 +41589,28 @@ <int value="5" label="Target Language"/> </enum> +<enum name="LanguageUsage.UI.Android.Availability"> + <int value="0" label="Top Available">Top Android language is available.</int> + <int value="1" label="Only Default Available"> + Top Android language is not available but another one is. + </int> + <int value="2" label="None Available"/> + <int value="3" label="Overridden"> + Overridden languages must be avaliable. + </int> +</enum> + +<enum name="LanguageUsage.UI.Android.Correctness"> + <int value="0" label="Correct"/> + <int value="1" label="Incorrect"/> + <int value="2" label="Not Available"> + Languages that are not available cannot be correct. + </int> + <int value="3" label="Only Java Correct"> + The Java UI language is correct but native UI language not. + </int> +</enum> + <enum name="LargestContentfulPaint.TerminationState"> <summary> The state of the largest contentful paint algorithm at the time of @@ -44896,6 +44926,7 @@ <int value="-202007318" label="AndroidAIAFetching:enabled"/> <int value="-201633741" label="DisplayAlignAssist:enabled"/> <int value="-200805659" label="ContextualSuggestionsButton:enabled"/> + <int value="-200160012" label="RelatedSearchesUi:disabled"/> <int value="-199690952" label="PageInfoV2:enabled"/> <int value="-198002129" label="MetricsSettingsAndroid:disabled"/> <int value="-196110497" label="force-text-direction"/> @@ -44989,6 +45020,7 @@ <int value="-115834377" label="EnableUnifiedMultiDeviceSetup:disabled"/> <int value="-114807608" label="TerminalSystemApp:disabled"/> <int value="-114768488" label="ImmersiveFullscreen:enabled"/> + <int value="-113855291" label="RelatedSearchesUi:enabled"/> <int value="-112459802" label="WebXrRenderPath:enabled"/> <int value="-112335255" label="FormControlsRefresh:enabled"/> <int value="-111160804" label="ChromeShareLongScreenshot:disabled"/> @@ -45672,6 +45704,7 @@ <int value="535131384" label="OmniboxTailSuggestions:enabled"/> <int value="535194142" label="TemporaryHoldingSpacePreviews:enabled"/> <int value="535976218" label="enable-plugin-power-saver"/> + <int value="536948426" label="COLRV1Fonts:enabled"/> <int value="537857256" label="PipRoundedCorners:enabled"/> <int value="538468149" label="OfflinePagesCT:enabled"/> <int value="538600423" label="OmniboxDocumentProvider:enabled"/> @@ -47198,6 +47231,7 @@ <int value="1951645673" label="PasswordsKeyboardAccessory:disabled"/> <int value="1952339754" label="SignedExchangePrefetchCacheForNavigations:enabled"/> + <int value="1954778883" label="COLRV1Fonts:disabled"/> <int value="1955238689" label="OmniboxMaxURLMatches:disabled"/> <int value="1957273171" label="PageAlmostIdle:disabled"/> <int value="1957358530" label="ContextualSearchSecondTap:enabled"/> @@ -65249,6 +65283,7 @@ <int value="71" label="InternalHighPriorityLocalFrame"/> <int value="72" label="JavascriptTimerImmediate"/> <int value="73" label="JavascriptTimerDelayedLowNesting"/> + <int value="76" label="WakeLock"/> </enum> <enum name="RendererSchedulerTaskUseCase"> @@ -70660,6 +70695,19 @@ <int value="3" label="Large Downscale"/> </enum> +<enum name="SlipstreamPort"> + <int value="0" label="Other"/> + <int value="1" label="69"/> + <int value="2" label="137"/> + <int value="3" label="161"/> + <int value="4" label="554"/> + <int value="5" label="1719"/> + <int value="6" label="1720"/> + <int value="7" label="1723"/> + <int value="8" label="6566"/> + <int value="9" label="10080"/> +</enum> + <enum name="SmartChargingMessages"> <int value="0" label="SerializeProtoError"/> <int value="1" label="WriteFileError"/> @@ -72619,6 +72667,10 @@ <int value="6" label="Failed key parse error"/> <int value="7" label="Failed key write error"/> <int value="8" label="Failed key serialization"/> + <int value="9" label="Failed event read error"/> + <int value="10" label="Failed event parse error"/> + <int value="11" label="Failed event write error"/> + <int value="12" label="Failed event serialization"/> </enum> <enum name="StructuredMetricsKeyValidationState"> @@ -79240,6 +79292,7 @@ <int value="4" label="Success CFF2 outline font"/> <int value="5" label="Success Sbix color font"/> <int value="6" label="Success COLR/CPAL color font"/> + <int value="7" label="Success COLRv1 color font"/> </enum> <enum name="WebFontInterventionResult">
diff --git a/tools/metrics/histograms/histograms_xml/android/histograms.xml b/tools/metrics/histograms/histograms_xml/android/histograms.xml index 7d482b6..9a140cc 100644 --- a/tools/metrics/histograms/histograms_xml/android/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/android/histograms.xml
@@ -1264,6 +1264,9 @@ <histogram name="Android.Language.UiIsSystemLanguage" enum="BooleanMatched" expires_after="2021-12-01"> + <obsolete> + Replaced by LanguageUsage.UI.Android.* Feb 2021. + </obsolete> <owner>perrier@chromium.org</owner> <owner>chrome-language@google.com</owner> <summary> @@ -1274,6 +1277,9 @@ <histogram name="Android.Language.WrongLanguageAfterResume" enum="Boolean" expires_after="2021-12-01"> + <obsolete> + Replaced by LanguageUsage.UI.Android.* Feb 2021. + </obsolete> <owner>perrier@chromium.org</owner> <owner>chrome-language@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/apps/histograms.xml b/tools/metrics/histograms/histograms_xml/apps/histograms.xml index 508d6fb..b3acb55 100644 --- a/tools/metrics/histograms/histograms_xml/apps/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/apps/histograms.xml
@@ -45,6 +45,9 @@ <histogram name="Apps.AppInfoDialog.Launches" enum="AppInfoDialogLaunchOrigin" expires_after="M77"> + <obsolete> + Removed February 2021. + </obsolete> <owner>sashab@chromium.org</owner> <summary> The number of times the app info dialog is launched. This is gathered each @@ -55,6 +58,9 @@ <histogram name="Apps.AppInfoDialog.OpenedForLocation" enum="AppLocation" expires_after="M85"> + <obsolete> + Removed September 2016. Recorded as Apps.AppInfoDialogOpenedForLocation? + </obsolete> <owner>sashab@chromium.org</owner> <summary> The location of the app that the dialog was opened for. This is gathered @@ -64,6 +70,9 @@ <histogram name="Apps.AppInfoDialog.OpenedForType" enum="ExtensionType" expires_after="M85"> + <obsolete> + Removed September 2016. Recorded as Apps.AppInfoDialogOpenedForType? + </obsolete> <owner>sashab@chromium.org</owner> <summary> The type of the app that the dialog was opened for. This is gathered each @@ -366,6 +375,41 @@ </summary> </histogram> +<histogram name="Apps.AppList.ScoreNormalizer.L2ErrorDecreased" enum="Boolean" + expires_after="2022-01-31"> + <owner>adafang@google.com</owner> + <owner>wrong@chromium.com</owner> + <owner>tby@chromium.com</owner> + <summary> + Whether or not splitting and merging bins is less than or equal to the old + L2 error of bin counts. Logged after each search result is recorded. + </summary> +</histogram> + +<histogram name="Apps.AppList.ScoreNormalizer.ReadPrefsError" + enum="BooleanError" expires_after="2022-01-31"> + <owner>adafang@google.com</owner> + <owner>wrong@chromium.com</owner> + <owner>tby@chromium.com</owner> + <summary> + Whether or not dividers and/or counts from read prefs is empty. A empty + dividers or counts means one of the values in the vector was not saved + properly as a double. Logged when the ScoreNormalizer is initialized, which + is when ReadPrefs is called. + </summary> +</histogram> + +<histogram name="Apps.AppList.ScoreNormalizer.SearchResultsCount" units="count" + expires_after="2022-01-31"> + <owner>adafang@google.com</owner> + <owner>wrong@chromium.com</owner> + <owner>tby@chromium.com</owner> + <summary> + The number of search results which have been normalized. Logged when each + vector of search results is normalized. + </summary> +</histogram> + <histogram name="Apps.AppList.SearchQueryLength.Apps" units="characters" expires_after="2021-05-16"> <owner>thanhdng@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml index fa724b5..219625f 100644 --- a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml +++ b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml
@@ -8690,8 +8690,11 @@ <histogram_suffixes name="MachineLearningServiceModels" separator="." ordering="prefix"> <suffix name="smart_dim_model_20190521_v3" - label="Predict whether to cancel screen dims, temporarily added for - downloadable smart dim models, will remove after M84."/> + label="Obsolete smart dim model identifier."> + <obsolete> + This model identifier deprecated after M84, use SmartDimModel instead. + </obsolete> + </suffix> <suffix name="SmartDimModel" label="Predict whether to cancel screen dims."/> <suffix name="TestModel" label="A simple model for testing purpose."/> <suffix name="TopCatModel" label="Predict the next app to be launched.">
diff --git a/tools/metrics/histograms/histograms_xml/net/histograms.xml b/tools/metrics/histograms/histograms_xml/net/histograms.xml index b366b0e6..603f931 100644 --- a/tools/metrics/histograms/histograms_xml/net/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/net/histograms.xml
@@ -1988,6 +1988,21 @@ </summary> </histogram> +<histogram name="Net.Port.SlipstreamRestricted" enum="SlipstreamPort" + expires_after="2021-04-01"> + <owner>ricea@chromium.org</owner> + <owner>yhirano@chromium.org</owner> + <summary> + Ports which may be restricted due to the NAT Slipstream 2.0 vulnerability. + Logged for every valid port passed to net::IsPortAllowedForScheme(). Almost + all lookups will end up in the kOther bucket. + + A top-level navigation will be counted 4 times, whereas a subresource will + only be counted once. This is not intentional, but may be useful to estimate + the level of breakage. + </summary> +</histogram> + <histogram name="Net.Prefetch.HitBytes" units="bytes" expires_after="M87"> <owner>jkarlin@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/others/histograms.xml b/tools/metrics/histograms/histograms_xml/others/histograms.xml index 1b9a6dc..e02f83e 100644 --- a/tools/metrics/histograms/histograms_xml/others/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/others/histograms.xml
@@ -7870,7 +7870,7 @@ </histogram> <histogram name="LanguageSettings.PageImpression" - enum="LanguageSettingsPageType" expires_after="2021-07-11"> + enum="LanguageSettingsPageType" expires_after="2021-12-01"> <owner>googleo@chromium.org</owner> <owner>chrome-language@google.com</owner> <summary> @@ -7881,7 +7881,7 @@ </histogram> <histogram name="LanguageUsage.AcceptLanguage" enum="LanguageCode" - expires_after="2021-06-06"> + expires_after="2021-12-01"> <owner>perrier@chromium.org</owner> <owner>chrome-language@google.com</owner> <summary> @@ -7891,7 +7891,7 @@ </histogram> <histogram name="LanguageUsage.AcceptLanguage.Count" units="units" - expires_after="2021-08-01"> + expires_after="2021-12-01"> <owner>dvallet@chromium.org</owner> <owner>chrome-language@google.com</owner> <summary> @@ -7901,7 +7901,7 @@ </histogram> <histogram name="LanguageUsage.ApplicationLanguage" enum="LanguageCode" - expires_after="2021-06-06"> + expires_after="2021-12-01"> <owner>perrier@chromium.org</owner> <owner>chrome-language@google.com</owner> <summary> @@ -7911,7 +7911,7 @@ </histogram> <histogram name="LanguageUsage.MostFrequentPageLanguages" enum="LanguageCode" - expires_after="2021-06-20"> + expires_after="2021-12-01"> <owner>perrier@chromium.org</owner> <owner>chrome-language@google.com</owner> <summary> @@ -7921,6 +7921,63 @@ </summary> </histogram> +<histogram name="LanguageUsage.UI.Android.Availability" + enum="LanguageUsage.UI.Android.Availability" expires_after="2021-12-01"> + <owner>perrier@chromium.org</owner> + <owner>chrome-language@google.com</owner> + <summary> + The availability status of Android system languages for use as the Chromium + UI language. If the Chromium UI language is overridden, it must be + avaliable. The default language is the one used by the JVM for localization. + This will be different from the top Android language if the top Android + language is not available for localization in Chromium. For more info, see + the Android documentation on LocaleList.getDefault(). + + This histogram is recorded during onForgroundStart() for Android. + </summary> +</histogram> + +<histogram name="LanguageUsage.UI.Android.Correctness" + enum="LanguageUsage.UI.Android.Correctness" expires_after="2021-12-01"> + <owner>perrier@chromium.org</owner> + <owner>chrome-language@google.com</owner> + <summary> + The status of the current Chromium UI. It is correct when the UI matches + what the JVM default language is set to. + + This histogram is recorded during onForgroundStart() for Android. + </summary> +</histogram> + +<histogram name="LanguageUsage.UI.Android.Correctness.NoOverride" + enum="LanguageUsage.UI.Android.Correctness" expires_after="2021-12-01"> + <owner>perrier@chromium.org</owner> + <owner>chrome-language@google.com</owner> + <summary> + The status of the current Chromium UI when the UI language is not + overridden. The UI language is correct when it matches the default Android + system language. If no Android language is available as the Chromium + language, then the UI is by definition incorrect. + + This histogram is recorded during onForgroundStart() for Android. + </summary> +</histogram> + +<histogram name="LanguageUsage.UI.Android.Correctness.Override" + enum="LanguageUsage.UI.Android.Correctness" expires_after="2021-12-01"> + <owner>perrier@chromium.org</owner> + <owner>chrome-language@google.com</owner> + <summary> + The status of the current Chromium UI when the UI language is overridden. + The UI language is correct when it matches the override UI value set as the + default locale. The Native UI language can be different from the Java UI + language if Play Store daily hygiene has not run since an override language + was set. + + This histogram is recorded during onForgroundStart() for Android. + </summary> +</histogram> + <histogram name="Launch.FlagsAtStartup" enum="LoginCustomFlags" expires_after="never"> <!-- expires-never: monitors use of all flags. --> @@ -8609,7 +8666,7 @@ <histogram base="true" name="MachineLearningService.CreateGraphExecutorResult.Event" enum="MachineLearningServiceCreateGraphExecutorResultEvent" - expires_after="2021-03-15"> + expires_after="2021-09-15"> <owner>amoylan@chromium.org</owner> <owner>alanlxl@chromium.org</owner> <summary> @@ -8618,7 +8675,7 @@ </histogram> <histogram base="true" name="MachineLearningService.ExecuteResult.Event" - enum="MachineLearningServiceExecuteResultEvent" expires_after="2021-03-15"> + enum="MachineLearningServiceExecuteResultEvent" expires_after="2021-09-15"> <owner>amoylan@chromium.org</owner> <owner>alanlxl@chromium.org</owner> <summary> @@ -8671,7 +8728,7 @@ <histogram name="MachineLearningService.LoadModelResult" enum="MachineLearningServiceLoadModelResultEvent" - expires_after="2021-03-15"> + expires_after="2021-09-15"> <owner>amoylan@chromium.org</owner> <owner>alanlxl@chromium.org</owner> <summary> @@ -8683,7 +8740,7 @@ <histogram base="true" name="MachineLearningService.LoadModelResult.Event" enum="MachineLearningServiceLoadModelResultEvent" - expires_after="2021-03-15"> + expires_after="2021-09-15"> <owner>amoylan@chromium.org</owner> <owner>alanlxl@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/password/histograms.xml b/tools/metrics/histograms/histograms_xml/password/histograms.xml index d3966b0..86a1382 100644 --- a/tools/metrics/histograms/histograms_xml/password/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/password/histograms.xml
@@ -77,6 +77,9 @@ <histogram name="PasswordGeneration.IsTriggeredManually" enum="BooleanIsGenerationTriggeredManually" expires_after="M81"> + <obsolete> + Expired in M82; deleted in M90. + </obsolete> <owner>kolos@chromium.org</owner> <summary> Measures the frequency of manually triggered password generations.
diff --git a/tools/metrics/histograms/histograms_xml/sync/histograms.xml b/tools/metrics/histograms/histograms_xml/sync/histograms.xml index b4da8e5b9..bfbece0 100644 --- a/tools/metrics/histograms/histograms_xml/sync/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/sync/histograms.xml
@@ -526,6 +526,18 @@ </summary> </histogram> +<histogram name="Sync.ModelTypeBlockedDueToUndecryptableUpdate" + enum="SyncModelTypes" expires_after="2021-08-09"> + <owner>victorvianna@google.com</owner> + <owner>mastiz@chromium.org</owner> + <summary> + Recorded on every GetUpdatesResponse if the data type is blocked because due + to the existence of undecryptable updates sent by the server. This is *not* + recorded for the cases where sync encryption is in a valid pending state, + e.g. user hasn't entered their passphrase yet. + </summary> +</histogram> + <histogram base="true" name="Sync.ModelTypeConfigurationTime.Ephemeral" units="ms" expires_after="2021-06-27"> <owner>jkrcal@chromium.org</owner>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index 9d9aa77..cf7c6e731 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -1640,6 +1640,19 @@ </summary> <aggregation> <history> + <index fields="metrics.TriggerUIType"/> + <statistics> + <enumeration/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="TriggerUIType" enum="AutofillAssistantTriggerUIType"> + <summary> + A enum that captures the type of trigger and its intent. + </summary> + <aggregation> + <history> <statistics> <enumeration/> </statistics> @@ -1665,6 +1678,19 @@ </summary> <aggregation> <history> + <index fields="metrics.TriggerUIType"/> + <statistics> + <enumeration/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="TriggerUIType" enum="AutofillAssistantTriggerUIType"> + <summary> + A enum that captures the type of trigger and its intent. + </summary> + <aggregation> + <history> <statistics> <enumeration/> </statistics> @@ -1689,6 +1715,19 @@ </summary> <aggregation> <history> + <index fields="metrics.TriggerUIType"/> + <statistics> + <enumeration/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="TriggerUIType" enum="AutofillAssistantTriggerUIType"> + <summary> + A enum that captures the type of trigger and its intent. + </summary> + <aggregation> + <history> <statistics> <enumeration/> </statistics> @@ -1712,6 +1751,19 @@ </summary> <aggregation> <history> + <index fields="metrics.TriggerUIType"/> + <statistics> + <enumeration/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="TriggerUIType" enum="AutofillAssistantTriggerUIType"> + <summary> + A enum that captures the type of trigger and its intent. + </summary> + <aggregation> + <history> <statistics> <enumeration/> </statistics>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index edc8e4d..b70eae60 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -2,15 +2,15 @@ "trace_processor_shell": { "win": { "hash": "05f898ec237791c9d9d6d1901e9cef62888eb944", - "remote_path": "perfetto_binaries/trace_processor_shell/win/6a605833d9b393d20d9fee45830dd3997599c2be/trace_processor_shell.exe" + "remote_path": "perfetto_binaries/trace_processor_shell/win/f69ae0481064617cba71c34be1570fa56b49d076/trace_processor_shell.exe" }, "mac": { - "hash": "0802cb84e7fbfe4e104048c5973c6e38e7b62aec", - "remote_path": "perfetto_binaries/trace_processor_shell/mac/b05d9d92a00eb13527779d8f4fb3324ee1a2a2ee/trace_processor_shell" + "hash": "e8bf46a9b6e7b5d5bb248ebc388e543d238a79dc", + "remote_path": "perfetto_binaries/trace_processor_shell/mac/6a605833d9b393d20d9fee45830dd3997599c2be/trace_processor_shell" }, "linux": { - "hash": "139c8527bd8b2f7b3a9c90f28f6b292cf1cba69e", - "remote_path": "perfetto_binaries/trace_processor_shell/linux/b3db3ded2c90769dd8c19ec0fb2018691fa9decb/trace_processor_shell" + "hash": "88cccc124fe04445c17f1b2649ac1b7d44c53296", + "remote_path": "perfetto_binaries/trace_processor_shell/linux/f69ae0481064617cba71c34be1570fa56b49d076/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/accessibility/BUILD.gn b/ui/accessibility/BUILD.gn index 7317e8f8..3e693fd9 100644 --- a/ui/accessibility/BUILD.gn +++ b/ui/accessibility/BUILD.gn
@@ -221,6 +221,7 @@ "ax_language_detection_unittest.cc", "ax_node_data_unittest.cc", "ax_node_position_unittest.cc", + "ax_node_unittest.cc", "ax_range_unittest.cc", "ax_role_properties_unittest.cc", "ax_table_info_unittest.cc",
diff --git a/ui/accessibility/ax_node.cc b/ui/accessibility/ax_node.cc index 1d444d8..5227b8a 100644 --- a/ui/accessibility/ax_node.cc +++ b/ui/accessibility/ax_node.cc
@@ -1262,11 +1262,10 @@ } bool AXNode::IsChildOfLeaf() const { - const AXNode* ancestor = GetUnignoredParent(); - while (ancestor) { + for (const AXNode* ancestor = GetUnignoredParent(); ancestor; + ancestor = ancestor->GetUnignoredParent()) { if (ancestor->IsLeaf()) return true; - ancestor = ancestor->GetUnignoredParent(); } return false; } @@ -1406,6 +1405,30 @@ return ui::IsSetLike(parent()->data().role); } +AXNode* AXNode::GetLowestPlatformAncestor() const { + AXNode* current_node = const_cast<AXNode*>(this); + AXNode* lowest_unignored_node = current_node; + for (; lowest_unignored_node && lowest_unignored_node->IsIgnored(); + lowest_unignored_node = lowest_unignored_node->parent()) { + } + + // `highest_leaf_node` could be nullptr. + AXNode* highest_leaf_node = lowest_unignored_node; + // For the purposes of this method, a leaf node does not include leaves in the + // internal accessibility tree, only in the platform exposed tree. + for (AXNode* ancestor_node = lowest_unignored_node; ancestor_node; + ancestor_node = ancestor_node->GetUnignoredParent()) { + if (ancestor_node->IsLeaf()) + highest_leaf_node = ancestor_node; + } + if (highest_leaf_node) + return highest_leaf_node; + + if (lowest_unignored_node) + return lowest_unignored_node; + return current_node; +} + AXNode* AXNode::GetTextFieldAncestor() const { // The descendants of a text field usually have State::kEditable, however in // the case of Role::kSearchBox or Role::kSpinButton being the text field
diff --git a/ui/accessibility/ax_node.h b/ui/accessibility/ax_node.h index d42ac83..017d914 100644 --- a/ui/accessibility/ax_node.h +++ b/ui/accessibility/ax_node.h
@@ -514,6 +514,12 @@ // collapsed. AXNode* GetCollapsedMenuListPopUpButtonAncestor() const; + // If this node is exposed to the platform's accessibility layer, returns this + // node. Otherwise, returns the lowest ancestor that is exposed to the + // platform. (See `IsLeaf()` and `IsIgnored()` for information on what is + // exposed to platform APIs.) + AXNode* GetLowestPlatformAncestor() const; + // If this node is within an editable region, returns the node that is at the // root of that editable region, otherwise returns nullptr. In accessibility, // an editable region is synonymous to a text field.
diff --git a/ui/accessibility/ax_node_position_unittest.cc b/ui/accessibility/ax_node_position_unittest.cc index c119a82..f69eb23 100644 --- a/ui/accessibility/ax_node_position_unittest.cc +++ b/ui/accessibility/ax_node_position_unittest.cc
@@ -3713,6 +3713,7 @@ inline_box.id = 6; root.role = ax::mojom::Role::kRootWebArea; + root.AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject, true); root.child_ids = {image.id, paragraph.id}; image.role = ax::mojom::Role::kImage; @@ -3722,6 +3723,8 @@ image.SetNameFrom(ax::mojom::NameFrom::kAttribute); paragraph.role = ax::mojom::Role::kParagraph; + paragraph.AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject, + true); paragraph.child_ids = {link.id}; link.role = ax::mojom::Role::kLink; @@ -8695,13 +8698,12 @@ ASSERT_TRUE(text_position2->IsTextPosition()); EXPECT_EQ(*text_position1, *text_position2); - // Affinities should not matter. text_position2 = AXNodePosition::CreateTextPosition( GetTreeID(), inline_box1_.id, 0 /* text_offset */, ax::mojom::TextAffinity::kUpstream); ASSERT_NE(nullptr, text_position2); ASSERT_TRUE(text_position2->IsTextPosition()); - EXPECT_EQ(*text_position1, *text_position2); + EXPECT_GT(*text_position1, *text_position2); // Text offsets should match. text_position1 = AXNodePosition::CreateTextPosition( @@ -8810,6 +8812,317 @@ ASSERT_TRUE(*text_position_two == *text_position_one); } +TEST_F(AXPositionTest, OperatorsTreePositionsAroundEmbeddedCharacter) { + g_ax_embedded_object_behavior = AXEmbeddedObjectBehavior::kExposeCharacter; + + // ++1 kRootWebArea "<embedded_object><embedded_object>" + // ++++2 kParagraph "<embedded_object>" + // ++++++3 kLink "Hello" + // ++++++++4 kStaticText "Hello" + // ++++++++++5 kInlineTextBox "Hello" + // ++++6 kParagraph "World" + // ++++++7 kStaticText "World" + // ++++++++8 kInlineTextBox "World" + AXNodeData root_1; + AXNodeData paragraph_2; + AXNodeData link_3; + AXNodeData static_text_4; + AXNodeData inline_box_5; + AXNodeData paragraph_6; + AXNodeData static_text_7; + AXNodeData inline_box_8; + + root_1.id = 1; + paragraph_2.id = 2; + link_3.id = 3; + static_text_4.id = 4; + inline_box_5.id = 5; + paragraph_6.id = 6; + static_text_7.id = 7; + inline_box_8.id = 8; + + root_1.role = ax::mojom::Role::kRootWebArea; + root_1.AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject, + true); + root_1.child_ids = {paragraph_2.id, paragraph_6.id}; + + paragraph_2.role = ax::mojom::Role::kParagraph; + paragraph_2.AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject, + true); + paragraph_2.child_ids = {link_3.id}; + + link_3.role = ax::mojom::Role::kLink; + link_3.AddState(ax::mojom::State::kLinked); + link_3.child_ids = {static_text_4.id}; + + static_text_4.role = ax::mojom::Role::kStaticText; + static_text_4.SetName("Hello"); + static_text_4.child_ids = {inline_box_5.id}; + + inline_box_5.role = ax::mojom::Role::kInlineTextBox; + inline_box_5.SetName("Hello"); + + paragraph_6.role = ax::mojom::Role::kParagraph; + paragraph_6.AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject, + true); + paragraph_6.child_ids = {static_text_7.id}; + + static_text_7.role = ax::mojom::Role::kStaticText; + static_text_7.SetName("World"); + static_text_7.child_ids = {inline_box_8.id}; + + inline_box_8.role = ax::mojom::Role::kInlineTextBox; + inline_box_8.SetName("World"); + + SetTree( + CreateAXTree({root_1, paragraph_2, link_3, static_text_4, inline_box_5, + paragraph_6, static_text_7, inline_box_8})); + + TestPositionType before_root_1 = AXNodePosition::CreateTreePosition( + GetTreeID(), root_1.id, 0 /* child_index */); + ASSERT_NE(nullptr, before_root_1); + TestPositionType middle_root_1 = AXNodePosition::CreateTreePosition( + GetTreeID(), root_1.id, 1 /* child_index */); + ASSERT_NE(nullptr, middle_root_1); + TestPositionType after_root_1 = AXNodePosition::CreateTreePosition( + GetTreeID(), root_1.id, 2 /* child_index */); + ASSERT_NE(nullptr, after_root_1); + + TestPositionType before_paragraph_2 = AXNodePosition::CreateTreePosition( + GetTreeID(), paragraph_2.id, 0 /* child_index */); + ASSERT_NE(nullptr, before_paragraph_2); + TestPositionType after_paragraph_2 = AXNodePosition::CreateTreePosition( + GetTreeID(), paragraph_2.id, 1 /* child_index */); + ASSERT_NE(nullptr, after_paragraph_2); + + TestPositionType before_paragraph_6 = AXNodePosition::CreateTreePosition( + GetTreeID(), paragraph_6.id, 0 /* child_index */); + ASSERT_NE(nullptr, before_paragraph_6); + TestPositionType after_paragraph_6 = AXNodePosition::CreateTreePosition( + GetTreeID(), paragraph_6.id, 1 /* child_index */); + ASSERT_NE(nullptr, before_paragraph_6); + + TestPositionType before_inline_box_5 = AXNodePosition::CreateTreePosition( + GetTreeID(), inline_box_5.id, + AXNodePosition::BEFORE_TEXT /* child_index */); + ASSERT_NE(nullptr, before_inline_box_5); + TestPositionType after_inline_box_5 = AXNodePosition::CreateTreePosition( + GetTreeID(), inline_box_5.id, 0 /* child_index */); + ASSERT_NE(nullptr, after_inline_box_5); + + TestPositionType before_inline_box_8 = AXNodePosition::CreateTreePosition( + GetTreeID(), inline_box_8.id, + AXNodePosition::BEFORE_TEXT /* child_index */); + ASSERT_NE(nullptr, before_inline_box_8); + TestPositionType after_inline_box_8 = AXNodePosition::CreateTreePosition( + GetTreeID(), inline_box_8.id, 0 /* child_index */); + ASSERT_NE(nullptr, after_inline_box_8); + + EXPECT_EQ(*before_root_1, *before_paragraph_2); + EXPECT_EQ(*before_paragraph_2, *before_root_1); + EXPECT_EQ(*before_root_1, *before_inline_box_5); + EXPECT_EQ(*before_inline_box_5, *before_root_1); + + EXPECT_LT(*before_root_1, *middle_root_1); + EXPECT_GT(*before_paragraph_6, *before_inline_box_5); + EXPECT_LT(*before_paragraph_2, *before_inline_box_8); + + EXPECT_EQ(*middle_root_1, *before_paragraph_6); + EXPECT_EQ(*before_paragraph_6, *middle_root_1); + EXPECT_EQ(*middle_root_1, *before_inline_box_8); + EXPECT_EQ(*before_inline_box_8, *middle_root_1); + + // Since tree positions do not have affinity, all of the following positions + // should be equivalent. + EXPECT_EQ(*middle_root_1, *after_paragraph_2); + EXPECT_EQ(*after_paragraph_2, *middle_root_1); + EXPECT_EQ(*middle_root_1, *after_inline_box_5); + EXPECT_EQ(*after_inline_box_5, *middle_root_1); + + EXPECT_EQ(*after_root_1, *after_paragraph_6); + EXPECT_EQ(*after_paragraph_6, *after_root_1); + EXPECT_EQ(*after_root_1, *after_inline_box_8); + EXPECT_EQ(*after_inline_box_8, *after_root_1); +} + +TEST_F(AXPositionTest, OperatorsTextPositionsAroundEmbeddedCharacter) { + g_ax_embedded_object_behavior = AXEmbeddedObjectBehavior::kExposeCharacter; + + // ++1 kRootWebArea "<embedded_object><embedded_object>" + // ++++2 kParagraph "<embedded_object>" + // ++++++3 kLink "Hello" + // ++++++++4 kStaticText "Hello" + // ++++++++++5 kInlineTextBox "Hello" + // ++++6 kParagraph "World" + // ++++++7 kStaticText "World" + // ++++++++8 kInlineTextBox "World" + AXNodeData root_1; + AXNodeData paragraph_2; + AXNodeData link_3; + AXNodeData static_text_4; + AXNodeData inline_box_5; + AXNodeData paragraph_6; + AXNodeData static_text_7; + AXNodeData inline_box_8; + + root_1.id = 1; + paragraph_2.id = 2; + link_3.id = 3; + static_text_4.id = 4; + inline_box_5.id = 5; + paragraph_6.id = 6; + static_text_7.id = 7; + inline_box_8.id = 8; + + root_1.role = ax::mojom::Role::kRootWebArea; + root_1.AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject, + true); + root_1.child_ids = {paragraph_2.id, paragraph_6.id}; + + paragraph_2.role = ax::mojom::Role::kParagraph; + paragraph_2.AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject, + true); + paragraph_2.child_ids = {link_3.id}; + + link_3.role = ax::mojom::Role::kLink; + link_3.AddState(ax::mojom::State::kLinked); + link_3.child_ids = {static_text_4.id}; + + static_text_4.role = ax::mojom::Role::kStaticText; + static_text_4.SetName("Hello"); + static_text_4.child_ids = {inline_box_5.id}; + + inline_box_5.role = ax::mojom::Role::kInlineTextBox; + inline_box_5.SetName("Hello"); + + paragraph_6.role = ax::mojom::Role::kParagraph; + paragraph_6.AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject, + true); + paragraph_6.child_ids = {static_text_7.id}; + + static_text_7.role = ax::mojom::Role::kStaticText; + static_text_7.SetName("World"); + static_text_7.child_ids = {inline_box_8.id}; + + inline_box_8.role = ax::mojom::Role::kInlineTextBox; + inline_box_8.SetName("World"); + + SetTree( + CreateAXTree({root_1, paragraph_2, link_3, static_text_4, inline_box_5, + paragraph_6, static_text_7, inline_box_8})); + + TestPositionType before_root_1 = AXNodePosition::CreateTextPosition( + GetTreeID(), root_1.id, 0 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, before_root_1); + TestPositionType middle_root_1 = AXNodePosition::CreateTextPosition( + GetTreeID(), root_1.id, 1 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, middle_root_1); + TestPositionType middle_root_1_upstream = AXNodePosition::CreateTextPosition( + GetTreeID(), root_1.id, 1 /* text_offset */, + ax::mojom::TextAffinity::kUpstream); + ASSERT_NE(nullptr, middle_root_1_upstream); + TestPositionType after_root_1 = AXNodePosition::CreateTextPosition( + GetTreeID(), root_1.id, 2 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, after_root_1); + + TestPositionType before_paragraph_2 = AXNodePosition::CreateTextPosition( + GetTreeID(), paragraph_2.id, 0 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, before_paragraph_2); + // The first paragraph has a link inside it, so it will only expose a single + // "embedded object replacement character". + TestPositionType after_paragraph_2 = AXNodePosition::CreateTextPosition( + GetTreeID(), paragraph_2.id, 1 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, after_paragraph_2); + + TestPositionType before_paragraph_6 = AXNodePosition::CreateTextPosition( + GetTreeID(), paragraph_6.id, 0 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, before_paragraph_6); + // The second paragraph contains "World". + TestPositionType after_paragraph_6 = AXNodePosition::CreateTextPosition( + GetTreeID(), paragraph_6.id, 5 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, before_paragraph_6); + + TestPositionType before_inline_box_5 = AXNodePosition::CreateTextPosition( + GetTreeID(), inline_box_5.id, 0 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, before_inline_box_5); + TestPositionType middle_inline_box_5 = AXNodePosition::CreateTextPosition( + GetTreeID(), inline_box_5.id, 1 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, middle_inline_box_5); + // "Hello". + TestPositionType after_inline_box_5 = AXNodePosition::CreateTextPosition( + GetTreeID(), inline_box_5.id, 5 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, after_inline_box_5); + + TestPositionType before_inline_box_8 = AXNodePosition::CreateTextPosition( + GetTreeID(), inline_box_8.id, 0 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, before_inline_box_8); + TestPositionType middle_inline_box_8 = AXNodePosition::CreateTextPosition( + GetTreeID(), inline_box_8.id, 1 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, middle_inline_box_8); + // "World". + TestPositionType after_inline_box_8 = AXNodePosition::CreateTextPosition( + GetTreeID(), inline_box_8.id, 5 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, after_inline_box_8); + + EXPECT_EQ(*before_root_1, *before_paragraph_2); + EXPECT_EQ(*before_paragraph_2, *before_root_1); + EXPECT_EQ(*before_root_1, *before_inline_box_5); + EXPECT_EQ(*before_inline_box_5, *before_root_1); + + EXPECT_LT(*before_root_1, *middle_root_1); + EXPECT_GT(*before_paragraph_6, *before_inline_box_5); + EXPECT_LT(*before_paragraph_2, *before_inline_box_8); + + EXPECT_EQ(*middle_root_1, *before_paragraph_6); + EXPECT_EQ(*before_paragraph_6, *middle_root_1); + EXPECT_EQ(*middle_root_1, *before_inline_box_8); + EXPECT_EQ(*before_inline_box_8, *middle_root_1); + + EXPECT_GT(*middle_root_1, *after_paragraph_2); + EXPECT_LT(*after_paragraph_2, *middle_root_1); + EXPECT_GT(*middle_root_1, *after_inline_box_5); + EXPECT_LT(*after_inline_box_5, *middle_root_1); + + // An upstream affinity on the root before the second paragraph attaches the + // position to the end of the previous line, i.e. moves it to the end of the + // first paragraph. + EXPECT_LT(*middle_root_1_upstream, *middle_root_1); + EXPECT_EQ(*middle_root_1_upstream, *after_paragraph_2); + EXPECT_EQ(*after_paragraph_2, *middle_root_1_upstream); + EXPECT_EQ(*middle_root_1_upstream, *after_inline_box_5); + EXPECT_EQ(*after_inline_box_5, *middle_root_1_upstream); + + // According to the IAccessible2 Spec, a position inside an embedded object + // should be equivalent to a position right after it, if the former is not at + // the object's start. + EXPECT_EQ(*middle_root_1_upstream, *middle_inline_box_5); + EXPECT_EQ(*middle_inline_box_5, *middle_root_1_upstream); + + EXPECT_EQ(*after_root_1, *after_paragraph_6); + EXPECT_EQ(*after_paragraph_6, *after_root_1); + EXPECT_EQ(*after_root_1, *after_inline_box_8); + EXPECT_EQ(*after_inline_box_8, *after_root_1); + + // According to the IAccessible2 Spec, a position inside an embedded object + // should be equivalent to a position right after it, if the former is not at + // the object's start. + EXPECT_EQ(*after_root_1, *middle_inline_box_8); + EXPECT_EQ(*middle_inline_box_8, *after_root_1); +} + TEST_F(AXPositionTest, OperatorsLessThanAndGreaterThan) { TestPositionType null_position1 = AXNodePosition::CreateNullPosition(); ASSERT_NE(nullptr, null_position1);
diff --git a/ui/accessibility/ax_node_unittest.cc b/ui/accessibility/ax_node_unittest.cc new file mode 100644 index 0000000..ce7500e --- /dev/null +++ b/ui/accessibility/ax_node_unittest.cc
@@ -0,0 +1,125 @@ +// Copyright 2021 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 "ui/accessibility/ax_node.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/accessibility/ax_enums.mojom.h" +#include "ui/accessibility/ax_node_data.h" +#include "ui/accessibility/ax_tree.h" +#include "ui/accessibility/ax_tree_data.h" +#include "ui/accessibility/ax_tree_id.h" + +namespace ui { + +TEST(AXNodeTest, GetLowestPlatformAncestor) { + // ++kRootWebArea + // ++++kButton (IsLeaf=false) + // ++++++kGenericContainer ignored + // ++++++++kStaticText "Hello" + // ++++++++++kInlineTextBox "Hello" (IsLeaf=true) + // ++++kTextField "World" (IsLeaf=true) + // ++++++kStaticText "World" + // ++++++++kInlineTextBox "World" (IsLeaf=true) + AXNodeData root; + AXNodeData button; + AXNodeData generic_container; + AXNodeData static_text_1; + AXNodeData inline_box_1; + AXNodeData text_field; + AXNodeData static_text_2; + AXNodeData inline_box_2; + + root.id = 1; + button.id = 2; + generic_container.id = 3; + static_text_1.id = 4; + inline_box_1.id = 5; + text_field.id = 6; + static_text_2.id = 7; + inline_box_2.id = 8; + + root.role = ax::mojom::Role::kRootWebArea; + root.child_ids = {button.id, text_field.id}; + + button.role = ax::mojom::Role::kButton; + button.SetValue("Hello"); + button.child_ids = {generic_container.id}; + + generic_container.role = ax::mojom::Role::kGenericContainer; + generic_container.AddState(ax::mojom::State::kIgnored); + generic_container.child_ids = {static_text_1.id}; + + static_text_1.role = ax::mojom::Role::kStaticText; + static_text_1.SetName("Hello"); + static_text_1.child_ids = {inline_box_1.id}; + + inline_box_1.role = ax::mojom::Role::kInlineTextBox; + inline_box_1.SetName("Hello"); + + text_field.role = ax::mojom::Role::kTextField; + text_field.AddState(ax::mojom::State::kEditable); + text_field.AddBoolAttribute(ax::mojom::BoolAttribute::kEditableRoot, true); + text_field.SetValue("World"); + text_field.child_ids = {static_text_2.id}; + + static_text_2.role = ax::mojom::Role::kStaticText; + static_text_2.AddState(ax::mojom::State::kEditable); + static_text_2.SetName("World"); + static_text_2.child_ids = {inline_box_2.id}; + + inline_box_2.role = ax::mojom::Role::kInlineTextBox; + inline_box_2.AddState(ax::mojom::State::kEditable); + inline_box_2.SetName("World"); + + AXTreeUpdate initial_state; + initial_state.root_id = root.id; + initial_state.nodes = {root, button, generic_container, + static_text_1, inline_box_1, text_field, + static_text_2, inline_box_2}; + initial_state.has_tree_data = true; + + AXTreeData tree_data; + tree_data.tree_id = AXTreeID::CreateNewAXTreeID(); + tree_data.title = "Application"; + initial_state.tree_data = tree_data; + + AXTree tree; + ASSERT_TRUE(tree.Unserialize(initial_state)); + + const AXNode* root_node = tree.root(); + ASSERT_EQ(root.id, root_node->id()); + EXPECT_EQ(root_node, root_node->GetLowestPlatformAncestor()); + + const AXNode* button_node = root_node->children()[0]; + ASSERT_EQ(button.id, button_node->id()); + EXPECT_EQ(button_node, button_node->GetLowestPlatformAncestor()); + + const AXNode* generic_container_node = button_node->children()[0]; + ASSERT_EQ(generic_container.id, generic_container_node->id()); + EXPECT_EQ(button_node, generic_container_node->GetLowestPlatformAncestor()); + + const AXNode* static_text_1_node = generic_container_node->children()[0]; + ASSERT_EQ(static_text_1.id, static_text_1_node->id()); + EXPECT_EQ(static_text_1_node, + static_text_1_node->GetLowestPlatformAncestor()); + + const AXNode* inline_box_1_node = static_text_1_node->children()[0]; + ASSERT_EQ(inline_box_1.id, inline_box_1_node->id()); + EXPECT_EQ(static_text_1_node, inline_box_1_node->GetLowestPlatformAncestor()); + + const AXNode* text_field_node = root_node->children()[1]; + ASSERT_EQ(text_field.id, text_field_node->id()); + EXPECT_EQ(text_field_node, text_field_node->GetLowestPlatformAncestor()); + + const AXNode* static_text_2_node = text_field_node->children()[0]; + ASSERT_EQ(static_text_2.id, static_text_2_node->id()); + EXPECT_EQ(text_field_node, static_text_2_node->GetLowestPlatformAncestor()); + + const AXNode* inline_box_2_node = static_text_2_node->children()[0]; + ASSERT_EQ(inline_box_2.id, inline_box_2_node->id()); + EXPECT_EQ(text_field_node, inline_box_2_node->GetLowestPlatformAncestor()); +} + +} // namespace ui
diff --git a/ui/accessibility/ax_position.h b/ui/accessibility/ax_position.h index b5e5abf..9d3d8bab 100644 --- a/ui/accessibility/ax_position.h +++ b/ui/accessibility/ax_position.h
@@ -3202,23 +3202,15 @@ if (IsNullPosition() || other.IsNullPosition()) return base::nullopt; - // If both positions share an anchor and either one is a text position, or - // both are tree positions, we can do a straight comparison of text offsets - // or child indices. - if (GetAnchor() == other.GetAnchor()) { - if (IsTextPosition()) - return text_offset_ - other.AsTextPosition()->text_offset_; - if (other.IsTextPosition()) - return AsTextPosition()->text_offset_ - other.text_offset_; - - return child_index_ - other.child_index_; - } + if (GetAnchor() == other.GetAnchor()) + return SlowCompareTo(other); // No optimization is necessary. // Ancestor positions are expensive to compute. If possible, we will avoid // doing so by computing the ancestor chain of the two positions' anchors. // If the lowest common ancestor is neither position's anchor, we can use // the order of the first uncommon ancestors as a proxy for the order of the - // positions. + // positions. Obviously, this heuristic cannot be used if one position is + // the ancestor of the other. // // In order to do that, we need to normalize text positions at the end of an // anchor to equivalent positions at the start of the next anchor. Ignored @@ -3231,7 +3223,8 @@ return SlowCompareTo(other); // Normalize any text positions at the end of an anchor to equivalent - // positions at the start of the next anchor. + // positions at the start of the next anchor. This will potentially make the + // two positions not be ancestors of one another, if they originally were. AXPositionInstance normalized_this_position = Clone(); if (normalized_this_position->IsTextPosition()) { normalized_this_position = @@ -3247,22 +3240,25 @@ if (normalized_this_position->IsNullPosition()) { if (normalized_other_position->IsNullPosition()) { // Both positions normalized to a position past the end of the whole - // content. + // content. There is no way that they could be ancestors of one another, + // so using the slow path is not required. DCHECK_EQ(SlowCompareTo(other).value(), 0); return 0; } // |this| normalized to a position past the end of the whole content. - DCHECK_GT(SlowCompareTo(other).value(), 0); - return 1; + // Since we don't know if one position is the ancestor of the other, we + // need to use the slow path. + return SlowCompareTo(other); } if (normalized_other_position->IsNullPosition()) { // |other| normalized to a position past the end of the whole content. - DCHECK_LT(SlowCompareTo(other).value(), 0); - return -1; + // Since we don't know if one position is the ancestor of the other, we + // need to use the slow path. + return SlowCompareTo(other); } // Compute the ancestor stacks of both positions and walk them ourselves - // rather than calling LowestCommonAnchor(). That way, we can discover the + // rather than calling `LowestCommonAnchor`. That way, we can discover the // first uncommon ancestors which we need to use in order to compare the two // positions. const AXNodeType* common_anchor = nullptr; @@ -3356,14 +3352,13 @@ // change the outcome of the comparison. We also don't need to perform an // adjustment if one of the positions is not right after the "object // replacement character" representing the object inside which the other - // position is located, hence the "AtStartOfAnchor" checks. + // position is located, hence the `AtStartOfAnchor()` and + // `IsEmbeddedObjectInParent()` checks. if (abs(result) == 1 && ((IsTextPosition() && !AtStartOfAnchor() && - this_uncommon_tree_position->IsEmbeddedObjectInParent() && - other.AtStartOfAnchor()) || + this_uncommon_tree_position->IsEmbeddedObjectInParent()) || (other.IsTextPosition() && !other.AtStartOfAnchor() && - other_uncommon_tree_position->IsEmbeddedObjectInParent() && - AtStartOfAnchor()))) { + other_uncommon_tree_position->IsEmbeddedObjectInParent()))) { return SlowCompareTo(other); } @@ -3388,31 +3383,68 @@ if (IsNullPosition() || other.IsNullPosition()) return base::nullopt; + // If both positions share an anchor and either one is a text position, or + // both are tree positions, we can do a straight comparison of text offsets + // or child indices. + if (GetAnchor() == other.GetAnchor()) { + base::Optional<int> optional_result; + ax::mojom::TextAffinity this_affinity; + ax::mojom::TextAffinity other_affinity; + + if (IsTextPosition()) { + AXPositionInstance other_text_position = other.AsTextPosition(); + optional_result = text_offset_ - other_text_position->text_offset_; + this_affinity = affinity(); + other_affinity = other_text_position->affinity(); + } + + if (other.IsTextPosition()) { + AXPositionInstance this_text_position = AsTextPosition(); + optional_result = this_text_position->text_offset_ - other.text_offset_; + this_affinity = this_text_position->affinity(); + other_affinity = other.affinity(); + } + + if (optional_result) { + // Only when the two positions are otherwise equivalent will affinity + // play a role. + if (*optional_result != 0) + return optional_result; + + if (this_affinity == ax::mojom::TextAffinity::kUpstream && + other_affinity == ax::mojom::TextAffinity::kDownstream) { + return -1; + } + if (this_affinity == ax::mojom::TextAffinity::kDownstream && + other_affinity == ax::mojom::TextAffinity::kUpstream) { + return 1; + } + + return optional_result; + } + + return child_index_ - other.child_index_; + } + // It is potentially costly to compute the parent position of a text // position, whilst computing the parent position of a tree position is // really inexpensive. In order to find the lowest common ancestor position, // especially if that ancestor is all the way up to the root of the tree, // computing the parent position will need to be done repeatedly. We avoid // the performance hit by converting both positions to tree positions and - // only falling back to computing ancestor text positions if both are text - // positions, they don't have the same anchor and one is not an ancestor of - // the other. + // only falling back to computing ancestor text positions if at least one + // position is a text position and they don't have the same anchor. // // Essentially, the question we need to answer is: "When are two non // equivalent positions going to have the same lowest common ancestor - // position when converted to tree positions?" The answer is either when - // they have the same anchor and at least one is a text position, or when - // both are text positions and one is an ancestor position of the other. In - // all other cases, no information will be lost when converting to tree - // positions. - if (GetAnchor() == other.GetAnchor()) { - if (IsTextPosition()) - return text_offset_ - other.AsTextPosition()->text_offset_; - if (other.IsTextPosition()) - return AsTextPosition()->text_offset_ - other.text_offset_; - - return child_index_ - other.child_index_; - } + // position when converted to tree positions as the ones they had before the + // conversion?" In other words, when will + // "this->AsTreePosition()->LowestCommonAncestor(*other.AsTreePosition()) == + // other.AsTreePosition()->LowestCommonAncestor(*this->AsTreePosition())"? + // The answer is either when they have the same anchor and at least one is a + // text position, or when both are text positions and one is an ancestor + // position of the other. In all other cases, no information will be lost + // when converting to tree positions. const AXNodeType* common_anchor = this->LowestCommonAnchor(other); if (!common_anchor) @@ -3421,8 +3453,43 @@ // If either of the two positions is a text position, and if one position is // an ancestor of the other, we need to compare using text positions, // because converting to tree positions will potentially lose information if - // the text offset is anything other than 0 or "MaxTextOffset". + // the text offset is anything other than 0 or `MaxTextOffset()`. if (IsTextPosition() || other.IsTextPosition()) { + base::Optional<int> optional_result; + ax::mojom::TextAffinity this_affinity; + ax::mojom::TextAffinity other_affinity; + + // The following two "if" blocks deal with comparisons between a text + // position and a tree position that are ancestors of one another. The + // third "if" block deals with comparisons between two text positions that + // are also ancestors of one another. Obviously, in the case of two text + // positions, affinity could always play a role (see comment in the + // relevant "if" block for an example). For the first two cases, affinity + // still needs to be taken into consideration because an "object + // replacement character" could be used to represent child nodes in the + // text of their parents. Here is an example of how affinity can influence + // a text/tree position comparison. + // + // 1 kRootWebArea + // ++2 kGenericContainer + // "<embedded_object_character><embedded_object_character>" + // ++3 kButton "Line 1" + // ++++++4 kStaticText "Line 1" + // ++++++++5 kInlineTextBox "Line 1" + // ++++6 kImage "<embedded_object_character>" kIsLineBreakingObject + // + // TextPosition anchor_id=5 text_offset=2 affinity=downstream + // annotated_text=Li<n>e 1 + // + // TreePosition anchor_id=6 child_index=BEFORE_TEXT + // + // The `LowestCommonAncestor` for both will differ in its affinity: + // TextPosition anchor_id=2 text_offset=1 affinity=... + // annotated_text=embedded_object_character<embedded_object_character> + // + // The text position would create a kUpstream position, while the tree + // position would create a kDownstream position. + if (GetAnchor() == common_anchor) { DCHECK_EQ(AsTextPosition()->GetAnchor(), common_anchor) << "AsTextPosition() should never modify the position's anchor."; @@ -3436,16 +3503,20 @@ // one after it would compare as equivalent. Otherwise, screen readers // might get stuck inside embedded objects while navigating by character // or word. For some reproduction steps see https://crbug.com/1057831. - // Per the IA2 Spec, any selection that partially selects text inside an - // embedded object, should select the entire "object replacement - // character" in the parent object where the character appears. + // Per the IAccessible2 Spec, any selection that partially selects text + // inside an embedded object, should select the entire "object + // replacement character" in the parent object where the character + // appears. AXPositionInstance other_text_position = other.AsTextPosition()->CreateAncestorPosition( common_anchor, ax::mojom::MoveDirection::kForward); DCHECK_EQ(other_text_position->GetAnchor(), common_anchor); - return AsTextPosition()->text_offset_ - - other_text_position->text_offset_; + other_affinity = other_text_position->affinity(); + AXPositionInstance this_text_position = AsTextPosition(); + this_affinity = this_text_position->affinity(); + optional_result = this_text_position->text_offset() - + other_text_position->text_offset(); } if (other.GetAnchor() == common_anchor) { @@ -3461,100 +3532,130 @@ // would compare as equivalent. Otherwise, screen readers might get // stuck inside embedded objects while navigating by character or word. // For some reproduction steps see https://crbug.com/1057831. - // Per the IA2 Spec, any selection that partially selects text inside an - // embedded object, should select the entire "object replacement - // character" in the parent object where the character appears. + // Per the IAccessible2 Spec, any selection that partially selects text + // inside an embedded object, should select the entire "object + // replacement character" in the parent object where the character + // appears. AXPositionInstance this_text_position = AsTextPosition()->CreateAncestorPosition( common_anchor, ax::mojom::MoveDirection::kForward); DCHECK_EQ(this_text_position->GetAnchor(), common_anchor); - return this_text_position->text_offset_ - - other.AsTextPosition()->text_offset_; + this_affinity = this_text_position->affinity(); + AXPositionInstance other_text_position = other.AsTextPosition(); + other_affinity = other_text_position->affinity(); + optional_result = this_text_position->text_offset() - + other_text_position->AsTextPosition()->text_offset(); } - } - if (IsTextPosition() && other.IsTextPosition()) { - // All optimizations failed: We should compute and compare using the - // common ancestor text position. Computing an ancestor text position will - // automatically take affinity into consideration. It will also normalize - // text positions at the end of their anchors to equivalent positions at - // the start of the next anchor. It would also normalize positions within - // "object replacement characters" to after the character. This would - // maintain the characteristics of text position comparisons, since a - // particular offset in the tree's text representation could refer to - // multiple equivalent positions anchored to different nodes in the tree. - // - // Here is an example of how affinity can influence a text position - // comparison when at a line boundary: - // - // 1 kRootWebArea - // ++2 kTextField "Line 1Line 2" - // ++++3 kStaticText "Line 1" - // ++++++4 kInlineTextBox "Line 1" - // ++++5 kGenericContainer kIsLineBreakingObject - // ++++++6 kStaticText "Line 2" - // ++++++++7 kInlineTextBox "Line 2" - // - // TextPosition anchor_id=4 text_offset=6 - // affinity=downstream annotated_text=Line 1<> - // - // TextPosition anchor_id=7 text_offset=0 - // affinity=downstream annotated_text=<L>ine 2 - // - // |LowestCommonAncestor| for both will be : - // TextPosition anchor_id=2 text_offset=6 - // affinity=... annotated_text=Line 1<L>ine 2 - // - // anchor_id=4 creates a kUpstream position, while - // anchor_id=7 creates a kDownstream position. + if (IsTextPosition() && other.IsTextPosition()) { + // We should compute and compare using the common ancestor text + // position. Computing an ancestor text position will automatically take + // affinity into consideration. It will also normalize text positions at + // the end of their anchors to equivalent positions at the start of the + // next anchor. Additionally, it would normalize positions within + // "object replacement characters" to after the character. This would + // maintain the characteristics of text position comparisons, since a + // particular offset in the tree's text representation could refer to + // multiple equivalent positions anchored to different nodes in the + // tree. + // + // Here is an example of how affinity can influence a text position + // comparison when at a line boundary: + // + // 1 kRootWebArea + // ++2 kTextField "Line 1Line 2" + // ++++3 kStaticText "Line 1" + // ++++++4 kInlineTextBox "Line 1" + // ++++5 kGenericContainer kIsLineBreakingObject + // ++++++6 kStaticText "Line 2" + // ++++++++7 kInlineTextBox "Line 2" + // + // TextPosition anchor_id=4 text_offset=6 affinity=downstream + // annotated_text=Line 1<> + // + // TextPosition anchor_id=7 text_offset=0 affinity=downstream + // annotated_text=<L>ine 2 + // + // The `LowestCommonAncestor` for both will differ only in its affinity: + // TextPosition anchor_id=2 text_offset=6 affinity=... + // annotated_text=Line 1<L>ine 2 + // + // anchor_id=4 would create a kUpstream position, while anchor_id=7 + // would create a kDownstream position. - AXPositionInstance this_text_position_ancestor = - LowestCommonAncestor(other, ax::mojom::MoveDirection::kForward); - AXPositionInstance other_text_position_ancestor = - other.LowestCommonAncestor(*this, ax::mojom::MoveDirection::kForward); - // TODO(nektar): Fix failing DCHECK in a followup. - // DCHECK(this_text_position_ancestor->IsTextPosition()); - // DCHECK(other_text_position_ancestor->IsTextPosition()); + AXPositionInstance this_text_position_ancestor = + LowestCommonAncestor(other, ax::mojom::MoveDirection::kForward); + AXPositionInstance other_text_position_ancestor = + other.LowestCommonAncestor(*this, + ax::mojom::MoveDirection::kForward); + DCHECK(this_text_position_ancestor->IsTextPosition()); + DCHECK(other_text_position_ancestor->IsTextPosition()); - int result = this_text_position_ancestor->text_offset_ - - other_text_position_ancestor->text_offset_; - // Only when the two text positions are otherwise equivalent will affinity - // play a role. - if (result == 0) { - if (this_text_position_ancestor->affinity_ == - ax::mojom::TextAffinity::kUpstream && - other_text_position_ancestor->affinity_ == - ax::mojom::TextAffinity::kDownstream) { + this_affinity = this_text_position_ancestor->affinity(); + other_affinity = other_text_position_ancestor->affinity(); + optional_result = this_text_position_ancestor->text_offset() - + other_text_position_ancestor->text_offset(); + } + + if (optional_result) { + // Only when the two positions are otherwise equivalent will affinity + // play a role. + if (*optional_result != 0) + return optional_result; + + if (this_affinity == ax::mojom::TextAffinity::kUpstream && + other_affinity == ax::mojom::TextAffinity::kDownstream) { return -1; } - if (this_text_position_ancestor->affinity_ == - ax::mojom::TextAffinity::kDownstream && - other_text_position_ancestor->affinity_ == - ax::mojom::TextAffinity::kUpstream) { + if (this_affinity == ax::mojom::TextAffinity::kDownstream && + other_affinity == ax::mojom::TextAffinity::kUpstream) { return 1; } + + return optional_result; } - return result; } // Either position is a tree position. To avoid a performance hit, we should // handle comparison by converting both positions to tree positions. Such a // conversion is valid because no information regarding the text offset - // would be needed for carrying out the comparison when the two positions - // are not ancestors of one another and when either one is a tree position. + // would be needed for carrying out the comparison when at least one of the + // positions is a tree position. // // We should also normalize all tree positions to the beginning of their - // anchors. Unlike text positions, two tree positions on two adjacent - // anchors, (the first position at the end of its anchor and the other at - // its beginning), should not compare as equal. This is because each - // position in the tree is unique, unlike an offset in the tree's text - // representation which can refer to more than one tree position. + // anchors, unless one of the positions is the ancestor of the other. In the + // latter case, such a normalization would potentially lose information if + // performed on any of the two positions. + // ++kRootWebArea "<embedded_object><embedded_object>" + // ++++kParagraph "Paragraph1" + // ++++kParagraph "paragraph2" + // A tree position at the end of the root web area and a tree position at + // the end of the second paragraph should compare as equal. Normalizing any + // of the two positions to the start of their respective anchors would make + // the two positions unequal. + // + // Unlike text positions, two tree positions on two adjacent anchors, (the + // first position at the end of its anchor, (i.e. an "after children" + // position), and the other at its beginning), should not compare as equal. + // This is because each position in the tree is unique, unlike an offset in + // the tree's text representation which can refer to more than one tree + // position. Meanwhile, affinity does not play any role in this case, since + // except for "after children" positions, tree positions are collapsed to + // the beginning of their parent node when computing their parent position. - AXPositionInstance this_normalized_tree_position = - AsTreePosition()->CreatePositionAtStartOfAnchor(); - AXPositionInstance other_normalized_tree_position = - other.AsTreePosition()->CreatePositionAtStartOfAnchor(); + AXPositionInstance this_normalized_tree_position = AsTreePosition(); + AXPositionInstance other_normalized_tree_position = other.AsTreePosition(); + if (GetAnchor() != common_anchor && + other_normalized_tree_position->GetAnchor() != common_anchor) { + // None of the positions is the ancestor of the other, so normalization + // could go ahead. + this_normalized_tree_position = + this_normalized_tree_position->CreatePositionAtStartOfAnchor(); + other_normalized_tree_position = + other_normalized_tree_position->CreatePositionAtStartOfAnchor(); + } + AXPositionInstance this_tree_position_ancestor = this_normalized_tree_position->CreateAncestorPosition( common_anchor, ax::mojom::MoveDirection::kBackward); @@ -4672,7 +4773,7 @@ // Cached members that should be lazily created on first use. // - // In the case of a leaf position, the name of its anchor used for + // In the case of a leaf position, its inner text (in UTF16 format). Used for // initializing a grapheme break iterator. mutable base::string16 name_; };
diff --git a/ui/accessibility/ax_range_unittest.cc b/ui/accessibility/ax_range_unittest.cc index 386971d..73c897c 100644 --- a/ui/accessibility/ax_range_unittest.cc +++ b/ui/accessibility/ax_range_unittest.cc
@@ -422,7 +422,7 @@ TestPositionRange tree_to_tree_range(tree_position2->Clone(), tree_position1->Clone()); - EXPECT_TRUE(tree_to_tree_range.IsCollapsed()); + EXPECT_FALSE(tree_to_tree_range.IsCollapsed()); // A tree and a text position that essentially point to the same text offset // are equivalent, even if they are anchored to a different node.
diff --git a/ui/accessibility/platform/ax_platform_node_delegate.h b/ui/accessibility/platform/ax_platform_node_delegate.h index 28ba415..7ff4ebc 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate.h +++ b/ui/accessibility/platform/ax_platform_node_delegate.h
@@ -95,7 +95,7 @@ // Get the unignored selection from the tree, meaning the selection whose // endpoints are on unignored nodes. (An ignored node means that the node - // should not be exposed to platform APIs: See "IsInvisibleOrIgnored".) + // should not be exposed to platform APIs: See `IsInvisibleOrIgnored`.) virtual const AXTree::Selection GetUnignoredSelection() const = 0; // Creates a text position rooted at this object. @@ -124,7 +124,7 @@ // should return the number of unignored children. All ignored nodes are // recursively removed from the children count. (An ignored node means that // the node should not be exposed to platform APIs: See - // "IsInvisibleOrIgnored".) + // `IsInvisibleOrIgnored`.) virtual int GetChildCount() const = 0; // Get a child of a node given a 0-based index. @@ -132,7 +132,7 @@ // Note that for accessibility trees that have ignored nodes, this method // returns only unignored children. All ignored nodes are recursively removed. // (An ignored node means that the node should not be exposed to platform - // APIs: See "IsInvisibleOrIgnored".) + // APIs: See `IsInvisibleOrIgnored`.) virtual gfx::NativeViewAccessible ChildAtIndex(int index) = 0; // Returns true if it has a modal dialog. @@ -178,9 +178,12 @@ virtual bool IsToplevelBrowserWindow() = 0; // If this object is exposed to the platform's accessibility layer, returns - // this object. Otherwise, returns the platform leaf under which this object - // is found. - virtual gfx::NativeViewAccessible GetClosestPlatformObject() const = 0; + // this object. Otherwise, returns the platform leaf or lowest unignored + // ancestor under which this object is found. + // + // (An ignored node means that the node should not be exposed to platform + // APIs: See `IsInvisibleOrIgnored`.) + virtual gfx::NativeViewAccessible GetLowestPlatformAncestor() const = 0; class ChildIterator { public:
diff --git a/ui/accessibility/platform/ax_platform_node_delegate_base.cc b/ui/accessibility/platform/ax_platform_node_delegate_base.cc index e8f3150..71121a9 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate_base.cc +++ b/ui/accessibility/platform/ax_platform_node_delegate_base.cc
@@ -176,9 +176,38 @@ return false; } -gfx::NativeViewAccessible AXPlatformNodeDelegateBase::GetClosestPlatformObject() - const { - return nullptr; +gfx::NativeViewAccessible +AXPlatformNodeDelegateBase::GetLowestPlatformAncestor() const { + AXPlatformNodeDelegateBase* current_delegate = + const_cast<AXPlatformNodeDelegateBase*>(this); + AXPlatformNodeDelegateBase* lowest_unignored_delegate = current_delegate; + if (lowest_unignored_delegate->IsInvisibleOrIgnored()) { + lowest_unignored_delegate = static_cast<AXPlatformNodeDelegateBase*>( + lowest_unignored_delegate->GetParentDelegate()); + } + DCHECK(!lowest_unignored_delegate || + !lowest_unignored_delegate->IsInvisibleOrIgnored()) + << "`AXPlatformNodeDelegateBase::GetParentDelegate()` should return " + "either an unignored object or nullptr."; + + // `highest_leaf_delegate` could be nullptr. + AXPlatformNodeDelegateBase* highest_leaf_delegate = lowest_unignored_delegate; + // For the purposes of this method, a leaf node does not include leaves in the + // internal accessibility tree, only in the platform exposed tree. + for (AXPlatformNodeDelegateBase* ancestor_delegate = + lowest_unignored_delegate; + ancestor_delegate; + ancestor_delegate = static_cast<AXPlatformNodeDelegateBase*>( + ancestor_delegate->GetParentDelegate())) { + if (ancestor_delegate->IsLeaf()) + highest_leaf_delegate = ancestor_delegate; + } + if (highest_leaf_delegate) + return highest_leaf_delegate->GetNativeViewAccessible(); + + if (lowest_unignored_delegate) + return lowest_unignored_delegate->GetNativeViewAccessible(); + return current_delegate->GetNativeViewAccessible(); } AXPlatformNodeDelegateBase::ChildIteratorBase::ChildIteratorBase(
diff --git a/ui/accessibility/platform/ax_platform_node_delegate_base.h b/ui/accessibility/platform/ax_platform_node_delegate_base.h index 04c4194..4eb0722 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate_base.h +++ b/ui/accessibility/platform/ax_platform_node_delegate_base.h
@@ -76,7 +76,7 @@ bool IsLeaf() const override; bool IsFocused() const override; bool IsToplevelBrowserWindow() override; - gfx::NativeViewAccessible GetClosestPlatformObject() const override; + gfx::NativeViewAccessible GetLowestPlatformAncestor() const override; class ChildIteratorBase : public ChildIterator { public:
diff --git a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc index 3a79fcf..a2ca025 100644 --- a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc +++ b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
@@ -56,7 +56,8 @@ class AXRangePhysicalPixelRectDelegate : public AXRangeRectDelegate { public: - AXRangePhysicalPixelRectDelegate(AXPlatformNodeTextRangeProviderWin* host) + explicit AXRangePhysicalPixelRectDelegate( + AXPlatformNodeTextRangeProviderWin* host) : host_(host) {} gfx::Rect GetInnerTextRangeBoundsRect( @@ -519,13 +520,12 @@ delegate->GetFromNodeID(it->anchor_id())); DCHECK(platform_node); - // Only get attributes for nodes in the tree - if (platform_node->GetDelegate()->IsChildOfLeaf()) { - platform_node = static_cast<AXPlatformNodeWin*>( - AXPlatformNode::FromNativeViewAccessible( - platform_node->GetDelegate()->GetClosestPlatformObject())); - DCHECK(platform_node); - } + // Only get attributes for nodes in the tree. Exclude descendants of leaves + // and ignored objects. + platform_node = static_cast<AXPlatformNodeWin*>( + AXPlatformNode::FromNativeViewAccessible( + platform_node->GetDelegate()->GetLowestPlatformAncestor())); + DCHECK(platform_node); base::win::VariantVector current_value; const bool at_end_leaf_text_anchor =
diff --git a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc index 5e07fac..3db246b 100644 --- a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc
@@ -5516,10 +5516,8 @@ EXPECT_FALSE(normalized_start->IsIgnored()); EXPECT_FALSE(normalized_end->IsIgnored()); - // TODO(nektar): Re-enable the following two assertions after - // AXPosition::SlowCompareTo has been fixed to handle affinity correctly. - // EXPECT_LE(*GetStart(ignored_range_win.Get()), *normalized_start); - // EXPECT_LE(*GetEnd(ignored_range_win.Get()), *normalized_end); + EXPECT_LE(*GetStart(ignored_range_win.Get()), *normalized_start); + EXPECT_LE(*GetEnd(ignored_range_win.Get()), *normalized_end); EXPECT_LE(*normalized_start, *normalized_end); // Remove the last node, forcing |NormalizeTextRange| to normalize
diff --git a/ui/android/java/src/org/chromium/ui/base/LocalizationUtils.java b/ui/android/java/src/org/chromium/ui/base/LocalizationUtils.java index 5d1f2549..652118e 100644 --- a/ui/android/java/src/org/chromium/ui/base/LocalizationUtils.java +++ b/ui/android/java/src/org/chromium/ui/base/LocalizationUtils.java
@@ -78,6 +78,10 @@ return LocalizationUtilsJni.get().getFirstStrongCharacterDirection(string); } + public static String getNativeUiLocale() { + return LocalizationUtilsJni.get().getNativeUiLocale(); + } + public static String substituteLocalePlaceholder(String str) { return str.replace("$LOCALE", LocaleUtils.getDefaultLocaleString().replace('-', '_')); } @@ -125,5 +129,6 @@ @NativeMethods interface Natives { int getFirstStrongCharacterDirection(String string); + String getNativeUiLocale(); } }
diff --git a/ui/android/java/src/org/chromium/ui/base/ResourceBundle.java b/ui/android/java/src/org/chromium/ui/base/ResourceBundle.java index 525308b..14be47e 100644 --- a/ui/android/java/src/org/chromium/ui/base/ResourceBundle.java +++ b/ui/android/java/src/org/chromium/ui/base/ResourceBundle.java
@@ -7,6 +7,7 @@ import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; +import org.chromium.base.BundleUtils; import org.chromium.base.ContextUtils; import org.chromium.base.LocaleUtils; import org.chromium.base.Log; @@ -64,6 +65,20 @@ } /** + * Return the list of available locales. For bundle builds this is the uncompressed locales list + * and for apk builds this is the compressed locales list. + * @return The correct locale list for this build. + */ + public static String[] getAvailableLocales() { + assert sCompressedLocales != null; + assert sUncompressedLocales != null; + if (BundleUtils.isBundle()) { + return sUncompressedLocales; + } + return sCompressedLocales; + } + + /** * Return the location of a locale-specific uncompress .pak file asset. * * @param locale Chromium locale name.
diff --git a/ui/base/l10n/l10n_util_android.cc b/ui/base/l10n/l10n_util_android.cc index 9d3ce2a1..4a509df 100644 --- a/ui/base/l10n/l10n_util_android.cc +++ b/ui/base/l10n/l10n_util_android.cc
@@ -12,9 +12,7 @@ #include "base/check.h" #include "base/i18n/rtl.h" #include "base/strings/string_util.h" -#include "base/time/time.h" #include "third_party/icu/source/common/unicode/uloc.h" -#include "ui/base/l10n/time_format.h" #include "ui/base/ui_base_jni_headers/LocalizationUtils_jni.h" using base::android::JavaParamRef; @@ -96,16 +94,12 @@ return ConvertJavaStringToUTF16(java_result); } -ScopedJavaLocalRef<jstring> JNI_LocalizationUtils_GetDurationString( - JNIEnv* env, - jlong timeInMillis) { - ScopedJavaLocalRef<jstring> jtime_remaining = - base::android::ConvertUTF16ToJavaString( - env, - ui::TimeFormat::Simple( - ui::TimeFormat::FORMAT_REMAINING, ui::TimeFormat::LENGTH_SHORT, - base::TimeDelta::FromMilliseconds(timeInMillis))); - return jtime_remaining; +ScopedJavaLocalRef<jstring> JNI_LocalizationUtils_GetNativeUiLocale( + JNIEnv* env) { + ScopedJavaLocalRef<jstring> native_ui_locale_string = + base::android::ConvertUTF8ToJavaString(env, + base::i18n::GetConfiguredLocale()); + return native_ui_locale_string; } } // namespace l10n_util
diff --git a/ui/chromeos/file_manager_strings.grdp b/ui/chromeos/file_manager_strings.grdp index cc44959..01bd80b 100644 --- a/ui/chromeos/file_manager_strings.grdp +++ b/ui/chromeos/file_manager_strings.grdp
@@ -1159,7 +1159,7 @@ To save these files for offline use, get back online, right-click the files, and select the <ph name="OFFLINE_CHECKBOX_NAME">'$1'<ex>'Available offline'</ex></ph> option. </message> <message name="IDS_FILE_BROWSER_OFFLINE_BANNER_MESSAGE" desc="Message informing the user that they can make files available offline."> - You can make files available offline for access when you don't have internet connection. + You can make files available offline for access when you don't have an internet connection. </message> <message name="IDS_FILE_BROWSER_OFFLINE_PROGRESS_MESSAGE" desc="Message informing the user a Google Drive file is being downloaded for offline use."> Making <ph name="FILE_NAME">$1<ex>document.pdf</ex></ph> available offline @@ -1167,6 +1167,9 @@ <message name="IDS_FILE_BROWSER_OFFLINE_PROGRESS_MESSAGE_PLURAL" desc="Message informing the user multiple Google Drive files are being downloaded for offline use."> Making <ph name="NUMBER_OF_ITEMS">$1<ex>3</ex></ph> files available offline </message> + <message name="IDS_FILE_BROWSER_OFFLINE_FAILURE_MESSAGE" desc="Message informing the user a Google Drive file failed to be downloaded for offline use."> + Could not make <ph name="FILE_NAME">$1<ex>document.pdf</ex></ph> available offline + </message> <message name="IDS_FILE_BROWSER_OFFLINE_ENABLE_MESSAGE" desc="Message informing the user that in order to make Docs, Sheets and Slides files available offline, they must enable Google Docs Offline."> Enable Google Docs Offline to make Docs, Sheets and Slides available offline. </message>
diff --git a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_OFFLINE_BANNER_MESSAGE.png.sha1 b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_OFFLINE_BANNER_MESSAGE.png.sha1 index 2306cd9..f6be8810 100644 --- a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_OFFLINE_BANNER_MESSAGE.png.sha1 +++ b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_OFFLINE_BANNER_MESSAGE.png.sha1
@@ -1 +1 @@ -1088d06b10489a0585e87d0ee5a38661b1330cd4 \ No newline at end of file +d98f4d0b3c5a5f956e95b056857014326a0aeb89 \ No newline at end of file
diff --git a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_OFFLINE_FAILURE_MESSAGE.png.sha1 b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_OFFLINE_FAILURE_MESSAGE.png.sha1 new file mode 100644 index 0000000..d033c27 --- /dev/null +++ b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_OFFLINE_FAILURE_MESSAGE.png.sha1
@@ -0,0 +1 @@ +ae2a9622ed6704f20046a0d6c770f6f927a95429 \ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb index f003f96..c9b1628 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb
@@ -162,7 +162,7 @@ <translation id="2781645665747935084">Belgikarra</translation> <translation id="2782104745158847185">Errore bat gertatu da Linux aplikazioa instalatzean</translation> <translation id="2787047795752739979">Gainidatzi jatorrizkoa</translation> -<translation id="2830077785865012357">Txinatarra (zhuyin)</translation> +<translation id="2830077785865012357">Txinatarra (zhuyina)</translation> <translation id="2843806747483486897">Aldatu ekintza lehenetsia…</translation> <translation id="2850124913210091882">Egin babeskopia</translation> <translation id="2873951654529031587">Zaborrontzia</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb index 477f10a..27f45e0 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
@@ -501,7 +501,7 @@ <translation id="6227235786875481728">Fail ini tidak dapat dimainkan.</translation> <translation id="6241349547798190358">Belanda (Belgium)</translation> <translation id="6248400709929739064">Dayakan sari kata</translation> -<translation id="6269630227984243955">Melayu</translation> +<translation id="6269630227984243955">Bahasa Melayu</translation> <translation id="6287852322318138013">Pilih apl untuk membuka fail ini</translation> <translation id="6339145975392024142">Antarabangsa AS (PC)</translation> <translation id="6346310558342052870">Akses terhad</translation>
diff --git a/ui/file_manager/file_manager/foreground/js/actions_model.js b/ui/file_manager/file_manager/foreground/js/actions_model.js index 1e7c957..7b000d1 100644 --- a/ui/file_manager/file_manager/foreground/js/actions_model.js +++ b/ui/file_manager/file_manager/foreground/js/actions_model.js
@@ -299,13 +299,11 @@ }, // Show an error. + // TODO(crbug.com/1138744): Migrate this error message to a visual signal. showError: size => { - this.ui_.alertDialog.showHtml( - str('DRIVE_OUT_OF_SPACE_HEADER'), - strf( - 'DRIVE_OUT_OF_SPACE_MESSAGE', unescape(currentEntry.name), - util.bytesToString(size)), - null, null, null); + this.ui_.alertDialog.show( + strf('OFFLINE_FAILURE_MESSAGE', unescape(currentEntry.name)), null, + null, null); } }; steps.start();
diff --git a/ui/file_manager/integration_tests/file_manager/files_tooltip.js b/ui/file_manager/integration_tests/file_manager/files_tooltip.js index 0818add..6c54ea25 100644 --- a/ui/file_manager/integration_tests/file_manager/files_tooltip.js +++ b/ui/file_manager/integration_tests/file_manager/files_tooltip.js
@@ -53,40 +53,61 @@ } /** + * Waits until the element by |id| is the document.activeElement. + * + * @param {string} appId The Files app windowId. + * @param {string} id The element id. + * @return {!Promise} + */ + function getActiveElementById(appId, id) { + const caller = getCaller(); + return repeatUntil(async () => { + const element = + await remoteCall.callRemoteTestUtil('getActiveElement', appId, []); + if (!element || element.attributes['id'] !== id) { + return pending(caller, 'Waiting for active element by id #%s.', id); + } + }); + } + + /** * Tests that tooltip is displayed when focusing an element with tooltip. */ testcase.filesTooltipFocus = async () => { const appId = await setupAndWaitUntilReady( RootPath.DOWNLOADS, [ENTRIES.beautiful], []); - // Focus a button with tooltip. - let tooltip = await remoteCall.waitForElement(appId, tooltipQueryHidden); + // Check: initially the tooltip should be hidden. + await remoteCall.waitForElement(appId, tooltipQueryHidden); + + // Focus a button with a tooltip: the search button. chrome.test.assertTrue( await remoteCall.callRemoteTestUtil('focus', appId, [searchButton])); + await getActiveElementById(appId, 'search-button'); - // The tooltip should be visible. + // Check: the search button tooltip should be visible. let expectedLabelText = await getExpectedLabelText('SEARCH_TEXT_LABEL'); - tooltip = await remoteCall.waitForElement(appId, tooltipQueryVisible); let label = await remoteCall.waitForElement(appId, [tooltipQueryVisible, '#label']); chrome.test.assertEq(expectedLabelText, label.text); - // Focus another button with tooltip. + // Focus another button that has a tooltip: the view button. chrome.test.assertTrue( await remoteCall.callRemoteTestUtil('focus', appId, [viewButton])); + await getActiveElementById(appId, 'view-button'); - // The tooltip should be visible. - tooltip = await remoteCall.waitForElement(appId, tooltipQueryVisible); + // Check: the view button tooltip should be visible. label = await remoteCall.waitForElement(appId, [tooltipQueryVisible, '#label']); chrome.test.assertEq('Switch to thumbnail view', label.text); - // Focus an element without tooltip. + // Focus an element that has no tooltip: the file-list. chrome.test.assertTrue( await remoteCall.callRemoteTestUtil('focus', appId, [fileList])); + await getActiveElementById(appId, 'file-list'); - // The tooltip should be hidden. - tooltip = await remoteCall.waitForElement(appId, tooltipQueryHidden); + // Check: the tooltip should hide. + await remoteCall.waitForElement(appId, tooltipQueryHidden); // Select all the files to enable the cancel selection button. const ctrlA = ['#file-list', 'a', true, false, false]; @@ -95,11 +116,11 @@ // Focus the cancel selection button. chrome.test.assertTrue( await remoteCall.callRemoteTestUtil('focus', appId, [cancelButton])); + await getActiveElementById(appId, 'cancel-selection-button'); - // The tooltip should be visible. + // Check: the cancel selection button tooltip should be visible. expectedLabelText = await getExpectedLabelText('CANCEL_SELECTION_BUTTON_LABEL'); - tooltip = await remoteCall.waitForElement(appId, tooltipQueryVisible); label = await remoteCall.waitForElement(appId, [tooltipQueryVisible, '#label']); chrome.test.assertEq(expectedLabelText, label.text); @@ -183,31 +204,25 @@ const appId = await setupAndWaitUntilReady( RootPath.DOWNLOADS, [ENTRIES.beautiful], []); - // Hover a button with tooltip. - let tooltip = await remoteCall.waitForElement(appId, tooltipQueryHidden); + // Check: initially the tooltip should be hidden. + await remoteCall.waitForElement(appId, tooltipQueryHidden); + + // Hover over a button that has a tooltip: the search button. chrome.test.assertTrue(await remoteCall.callRemoteTestUtil( 'fakeMouseOver', appId, [searchButton])); - // The tooltip should be visible. + // Check: the search button tooltip should be visible. const expectedLabelText = await getExpectedLabelText('SEARCH_TEXT_LABEL'); - tooltip = await remoteCall.waitForElement(appId, tooltipQueryVisible); const label = await remoteCall.waitForElement(appId, [tooltipQueryVisible, '#label']); chrome.test.assertEq(expectedLabelText, label.text); - // Hover an element with tooltip. - chrome.test.assertTrue(await remoteCall.callRemoteTestUtil( - 'fakeMouseOver', appId, [searchButton])); - - // The tooltip should be visible. - tooltip = await remoteCall.waitForElement(appId, tooltipQueryVisible); - - // Click on body to hide tooltip. + // Click the body element. chrome.test.assertTrue( await remoteCall.callRemoteTestUtil('fakeMouseClick', appId, ['body'])); - // The tooltip should be hidden. - tooltip = await remoteCall.waitForElement(appId, tooltipQueryHidden); + // Check: the tooltip should hide. + await remoteCall.waitForElement(appId, tooltipQueryHidden); }; /**
diff --git a/ui/message_center/views/notification_header_view.cc b/ui/message_center/views/notification_header_view.cc index 12a88815..aa11b20 100644 --- a/ui/message_center/views/notification_header_view.cc +++ b/ui/message_center/views/notification_header_view.cc
@@ -27,6 +27,8 @@ #include "ui/views/controls/label.h" #include "ui/views/layout/flex_layout.h" #include "ui/views/layout/flex_layout_types.h" +#include "ui/views/metadata/metadata_header_macros.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/painter.h" #include "ui/views/view_class_properties.h" @@ -75,6 +77,7 @@ // takes tab focus for accessibility purpose. class ExpandButton : public views::ImageView { public: + METADATA_HEADER(ExpandButton); ExpandButton(); ~ExpandButton() override; @@ -125,6 +128,9 @@ node_data->SetName(GetTooltipText(gfx::Point())); } +BEGIN_METADATA(ExpandButton, views::ImageView) +END_METADATA + gfx::FontList GetHeaderTextFontList() { gfx::Font default_font; int font_size_delta = kHeaderTextFontSize - default_font.GetFontSize();
diff --git a/ui/native_theme/native_theme_base.cc b/ui/native_theme/native_theme_base.cc index 3f4472ed..99b4081 100644 --- a/ui/native_theme/native_theme_base.cc +++ b/ui/native_theme/native_theme_base.cc
@@ -221,7 +221,7 @@ switch (part) { case kCheckbox: - return 2.f * zoom; + return 2.f; case kPushButton: case kTextField: return 2.f;
diff --git a/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.html b/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.html index b976a79b..6c18eb2 100644 --- a/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.html +++ b/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.html
@@ -66,6 +66,26 @@ </span> </div> </template> + <template is="dom-if" if="[[network.ipv4Address]]"> + <div class="network-attribute-container"> + <div class="network-attribute-label"> + [[i18n('OncIpv4Address')]] + </div> + <span class="network-attribute-value"> + [[network.ipv4Address]] + </span> + </div> + </template> + <template is="dom-if" if="[[network.ipv6Addresses.length]]"> + <div class="network-attribute-container"> + <div class="network-attribute-label"> + [[i18n('OncIpv6Address')]] + </div> + <span class="network-attribute-value"> + [[network.ipv6Addresses.join(', ')]] + </span> + </div> + </template> <template is="dom-if" if="[[network.macAddress]]"> <div class="network-attribute-container"> <div class="network-attribute-label">
diff --git a/ui/webui/resources/html/test_loader.html b/ui/webui/resources/html/test_loader.html index 6c6de11..9eb3d48 100644 --- a/ui/webui/resources/html/test_loader.html +++ b/ui/webui/resources/html/test_loader.html
@@ -3,7 +3,7 @@ <body> <script src="chrome://test/mocha.js"></script> <script src="chrome://test/mocha_adapter.js"></script> - <script src="test_loader.js"></script> + <script type="module" src="test_loader.js"></script> </body> </html>
diff --git a/ui/webui/resources/js/BUILD.gn b/ui/webui/resources/js/BUILD.gn index 9f2ed01..b4dd498 100644 --- a/ui/webui/resources/js/BUILD.gn +++ b/ui/webui/resources/js/BUILD.gn
@@ -53,6 +53,7 @@ "plural_string_proxy.js", "promise_resolver.js", "test_loader.js", + "test_loader_util.js", "util.js", "webui_resource_test.js", ]
diff --git a/ui/webui/resources/js/cr/ui/dialogs.js b/ui/webui/resources/js/cr/ui/dialogs.js index 6c17b44d..fdc55c2 100644 --- a/ui/webui/resources/js/cr/ui/dialogs.js +++ b/ui/webui/resources/js/cr/ui/dialogs.js
@@ -18,6 +18,18 @@ // so we can restore it when we're hidden. this.previousActiveElement_ = null; + /** + * If set true, BaseDialog assumes that focus traversal of elements inside + * the dialog due to 'Tab' key events is handled by its container (and the + * practical example is this.parentNode_ is a modal <dialog> element). + * + * The default is false: BaseDialog handles focus traversal for the entire + * DOM document. See findFocusableElements_(), also crbug.com/1078300. + * + * @protected {boolean} + */ + this.hasModalContainer = false; + /** @private{boolean} */ this.showing_ = false; @@ -245,14 +257,21 @@ BaseDialog.prototype.show_ = function( title, opt_onOk, opt_onCancel, opt_onShow) { this.showing_ = true; - // Make all outside nodes unfocusable while the dialog is active. - this.deactivatedNodes_ = this.findFocusableElements_(this.document_); - this.tabIndexes_ = this.deactivatedNodes_.map(function(n) { - return n.getAttribute('tabindex'); - }); - this.deactivatedNodes_.forEach(function(n) { - n.tabIndex = -1; - }); + + // Modal containers manage dialog focus traversal. Otherwise, the focus + // is managed by |this| dialog, by making all outside nodes unfocusable + // while the dialog is shown. + if (!this.hasModalContainer) { + this.deactivatedNodes_ = this.findFocusableElements_(this.document_); + this.tabIndexes_ = this.deactivatedNodes_.map(function(n) { + return n.getAttribute('tabindex'); + }); + this.deactivatedNodes_.forEach(function(n) { + n.tabIndex = -1; + }); + } else { + this.deactivatedNodes_ = []; + } this.previousActiveElement_ = this.document_.activeElement; this.parentNode_.appendChild(this.container); @@ -288,7 +307,8 @@ /** @param {Function=} opt_onHide */ BaseDialog.prototype.hide = function(opt_onHide) { this.showing_ = false; - // Restore focusability. + + // Restore focusability for the non-modal container case. for (let i = 0; i < this.deactivatedNodes_.length; i++) { const node = this.deactivatedNodes_[i]; if (this.tabIndexes_[i] === null) { @@ -301,13 +321,13 @@ this.tabIndexes_ = null; this.container.classList.remove('shown'); + this.container.classList.remove('pulse'); if (this.previousActiveElement_) { this.previousActiveElement_.focus(); } else { this.document_.body.focus(); } - this.frame.classList.remove('pulse'); const self = this; setTimeout(function() {
diff --git a/ui/webui/resources/js/test_loader.js b/ui/webui/resources/js/test_loader.js index dd40a214..54e0dcb 100644 --- a/ui/webui/resources/js/test_loader.js +++ b/ui/webui/resources/js/test_loader.js
@@ -15,11 +15,7 @@ // chrome://test/ data source only exists in a testing context, so using this // script in production will result in a failed network request. -(function() { -const params = new URLSearchParams(window.location.search); -const module = params.get('module'); -const script = document.createElement('script'); -script.type = 'module'; -script.src = `chrome://test/${module}`; -document.body.appendChild(script); -})(); +import {assert} from 'chrome://resources/js/assert.m.js'; +import {loadTestModule} from './test_loader_util.js'; + +assert(loadTestModule());
diff --git a/ui/webui/resources/js/test_loader_util.js b/ui/webui/resources/js/test_loader_util.js new file mode 100644 index 0000000..f3f0423 --- /dev/null +++ b/ui/webui/resources/js/test_loader_util.js
@@ -0,0 +1,17 @@ +// Copyright 2021 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. + +/** @return {boolean} Whether a test module was loaded. */ +export function loadTestModule() { + const params = new URLSearchParams(window.location.search); + const module = params.get('module'); + if (!module) { + return false; + } + const script = document.createElement('script'); + script.type = 'module'; + script.src = `chrome://test/${module}`; + document.body.appendChild(script); + return true; +}
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DarkModeTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DarkModeTest.java index 4058da2..f722ca8f 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DarkModeTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DarkModeTest.java
@@ -44,6 +44,7 @@ @Test @SmallTest + @MinWebLayerVersion(90) public void testDarkModeWithWebThemeDarkening() throws Exception { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); mActivity = mActivityTestRule.launchShell(new Bundle()); @@ -54,6 +55,7 @@ @Test @SmallTest + @MinWebLayerVersion(90) public void testDarkModeWithUserAgentDarkening() throws Exception { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); mActivity = mActivityTestRule.launchShell(new Bundle()); @@ -64,6 +66,7 @@ @Test @SmallTest + @MinWebLayerVersion(90) public void testDarkModeWithPreferWebThemeDarkening() throws Exception { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); mActivity = mActivityTestRule.launchShell(new Bundle()); @@ -74,6 +77,7 @@ @Test @SmallTest + @MinWebLayerVersion(90) public void testLightModeWithWebThemeDarkening() throws Exception { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); mActivity = mActivityTestRule.launchShell(new Bundle()); @@ -84,6 +88,7 @@ @Test @SmallTest + @MinWebLayerVersion(90) public void testLightModeWithUserAgentDarkening() throws Exception { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); mActivity = mActivityTestRule.launchShell(new Bundle()); @@ -94,6 +99,7 @@ @Test @SmallTest + @MinWebLayerVersion(90) public void testLightModeWithPreferWebThemeDarkening() throws Exception { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); mActivity = mActivityTestRule.launchShell(new Bundle());
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/SiteSettingsTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/SiteSettingsTest.java index bb510a6..32b375c 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/SiteSettingsTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/SiteSettingsTest.java
@@ -86,6 +86,25 @@ @DisabledTest(message = "https://crbug.com/1174618") @Test @SmallTest + public void testAdBlockingSiteSettingPageLaunches() throws InterruptedException { + // The setting for ad blocking is below the fold on the main site settings page, and it's + // challenging to scroll to it. Launch directly to the category instead. See the discussion + // on https://chromium-review.googlesource.com/c/chromium/src/+/2673520 for further details. + // Note that this means that this test unfortunately doesn't verify that the Ads setting is + // actually present on the main site settings page. + mSettingsTestRule.launchActivity( + SettingsTestUtils.createIntentForSiteSettingsSingleCategory( + mSettingsTestRule.getContext(), PROFILE_NAME, /*isIncognito=*/false, "ads", + "Ads")); + + onView(withText("Block ads on sites that show intrusive or misleading ads")) + .perform(click()); + + onView(withText("Allowed")).check(matches(isDisplayed())); + } + + @Test + @SmallTest public void testSingleSiteSoundPopupLaunches() throws InterruptedException { mSettingsTestRule.launchActivity(SettingsTestUtils.createIntentForSiteSettingsSingleWebsite( mSettingsTestRule.getContext(), PROFILE_NAME, /*isIncognito=*/false, GOOGLE_URL));
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/settings/WebLayerSiteSettingsDelegate.java b/weblayer/browser/java/org/chromium/weblayer_private/settings/WebLayerSiteSettingsDelegate.java index 84e9b0dc..38083362 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/settings/WebLayerSiteSettingsDelegate.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/settings/WebLayerSiteSettingsDelegate.java
@@ -55,10 +55,10 @@ @Override public boolean isCategoryVisible(@Type int type) { - return type == Type.ALL_SITES || type == Type.AUTOMATIC_DOWNLOADS || type == Type.CAMERA - || type == Type.COOKIES || type == Type.DEVICE_LOCATION || type == Type.JAVASCRIPT - || type == Type.MICROPHONE || type == Type.POPUPS || type == Type.PROTECTED_MEDIA - || type == Type.SOUND || type == Type.USE_STORAGE; + return type == Type.ADS || type == Type.ALL_SITES || type == Type.AUTOMATIC_DOWNLOADS + || type == Type.CAMERA || type == Type.COOKIES || type == Type.DEVICE_LOCATION + || type == Type.JAVASCRIPT || type == Type.MICROPHONE || type == Type.POPUPS + || type == Type.PROTECTED_MEDIA || type == Type.SOUND || type == Type.USE_STORAGE; } @Override
diff --git a/weblayer/public/javatestutil/org/chromium/weblayer/SettingsTestUtils.java b/weblayer/public/javatestutil/org/chromium/weblayer/SettingsTestUtils.java index 946a44a..5426da3f 100644 --- a/weblayer/public/javatestutil/org/chromium/weblayer/SettingsTestUtils.java +++ b/weblayer/public/javatestutil/org/chromium/weblayer/SettingsTestUtils.java
@@ -20,4 +20,12 @@ return SettingsIntentHelper.createIntentForSiteSettingsSingleWebsite( context, profileName, isIncognito, url); } + + // This can be removed if/when we move this into SettingsActivity. Currently no embedders + // need to launch the single category settings UI directly. + public static Intent createIntentForSiteSettingsSingleCategory(Context context, + String profileName, boolean isIncognito, String categoryType, String categoryTitle) { + return SettingsIntentHelper.createIntentForSiteSettingsSingleCategory( + context, profileName, isIncognito, categoryType, categoryTitle); + } }